1.RandomRule:
获取所有服务实例列表,循环通过一个随机数作为索引返回服务实例,直到返回一个不为空的服务实例。
2.RoundRobinRule:
采用线性轮询机制循环依次选择每个服务实例,直到选择到一个不为空的服务实例或循环次数达到10次。
3.RetryRule:
采用RoundRobinRule的选择机制,进行反复尝试,当花费时间超过设置的阈值maxRetryMills时,就返回null。
4.WeightedResponseTimeRule:
是RoundRobinRule的子类,对其进行了扩展,通过启动一个定时任务来为每个服务实例计算权重,然后遍历权重列表选择服务实例。
5.ClientConfigEnabledRoundRobinRule:
其内部实现了一个RoundRobinRule策略,我们可以继承它,在子类中做一些高级策略,当这些高级策略无法实施,可以用其默认实现的RoundRobinRule策略作为备选。
6.BestAvailableRule:
ClientConfigEnabledRoundRobinRule的子类,注入了负载均衡器的统计对象LoadBalancerStats,并利用它保存的实例统计信息来选择满足要求的实例。它会过滤掉故障的实例,并找出并发请求书最小的一个最空闲的实例。当LoadBalancerStats为空时无法执行,会利用ClientConfigEnabledRoundRobinRule的特性,采用默认实现的RoundRobinRule策略。
7.PredicateBasedRule:
ClientConfigEnabledRoundRobinRule的子类,基于Predicate实现的策略。通AbstractServerPredicate的chooseRoundRobinAfterFiltering方法进行过滤,获取备选的服务实例清单,然后用线性轮询选择一个实例,是一个抽象类,过滤策略在AbstractServerPredicate的子类中具体实现。
8.AvailabilityFilteringRule:
PredicateBasedRule的子类,原理与PredicateBasedRule相同,过滤规则:实例是否故障,即断路器是否生效,已将实例断开;实例的并发请求数是否大于阈值。只要有一个满足,就将这个实例过滤掉。其与父类的差别是:先以线性的方式选择一个实例,然后用过滤规则过滤,如果没被过滤掉则直接使用该实例,否则选取下一个实例继续进行过滤。如果重复十次还未选择到实例则采取父类的策略。
9.ZoneAvoidanceRule:
PredicateBasedRule的子类,原理与PredicateBasedRule相同,过滤规则:以ZoneAvoidancePredicate为主条件,AvailabilityFilteringPredicate为次条件组合进行过滤。使用主过滤条件过滤所有实例并返回清单,依次使用次过滤条件对清单进行过滤,每次过滤后判断两个条件,两个都符合就不再过滤:过滤后的实例总数 >= 最小过滤实例数(默认为1);过滤后的实例比例 > 最小过滤百分比(默认为0)。
以上各策略的结构如下图所示:
其中IRule为负载均衡策略的总接口,声明了choose、setLoadBalancer、getLoadBalancer。AbstractLoadBalancerRule继承IRule,为负载均衡策略的抽象类,定义了ILoadBalancer负载均衡器,实现了IRule接口中的setLoadBalancer和getLoadBalancer方法,即ILoadBalancer的get,set方法,上边9种负载均衡策略都是其子类,在其基础上进行扩展。