学科分类
目录
Spring Cloud

Ribbon负载均衡策略

默认情况下,Ribbon使用的负载均衡策略是轮询,实际上,Ribbon提供了很多负载均衡算法,其中IRule接口就是所有负载均衡算法的父接口,它的实现类结构如图1所示。

图1 IRule接口实现类结构

在图1中,AbstractLoadBalancerRule是负载均衡策略的抽象类,该抽象类中定义了负载均衡器ILoaderBalancer对象,该对象能够在具体实现选择服务策略时,获取到一些负载均衡器中维护的信息作为分配依据,并以此设计一些算法来实现针对特定场景的高效策略。
在图1中,各个实现类实现了一种负载均衡算法,关于这些实现类的具体介绍如下:

● RoundRobinRule:实现了按照线性轮询的方式依次选择服务的功能。

● WeightedResponseTimeRule: 它是对RoundRobinRule的扩展,会根据平均响应时间计算所有服务的权重,响应时间越快,服务权重越大,被选中的概率越高。

● ZoneAvoidanceRule:它是PredicateBasedRule的具体实现类,其内部通过使用ZoneAvoidancePredicate和AvailabilityPredicate判断是否选择某个服务,前者用于判断服务所在区域的性能是否可用,后者用于过滤掉连接数过多的服务。

● AvailabilityFilteringRule: 使用AvailabilityPredicate过滤由于多次访问故障而处于断路器跳闸状态的服务,还有并发的连接数超过阀值的服务,然后对剩余的服务列表进行轮询。

● BestAvailableRule:用于先过滤掉多次访问故障而处于断路跳闸状态的服务,然后选择一个并发量最小的服务。

● RetryRule: 该策略实现了一个具备重试功能的服务选择功能,其内部会先按照轮询策略获取服务,如果获取失败则在指定时间内重试,获取可用服务。

● RandomRule:该策略实现了从服务清单中随机选择一个服务的功能。

● ClientConfigEnableRoundRobinRule:该类是一个抽象类,该类本身没有实现什么特殊的处理逻辑,我们也不会直接使用该策略,但是通过BestAvailableRule和继承该策略默认实现了线性轮询,它的内部定义了一个RoundRobinRule策略,

● PredicateBasedRule:继承了ClientConfigEnableRoundRobinRule,其内部会先通过chooseRoundRobinAfterFiltering()方法筛选服务清单,然后以线性轮询的方式从过滤后的服务清单中选择一个服务。

点击此处
隐藏目录