作者 | 磊哥

来源 | Java中文社群(ID:javacn666)

转载请联系授权(微信ID:GG_Stone)

负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 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中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #设置负载均衡策略

因为 Nacos 中已经内置了 Ribbon,所以在实际项目开发中无需再添加 Ribbon 依赖了,这一点我们在 Nacos 的依赖树中就可以看到,如下图所示:Ribbon 默认的负载均衡策略是轮询模式,我们配置 3 个服务提供者的执行结果如下图所示:然后,我们再将 Ribbon 负载均衡策略设置为随机模式,配置内容如下:

springcloud-nacos-provider: # nacos中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置随机负载均衡

重启客户端,执行结果如下图所示:

7种负载均衡策略

1.轮询策略

轮询策略:RoundRobinRule,按照一定的顺序依次调用服务实例。比如一共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务3,依次类推。此策略的配置设置如下:

springcloud-nacos-provider: # nacos中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RoundRobinRule #设置负载均衡

2.权重策略

权重策略:WeightedResponseTimeRule,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。此策略的配置设置如下:

springcloud-nacos-provider: # nacos中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

3.随机策略

随机策略:RandomRule,从服务提供者的列表中随机选择一个服务实例。此策略的配置设置如下:

springcloud-nacos-provider: # nacos中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载均衡

4.最小连接数策略

最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。此策略的配置设置如下:

springcloud-nacos-provider: # nacos中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule #设置负载均衡

5.重试策略

重试策略:RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。此策略的配置设置如下:

ribbon:ConnectTimeout: 2000 # 请求连接的超时时间ReadTimeout: 5000 # 请求处理的超时时间
springcloud-nacos-provider: # nacos 中的服务 idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #设置负载均衡

6.可用性敏感策略

可用敏感性策略:AvailabilityFilteringRule,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。此策略的配置设置如下:

springcloud-nacos-provider: # nacos中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.AvailabilityFilteringRule

7.区域敏感策略

区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。此策略的配置设置如下:

springcloud-nacos-provider: # nacos中的服务idribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.ZoneAvoidanceRule

项目源码

https://gitee.com/mydb/spring-cloud-alibaba-example

总结

Ribbon 为客户端负载均衡器,相比于服务端负载均衡器的统一负载均衡策略来说,它提供了更多的灵活性。Ribbon 内置了 7 种负载均衡策略:轮询策略、权重策略、随机策略、最小连接数策略、重试策略、可用性敏感策略、区域性敏感策略,并且用户可以通过继承 RoundRibbonRule 来实现自定义负载均衡策略。

是非审之于己,毁誉听之于人,得失安之于数。

公众号:Java中文社群

Java面试合集:https://gitee.com/mydb/interview

往期推荐

SpringCloud Nacos + Ribbon 调用服务的 2 种方法!

Spring Cloud Alibaba Nacos 的 2 种健康检查机制!

芭比扣了!Nacos中服务删除不了,肿么办?

SpringCloud Ribbon中的7种负载均衡策略!相关推荐

  1. Spring Cloud Ribbon 中的 7 种负载均衡策略

    负载均衡通器常有两种实现手段,一种是服务端负载均衡器,另一种是客户端负载均衡器,而我们今天的主角 Ribbon 就属于后者--客户端负载均衡器. 服务端负载均衡器的问题是,它提供了更强的流量控制权,但 ...

  2. 2 万字长文盘点五种负载均衡策略

    作者 | why技术 来源 |  why技术 责编 | 王晓曼 荒腔走板 老规矩,在技术分享开始之前,先荒腔走板,聊点别的.给枯燥的技术文章注入一抹其它的色彩. 上面的图片,是我在骑车的过程中拍的.衣 ...

  3. 2万字长文盘点五种负载均衡策略

    来源:why公众号 荒腔走板 老规矩,在技术分享开始之前,先荒腔走板,聊点别的.给枯燥的技术文章注入一抹其它的色彩. 上面的图片,是我在骑车的过程中拍的.衣服随意的绑在驼包上,两侧各挂着一只鞋子,左边 ...

  4. 经过负载均衡图片加载不出来_吐血输出:2万字长文带你细细盘点五种负载均衡策略。...

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

  5. 吐血输出:2万字长文带你细细盘点五种负载均衡策略。

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

  6. Nginx的6种负载均衡策略

    Nginx的6种负载均衡策略[轮询/加权轮询weight/ip_hash/least_conn/urlhash/fair] 总结:nginx负载均衡策略 1.轮询策略 轮询策略其实是一个特殊的加权策略 ...

  7. 开启springcloud全家桶5:探索负载均衡组件 Ribbon实现与原理

    前段时间,笔者为了解决微服务多版本共存调用的问题,笔者深入调研了Ribbon,并将调研的内容记录了下来,以供后续查阅.Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是负载均 ...

  8. SpringCloud组件:Ribbon负载均衡策略及执行原理!

    大家好,我是磊哥. 今天我们来看下微服务中非常重要的一个组件:Ribbon.它作为负载均衡器在分布式网络中扮演着非常重要的角色. 本篇主要内容如下: 在介绍 Ribbon 之前,不得不说下负载均衡这个 ...

  9. SpringCloud Ribbon(二)之自定义负载均衡策略IRule

    一.Ribbon负载均衡策略 一个服务对应一个LoadBalancer,一个LoadBalancer只有一个Rule,LoadBalancer记录服务的注册地址,Rule提供从服务的注册地址中找出一个 ...

最新文章

  1. 7_2判断两个单链表是否相交,若相交,求出第一个交点
  2. 浅析丨AI安防产品发展现状与趋势分析
  3. 在spring boot 配置actuator
  4. PyQt - 维基百科,自由的百科全书
  5. Orac and Medians CodeForces - 1350D(思维)
  6. 【计算机组成原理】定点运算器的基本结构
  7. Android之应用程序如何调用支付宝接口
  8. vue封装websocket_有关WebSocket必须了解的知识
  9. 终于解决H3C交换机reset saved-configuration后不能启动的问题
  10. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之总线设备驱动模型
  11. Windows 编程[8] - WM_PAINT 消息
  12. 浙大 PAT b1052
  13. dot watch+vs code提升asp.net core开发效率
  14. ❤️Docker教程小白实操入门 教程合集❤️
  15. 计算机中submit commit区别
  16. 计算机英语拼读法,常用计算机英语词汇:CPU
  17. 返利平台php,MallWWI新模式返利商城系统 php版 v1.2.7
  18. 时序分析 27 - 时序预测 格兰杰因果关系(上) 理论知识
  19. 2023年,如何管理你的绩效目标?
  20. 已使用管理员权限运行CMD,仍报错OSError: [WinError 5] 拒绝访问。: ‘E:\\Code\\Python\\Git\\stable-diffusion-webui\\venv\\

热门文章

  1. 程序员绩效总结_年终总结怎么写?
  2. 树莓派摄像头_Arducam 8MP重磅来袭,为树莓派4B构建完全同步的双摄像头方案~
  3. 控制台:Unable to import maven project: See logs for details日志:Unable to create injector, see the follow
  4. HTTP 视频怎么在 MIP 页面中使用?
  5. Angular_PWA使用+Demo
  6. @Autowired注解实现原理
  7. jenkins+svn+maven+ssh 部署配置详细记录
  8. 极速理解设计模式系列:6.适配器模式(Adapter Pattern)
  9. Python之list对应元素求和
  10. 《C#多线程编程实战(原书第2版)》——3.2 在线程池中调用委托