1.LoadBalancerClient应用
LoadBalancerClient对象可以从nacos中基于服务名获取服务实例,然后在工程中基于特点算法实现负载均衡方式的调用
第一步:在ConsumerController类中注入LoadBalancerClient对象
ServiceInstance接口,获取LoadBalancerClient从nacos获取的入伍实例的ip和port,然后通过RestTemplate对象实现远端服务调用
忽略@Value
@Autowired
private LoadBalancerClient loadBalancerClient;
@Value("${spring.application.name:8090}")
private String appName;
@GetMapping("/consumer/doRestEcho02")
public String doRestEcho02(){
ServiceInstance serviceInstance = loadBalancerClient.choose("sca-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);
}
}
第二步:设置idea启动配置,修改并发运行选项 Allow parallel run ,修改端口号运行
在nacos中检查服务列表,在浏览器刷新访问
2. LoadBalanced 注解
当使用RestTemplate进行远程服务调用时,假如需要负载均衡,还可以在RestTemplate对象构建时,使用@LoadBalanced对构建RestTemplate的方法进行修饰
第一步:修改Consumer启动类,添加注解@LoadBalanced
@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){
return new RestTemplate();
}
第二步:在需要RestTemplate实现负载均衡调用的地方进行依赖注入,接下来,可以在对应的服务端调用方的方法内,基于RestTemplate借助服务名进行服务调用
@Autowired
private RestTemplate loadBalancedRestTemplate;
@GetMapping("/consumer/doRestEcho3")
public String doRestRecho3(){
//在这里调用sca-provider
String serviceId="sca-provider";
String url=String.format("http://%s/provider/echo/{msg}",serviceId);
//当在这里进行远程服务调用(RPC)时,底层会在这个请求进行拦截,
// 然后基于LoadBalanceClient对象通过服务名获取具体的服务实例(ServiceInstance)
return loadBalancedRestTemplate.getForObject(url,String.class,serverPort);
}
RestTemplate在发送请求的时候会被LoadBalancerInterceptor拦截,它的作用就是用于RestTemplate的负载均衡,LoadBalancerInterceptor将负载均衡的核心逻辑交给了loadBalancer
public ClientHttpResponse intercept(final HttpRequest request,
final byte[] body, final ClientHttpRequestExecution execution) throws IOException {
final URI originalUri = request.getURI();
String serviceName = originalUri.getHost();
return this.loadBalancer.execute(serviceName,
requestFactory.createRequest(request, body, execution));
}
@LoadBalanced注解 时属于Spring的,而不是Ribbon,Spring在初始化容器的时候,如果监测到Bean被@LoadBalanced注解 ,Spring会为其设置LoadBalancerInterceptor的拦截器