上节回顾:
通过Ribbon集成之后,RestTemplate做了什么事情?RestTemplate本身是一个HTTP客户端,让我们更加简化的完成HTTP请求,但是因为集成Ribbon后需要对请求实现负载均衡,所以在RestTemplate真正发起HTTP请求之前做了一个拦截,这个拦截就是LoadBalancerInterceptor完成的,它的最终实现是RibbonLoadBlancerClient去进行拦截和处理,在拦截过程中分析了几个阶段,第一个阶段是初始化阶段,怎么对加了LoadBalancer的注解RestTemplate进行拦截,通过讲解了自动装配过程,讲到LoadBalancerAutoConfiguration自动装配类,这个装配类里边是嵌套的Bean的依赖,下图的顺序就是bean的初始化的过程。通过这个一个过程对RestTemplate加了一个拦截,就可以使用负载均衡处理。
负载均衡规则:
RoundRobbinRule:默认的轮询规则
WeightedResponseTimeRule:通过服务平均的响应时间,给每一个服务一个权重,响应时间越长,权重越小,开始统计信息不足,应用轮序策略。
RandonRule:随机获取一个服务
RetryRule:先按照轮询策略获取服务如果获取服务失败则在指定时间内会重试,获取可用的服务。
allServerList和upServerList,服务器端提供地址列表在客户端内存中的缓存
调用规则
1,我们构建ZoneAwareLoadBalancer的其父类方法DynamicServerListLoadBalancer中的构造方法会执行,会调用this.restOfInit(clientConfig);
2,restOfInit中有两个重要的方法,enableAndInitLearnNewServersFeature和updateListOfServers;
3,enableAndInitLearnNewServersFeature调用,总体思想是用定时器scheduled通过updateListOfServers()来更新Eurake实例列表,enableAndInitLearnNewServersFeature中this.serverListUpdater.start(this.updateAction)默认每30s执行一次更新本地服务器列表,run中定时器,updateAction中调用了updateListOfServers方法。
serverListUpdater.start是在RibbonClientConfiguration中初始化的。
4,updateListOfServers调用serverListImpl.getUpdatedListOfServers()来更新服务器列表,getUpdatedListOfServers可以有多个实现,可以从本地配置文件获取,也可以从Eurake列表获取;
5,updateListOfServers中调用updateAllServerList,updateAllServerList调用setServersList,setServersList调用父类BaseLoadBalancersetServersList方法,更新BaseLoadBalancer中allserverList和upserverList列表
6,ping确认存活策略,DynamicServerListLoadBalancer的父类BaseLoadBalancer的构造方法中会设置this.initWithConfig();,this.initWithConfig会调用
this.setPingInterval(pingIntervalTime)不断去检查,将无法连接的节点去除掉。定时器也是通过scheduled。