@LoadBalanced源码剖析
在RestTemplate实例上添加了一个@LoadBalanced注解,就可以实现负载均衡,很神奇,我们接下来分析这个注解背后的操作(负载均衡过程)
直接点击进来查看@LoadBalanced注解,那这个注解是在哪里被识别到的呢?
老规矩:SpringCloud充分利用了SpringBoot的自动装配特点,找spring.factories配置文件
先看LoadBalancerAutoConfiguration类
1、先把所有添加有@LoadBalanced都放到一个集合中
2、创建一个RestTemplateCustomizer容器,然后再容器里面添加loadBalancerInterceptor拦截器
3、把取到的对象都放到容器里面,调用时候会被拦截器拦截。
4、拦截器取出uri和端口等信息,交给LoadBalancerClient执行调用远程请求
再看LoadBalancerClient类(再此回到图中的RibbonAutoConfiguration类中)
1、LoadBalancerClient有返回一个RibbonLoadBalancerClient对象,
2、对象里面有一个execute方法,方法用于,获取实例信息列表,选择一个策略,执行策略
3、那么实例信息列表如何产生:(再此回到图中的RibbonAutoConfiguration类中)
通过SpringClientFactory类,可以其构造函数中看到调用RibbonClientConfiguration,其类中有对IRule、IPing、ServerList、ILoadBalancer等, 里面是如果是有配置的用配置的策略,没有就用默认 ZoneAvoidanceRule 策略。 (这些实例的产生,所以2中才能获取得到)
4、如何选择一个策略 : 回到2中,最终调用incrementAndGetModulo来 轮询,(先选定区域,后轮询)
5、执行时候,是通过apply调用,
那么其中的serverlist什么时候产生的
1、看到刚刚的3中的有ServerList ,里面有一个ribbonLoadBalancer方法,传入了一个空的ServerList ,
一路进入restOfInit(核心),enableAndInitLearnNewServersFeature来创建服务,里面有一个start方法,里面就有updateAction,用于对缓存的刷新,start方法就是一个定时器scheduledFuture,在一定时间才会去低调用updateAction方法,同时也定义了一个立刻刷缓存的updateListOfServers()。
分析策略算法(直接进入到这个类里面看即可)