0
点赞
收藏
分享

微信扫一扫

Nacos-服务负载均衡设计与实现

九点韶留学 2022-01-20 阅读 62

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的拦截器

 

举报

相关推荐

0 条评论