乐趣区

关于springcloud:Spring-Cloud-Ribbon-中的-7-种负载均衡策略

负载平衡通器常有两种实现伎俩,一种是服务端负载均衡器,另一种是客户端负载均衡器,而咱们明天的配角 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

退出移动版