Spring Cloud Ribbon的源码解析

         Ribbon是Spring Cloud 中作为负载均衡器的组件, 接着上一篇的文章(Spring Cloud 中FeignClient的源码解析)[https://www.jianshu.com/p/7d5cb571e9e8]的介绍,因为Feign底层集成Ribbon做的Http的负载均衡。   

LoadBalancerFeignClient#execute

       这里会ClientName创建LoadBalance的客户端,然后执行executeWithLoadBalance方法,调用客户端的负载均衡算法并执行Http请求的调用。此处是是用Rxjava中的回调的方式。

AbstractLoadBalancerAwareClient#executeWithLoadBalancer

      接下来主要看下submit方法中,selectServer方法是选择哪个Server的,这里就是实现负载均衡的地方,

LoadBalancerCommand#submit方法

       这里selectServer主要是从LoadBalanceContext中返回最终选取的Sever。然后执行后面的Http调用和结果的处理。

LoadBalancerCommand#selectServer

      如果负载均衡器存在,则调用chooseServer方法,通过配置策略选择一个Server。

LoadBalancerContext#getServerFromLoadBalancer

      DynamicServerListLoadBalancer会调用父类的BaseLoadBalancer的chooseServer方法,通过rule实例来调用choose来选择最终的Server实例。

LoadBalancerContext#chooseServer

        上面rule的实例,其实默认是RoundRobinRule,也就是轮询策略,也就是说Feign默认loadbalance策略是轮询。

LoadBalancerContext#IRule

      其实Spring Cloud中IRule的实现类有一下9种。

IRule类

负载均衡的策略实现

1、随机规则(RandomRule)

     在rule的choose的时候 使用一个所有服务列表中取随机数去可用服务(upList)中取可用的服务,如果取到的服务不可用或者无此服务。

2、线性轮训规则(RoundRobinRule)

      线性轮询和RandomRule相似,循环条件以外增加了10次的轮询限制,如果10次没有获取到可用的服务,则返回 No available alive serivces after 10 tries  from load balancer.....

3、重试规则(RetryRule)

        RetryRule增加了一个重试机制,此机制默认使用 RoundRobinRule规则来获取服务,通知定义了一个重试时间(maxRetryMillis),如果在重试时间内没有获取到可用的服务,则重复进行获取,如果超出重试时间还未获取到则返回null。

4、WeightedResponseTimeRule(反馈权重规则)

        该策略主要是对RoundRobinRule规则的扩展,根据实例的运行情况计算权重,并根据权重来选择实例,以达到最优的分配效果

5、ClientConfigEnableRoundRobinRule

          内部使用RoundRobinRule规则来实现策略,但是经常继承这个类来实现高级策略的制定

6、BestAvailableRule(选择最优的服务)

          继承了CIientConfigEnableRoundRobinRule规则,在实现时注入了负载均衡器的统计对象LoadBalacneStats ,同时在选择实例的时候利用LoadBalaceStats来统计信息来来选择满足要求的实例

  7、PredicateBasedRule(基于预先判断的测试)

      这是一种过滤清单的一种策略,在选择服务的时候先将获取到的服务清单通过Predicate配置的过滤条件来过滤一部分服务,然后再通过线性轮训的方式来进行服务选择。

8  AvailabilityFilteringRule(可用性过滤的规则)

       这是可用性过滤的策略,就是在选择的时候,过滤所有的Server都是可以服务正常的Server。

9 ZoneAvoidanceRule 

      域的过滤器,这个其实是ZoneAvoidancePredicate和AvailabilityPredicate的组合过滤器,同时过滤所在的域和可用性的过滤器。

总结:

       今天主要对于Spring Cloud的LoadBalace中在Feign中调用流程进行一次梳理,同时对负载均衡算法做了大致的了解。写的还不是很详细,欢迎多多交流。

你可能感兴趣的:(Spring Cloud Ribbon的源码解析)