Ribbon是Spring Cloud 中作为负载均衡器的组件, 接着上一篇的文章(Spring Cloud 中FeignClient的源码解析)[https://www.jianshu.com/p/7d5cb571e9e8]的介绍,因为Feign底层集成Ribbon做的Http的负载均衡。
这里会ClientName创建LoadBalance的客户端,然后执行executeWithLoadBalance方法,调用客户端的负载均衡算法并执行Http请求的调用。此处是是用Rxjava中的回调的方式。
接下来主要看下submit方法中,selectServer方法是选择哪个Server的,这里就是实现负载均衡的地方,
这里selectServer主要是从LoadBalanceContext中返回最终选取的Sever。然后执行后面的Http调用和结果的处理。
如果负载均衡器存在,则调用chooseServer方法,通过配置策略选择一个Server。
DynamicServerListLoadBalancer会调用父类的BaseLoadBalancer的chooseServer方法,通过rule实例来调用choose来选择最终的Server实例。
上面rule的实例,其实默认是RoundRobinRule,也就是轮询策略,也就是说Feign默认loadbalance策略是轮询。
其实Spring Cloud中IRule的实现类有一下9种。
负载均衡的策略实现
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中调用流程进行一次梳理,同时对负载均衡算法做了大致的了解。写的还不是很详细,欢迎多多交流。