LB,即负载均衡(Load Balance),在微服务或分布式集群中经常用的一种应用。分为:集中式LB、进程内LB。Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址,因此 Ribbon采用的是客户端的负载均衡。

1.简单轮询负载均衡(RoundRobinRule)

        采用的是i++的方式,循环访问下一个Server。开启一个计数器count,在while循环中遍历服务清单,获取清单之前先通过incrementAndGetModulo方法获取一个下标,这个下标是一个不断自增长的数先加1然后和服务清单总数取模之后获取到的(所以这个下标从来不会越界),拿着下标再去服务清单列表中取服务,每次循环计数器都会加1,如果连续10次都没有取到服务,则会报一个警告No available alive servers after 10 tries from load balancer: XXXX

2.加权响应时间负载均衡 (WeightedResponseTimeRule)

        在每次访问后给出权值,响应时间越短权值越大,反之响应时间越长权值越小。每30秒计算一次服务器响应时间,再根据权值来决定下次访问使用哪个Server。当刚程序开始运行,没有形成statas时,使用RoundRobin策略选择server。

3.随机负载均衡 (RandomRule)

        随机选择一个server

4.区域感知轮询负载均衡(ZoneAvoidanceRule)

        复合判断server所在区域的性能和server的可用性选择server,使用ZoneAvoidancePredicate和AvailabilityPredicate来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate用于过滤掉连接数过多的Server。ZoneAvoidanceRule是PredicateBasedRule的一个实现类,只不过这里多一个过滤条件,ZoneAvoidanceRule中的过滤条件是以ZoneAvoidancePredicate为主过滤条件和以AvailabilityPredicate为次过滤条件组成的一个叫做CompositePredicate的组合过滤条件,过滤成功之后,继续采用线性轮询的方式从过滤结果中选择一个出来。

5.选择一个最小的并发(BestAvailableRule)

        选择一个最小的并发请求的server。逐个考察Server,如果Server被tripped了,则忽略,在选择其中ActiveRequestsCount最小的server。BestAvailableRule继承自ClientConfigEnabledRoundRobinRule,它在ClientConfigEnabledRoundRobinRule的基础上主要增加了根据loadBalancerStats中保存的服务实例的状态信息来过滤掉失效的服务实例的功能,然后顺便找出并发请求最小的服务实例来使用。然而loadBalancerStats有可能为null,如果loadBalancerStats为null,则BestAvailableRule将采用它的父类即ClientConfigEnabledRoundRobinRule的服务选取策略(线性轮询)。

6.过滤失败连接(AvailabilityFilteringRule)

        过滤掉那些因为一直连接失败的被标记为circuit tripped的后端server,并过滤掉那些高并发的的后端server(active connections 超过配置的阈值)。使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个server的运行状态

7.重试功能(RetryRule)

        首先RetryRule中又定义了一个subRule,它的实现类是RoundRobinRule,然后在RetryRule的choose(ILoadBalancer lb, Object key)方法中,每次还是采用RoundRobinRule中的choose规则来选择一个服务实例,如果选到的实例正常就返回,如果选择的服务实例为null或者已经失效,则在失效时间deadline之前不断的进行重试(重试时获取服务的策略还是RoundRobinRule中定义的策略),如果超过了deadline还是没取到则会返回一个null。

8.过滤服务(PredicateBasedRule)

        PredicateBasedRule是ClientConfigEnabledRoundRobinRule的一个子类,它先通过内部定义的一个过滤器过滤出一部分服务实例清单,然后再采用线性轮询的方式从过滤出来的结果中选取一个服务实例。