不要问我昨天为啥没学习,因为舍友前天捣鼓到1点多。。。精神不集中,早上源码看的云里雾里,现在晚上补上,今天还和同事吵了一架。。。咦尴尬。。
1、客户端负载均衡源码分析
这段源码很重要,可以说是ribbon的核心所在,所以在前几章学习的基础之上,一定要对于ribbon的客户端在微服务中角色定位理解透彻。同时要建立springcloud的负载均衡实现于ribbon之上。
要理解客户端的负载均衡是如何实现的必须理解@RestTemplate的作用以及@LoadBalanced这两个注解的含义,@RestTemplate前章已经分析过,这节主要从@LoadBalanced注解的源码开始深层剖析:
@LoadBalanced的主要作用是用来给@RestTemplate做标记,以免让负载均衡的客户端来配置管理它。
上述的话对于入门理解负载均衡很重要,意思就是只有配置了@LoadBalanced的@RestTemplate才能让ribbon去负载均衡它。
>-------------------------------------------------LoadBalancedClient源码分析:
通过搜索LoadBalancerClient可以发现,这是 springCloud提供的接口
通过其中定义的抽象方法来了解客户端负载均衡器中应该具备的能力:
- ServiceInstance choose(String serviceId):根据传入的服务名serviceId,从负载均衡器中挑选一个对应服务的实例。
- T execute(String serviceId,LoadBalancerRequest request)throws Exception :使用负载均衡器中挑选出的服务实例来知行请求内容
- Uri reconstructUri(ServiceInstance instance,Uri original):为系统构建一个合适的host:post形式的uri。
从上述三个接口看,ribbon的客户端负载均衡对于代码的封装,接口的隐蔽做的很好,很清晰,从上述三个方法一眼可以让阅读代码的各位看出其作用。
1、用来从服务列表挑选负载均衡合适的服务2、用来返回服务执行的内容3、用来组装一个完整的url
>>-----------------------------------------------------对于LoadBalanceClient包进行整理(org.springframework.cloud.client.loadbalancer)整理:
查看源码可以看出自动负载均衡配置类:LoadBalancerAutoConfiguration:
由类上的注解可知,ribbon实现的负载均衡自动化配置需要满足两个条件:
@ConditionalOnClass(RestTemplate.class):在当前的工程环境下,必须存在RestTemplate类
@ConditionalOnBean(LoadBalanceClient.class):在spring的bean工程中必须LoadBalanceClient实现的bean
而由源码可知在该源码中主要做了三件事:
- 创建一个LoadBalancerInterceptor的Bean,用于对客户端发起请求时进行拦截
- 创建一个RestTemplateCustomizer的Bean,用来给RestTemplate增加LoadBalancerInterceptor拦截器
- 维护一个被@LoadBalanced注解修饰的RestTemplate对象列表,并且在这里初始化,并且调用RestTemplateCustomizer进行加载拦截器
>>>-------------------------------------------------------LoadBalancerInterceptor源码分析:
由于上文中多次提到拦截器LoadBalanceInterceptor拦截器,所以下文来分析一下拦截器的源码:
可以看到当被@LoadBalanced注解的请求去请求服务时,拦截器内部方法intercept函数所拦截。