IRule & IPing
ILoadBalancer IRule IPing
负载均衡默认Server选择逻辑
Server选择:Ribbon 初始化过程中,默认的 IRule 为 ZoneAvoidanceRule(依次轮询)。
Ribbon实际执行http请求逻辑
RibbonLoadBalancerClient.execute() 中request.apply()会做一个serverName的替换逻辑。最后到RibbonLoadBalancerClient.reconstructURI(),这个方法是把请求自带的getURI方法给替换了,我们最后查看context.reconstructURIWithServer() 方法,这里面会拼接对应的请求URL。
Ribbon中ping机制原理
默认的IPing实现类为:NIWSDiscoveryPing。获取DiscoveryEnabledServer对应的注册信息是否为UP状态,查看isAlive()调用即可以找到调度的地方,在BaseLoadBalancer构造函数中调用setupPingTask()方法进行调度。pingIntervalSeconds在BaseLoadBalancer中定义的是10s,但是在initWithConfig()方法中。。
Ribbon中其他IRule负载算法初探
RoundRobinRule 系统内置的默认负载均衡规范,直接round robin轮询,从一堆serverList中,不断的轮询选择出来一个server,每个server平摊到的这个请求,按照顺序轮询。
AvailabilityFilteringRule 这个rule就是会考察服务器的可用性。如果3次连接失败,就会等待30秒后再次访问;如果不断失败,那么等待时间会不断变长,如果某个服务器的并发请求太高了,那么会绕过去,不再访问。这里先用Round Robin算法,轮询依次选择一台server,如果判断这个server是存活的可用的,如果这台server是不可以访问的,那么就用round robin算法再次选择下一台server,依次循环往复,10次。
WeightedResponseTimeRule 带着权重的,每个服务器可以有权重,权重越高优先访问,如果某个服务器响应时间比较长,那么权重就会降低,减少访问。
ZoneAvoidanceRule 根据机房和服务器来进行负载均衡,spring cloud ribbon环境中的默认的Rule。
BestAvailableRule 忽略那些请求失败的服务器,然后尽量找并发比较低的服务器来请求 。
Ribbon注册表拉取及更新逻辑这里也梳理下,这里如果Ribbon保存的注册表信息有宕机的情况,这里最多4分钟才能感知到,所以spring cloud出现服务熔断。