1.导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
2.修改yml文件夹
server:
port: 8090
spring:
application:
name: mu-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 #从哪里去查找服务
3.创建消费服务
@SpringBootApplication
public class ConsumerApp {
public static void main(String[] args) {
SpringApplication.run(ConsumerApp.class, args);
}
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}//将RestTemplate对象交给spring容器管理,这样可以让在使用时new只会被调用一次
@RestController
public class ConsumerController{
@Value("${spring.application.name:mu}")
private String appName;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01(){
String url = "http://localhost:8081/provider/echo/"+appName;
return restTemplate.getForObject(url, String.class);
}
}
}
4.启动消费者服务,并在浏览器输入http://localhost:8090/consumer/doRestEcho1地址进行访问,假如访问成功会出现,如图所示效果:
1.修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法,然后进行服务访问.
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/consumer/doRestEcho02")
public String doRestEcho02(){
ServiceInstance serviceInstance = loadBalancerClient.choose("mu-provider");
String url = String.format("http://%s:%s/provider/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request url:"+url);
return restTemplate.getForObject(url, String.class);
}
}
2.修改provider中yml文件的端口号,开启多个provider服务,模拟负载均衡如果开启成功则
3.反复访问
http://localhost:8090/consumer/doRestEcho02
这里多个实例并发提供服务的方式为负载均衡,这里的负载均衡实现默认是因为Nacos集成了Ribbon来实现的,Ribbon配合RestTemplate,可以非常容易的实现服务之间的访问。Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。
当使用RestTemplate进行远程服务调用时,假如需要负载均衡,可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰,例如在ConsumerApplication中构建RestTemplate对象:
@Bean
@LoadBalanced
public RestTemplate restTemplateloadBalancerClient(){
return new RestTemplate();
}
在需要RestTemplate实现负载均衡调用的地方进行依赖注入.例如在ConsumerController类中添加restTemplateloadBalancerClient属性
@Autowired
private RestTemplate restTemplateloadBalancerClient;
可以在对应服务端调用方的方法内,基于RestTemplate借助服务器名进行调用
@Autowired
private RestTemplate restTemplateloadBalancerClient;
@GetMapping("/consumer/doRestEch03")
public String doRestEcho03(){
String url=String.format("http://%s/provider/echo/%s","mu-provider",appName);
//向服务提供方发起http请求,获取响应数据
return restTemplateloadBalancerClient.getForObject(
url,//要请求的服务的地址
String.class);//String.class为请求服务的响应结果类型
}
@LoadBalanced注解是属于Spring,而不是Ribbon的,Spring在初始化容器的时候,如果检测到Bean被@LoadBalanced注解,Spring会为其设置LoadBalancerInterceptor的拦截器。
小节面试分析