我们知道spring cloud中restTemplate可以通过服务名调接口,加入@loadBalanced标签就实现了负载均衡的功能,那么spring cloud内部是如何实现的呢?
通过@loadBalanced我们进入标签
注释解释这个标签是标记为restTemplate,作为loadBalancerClient,接着去看loadBalancerClient
loadBalancerClient通过继承serviceInstanceChooser,主要包含以下几个抽象方法:
1、choose抽象方法,作用是通过serviceId获取到服务实例;
2、execute方法是执行请求;
3、reconstructURI方法是通过服务实例转换成ip:port的形式
通过loadBalancerClient所在包,我们发现LoadBalancerAutoConfiguration为自动配置类,该类主要作用:
1、创建LoadBalancerInterceptor拦截器
2、创建restTemplateCustomizer,用于增加拦截器
接着,我们看LoadBalancerInterceptor拦截器
通过这里我们可以看出,当一个restTemplate被@loadBalance标签注释时,调用请求的时候会被拦截,通过获取请求中的服务名,传入loadBalancer的执行方法,我们点击这个execute进入RibbonLoadBalancerClient的具体实现
可以看出通过传入的serverId获取server,进入ILoadBalancer可以看到这几个抽象方法
可以看到server类中有host和port,chooseServer有以下几个实现类
通过RibbonClientConfiguration,可以知道使用zoneAwareLoadBalancer来实现负载均衡
通过chooseServer获取到server后,下面,我们再回到RibbonLoadBalancerClient
可以看出通过request的apply发送实际的请求,从而实现从服务名变成host:port的请求转变
原文地址:https://www.cnblogs.com/sgx2019/p/10590367.html