负载平衡通器常有两种实现伎俩,一种是服务端负载均衡器,另一种是客户端负载均衡器,而咱们明天的配角 Ribbon 就属于后者——客户端负载均衡器。
服务端负载均衡器的问题是,它提供了更强的流量控制权,但无奈满足不同的消费者心愿应用不同负载平衡策略的需要,而应用不同负载平衡策略的场景的确是存在的,所以客户端负载平衡就提供了这种灵活性。 然而客户端负载平衡也有其毛病,如果配置不当,可能会导致服务提供者呈现热点,或者压根就拿不到任何服务的状况,所以咱们本文就来理解一下这 7 种内置负载平衡策略的具体规定。
Ribbon 介绍
Ribbon 是 Spring Cloud 技术栈中十分重要的根底框架,它为 Spring Cloud 提供了负载平衡的能力,比方 Fegin 和 OpenFegin 都是基于 Ribbon 实现的,就连 Nacos 中的负载平衡也应用了 Ribbon 框架。
Ribbon 框架的弱小之处在于,它不仅内置了 7 种负载平衡策略,同时还反对用户自定义负载平衡策略,所以其开放性和便利性也是它得以风行的次要起因。
服务端负载均衡器和客户端负载均衡器的区别如下图所示:
客户端负载均衡器的实现原理是通过注册核心,如 Nacos,将可用的服务列表拉取到本地(客户端),再通过客户端负载均衡器(设置的负载平衡策略)获取到某个服务器的具体 ip 和端口,而后再通过 Http 框架申请服务并失去后果,其执行流程如下图所示:
负载平衡设置
以 Nacos 中的 Ribbon 负载平衡设置为例,在配置文件 application.yml 中设置如下配置即可:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #设置负载平衡策略
因为 Nacos 中曾经内置了 Ribbon,所以在理论我的项目开发中无需再增加 Ribbon 依赖了,这一点咱们在 Nacos 的依赖树中就能够看到,如下图所示:
Ribbon 默认的负载平衡策略是轮询模式,咱们配置 3 个服务提供者的执行后果如下图所示:
而后,咱们再将 Ribbon 负载平衡策略设置为随机模式,配置内容如下:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置随机负载平衡
重启客户端,执行后果如下图所示:
7 种负载平衡策略
1. 轮询策略
轮询策略:RoundRobinRule,依照肯定的程序顺次调用服务实例。比方一共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务 3,顺次类推。
此策略的配置设置如下:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #设置负载平衡
2. 权重策略
权重策略:WeightedResponseTimeRule,依据每个服务提供者的响应工夫调配一个权重,响应工夫越长,权重越小,被选中的可能性也就越低。
它的实现原理是,刚开始应用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的均匀响应工夫,而后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。
此策略的配置设置如下:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
3. 随机策略
随机策略:RandomRule,从服务提供者的列表中随机抉择一个服务实例。
此策略的配置设置如下:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载平衡
4. 最小连接数策略
最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有雷同的最小连接数,那么会调用轮询策略进行选取。
此策略的配置设置如下:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #设置负载平衡
5. 重试策略
重试策略:RetryRule,依照轮询策略来获取服务,如果获取的服务实例为 null 或曾经生效,则在指定的工夫之内一直地进行重试来获取服务,如果超过指定工夫仍然没获取到服务实例则返回 null。
此策略的配置设置如下:
ribbon:
ConnectTimeout: 2000 # 申请连贯的超时工夫
ReadTimeout: 5000 # 申请解决的超时工夫
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载平衡
6. 可用性敏感策略
可用敏感性策略:AvailabilityFilteringRule,先过滤掉非衰弱的服务实例,而后再抉择连接数较小的服务实例。
此策略的配置设置如下:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule
7. 区域敏感策略
区域敏感策略:ZoneAvoidanceRule,依据服务所在区域(zone)的性能和服务的可用性来抉择服务实例,在没有区域的环境下,该策略和轮询策略相似。
此策略的配置设置如下:
springcloud-nacos-provider: # nacos 中的服务 id
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule
我的项目源码
https://gitee.com/mydb/spring-cloud-alibaba-example
总结
Ribbon 为客户端负载均衡器,相比于服务端负载均衡器的对立负载平衡策略来说,它提供了更多的灵活性。Ribbon 内置了 7 种负载平衡策略:轮询策略、权重策略、随机策略、最小连接数策略、重试策略、可用性敏感策略、区域性敏感策略,并且用户能够通过继承 RoundRibbonRule 来实现自定义负载平衡策略。
是非审之于己,毁誉听之于人,得失安之于数。
公众号:Java 中文社群
Java 面试合集:https://gitee.com/mydb/interview