Ribbon七种负载均衡策略详解

article/2025/10/27 17:59:58
Ribbon是什么?

主要负责请求分发,例如一个服务节点集群:六台服务器部署着订单服务,用户请求过来了就要根据不同的负载策略分发请求到不同机器上,起到一个缓解请求压力的作用。其自身不会发起请求,这个在源码中可以到,它起到一个“选择”的角色。真正发起请求的还是Feign / OpenFeign 。

Ribbon与Nginx的区别?

看到上诉的描述跟nginx非常接近,两者都是做轮询,做负载分发请求。那么区别是什么?看图
在这里插入图片描述
可以看到,Nginx是属于服务器端的负载均衡,Ribbon是属于客户端的负载均衡,简而言之,Nginx的客户端发起请求不知道会被负载到哪台服务器上,但是Ribbon发起的请求都是非常明确的,就像调用本地服务一样,更广的范围说:Nginx是进程之间调用时候做的负载均衡,Ribbon是进程内部选择调用时候做的负载均衡~
所以微服务架构采用的就是Ribbon,两者还是有一定差距的。

怎么用?

由于在Eureka注册中心和OpenFeign中都已经集成了,所以我们连依赖都不用加了。
在这里插入图片描述
在这里插入图片描述
(1)启动类上加:@RibbonClient
同时可以指定注册中心中的server name ,这样一个server name 列表下管理的全部集群服务就可以被负载策略自由选择
在这里插入图片描述
如果有多个服务的情况下:
在这里插入图片描述
(2)OpenFeign做服务调用那里再加上要请求的server name即可,不同的服务调用记得区分不同的接口。例如这里是CIRCULATE-SERVICE的,DEMO-SERVICE另写一个接口。
在这里插入图片描述
(3)如果还是用RestTemplate这种请求方式的话,就在RestTemplate的Config类中加上一个注解:
在这里插入图片描述
在这里插入图片描述
但是既然都用cloud了,应该都使用Feign组件了吧。。。

如何指定负载均衡的规则?

在这里插入图片描述
在这里插入图片描述

新增自己的RibbonRule,但是不能够和启动类同一个包下面。因为启动类中的@SpringBootApplication注解里面,有一个@ComponentScan,自动扫描跟启动类同级的类,这样我们定义多个@RibbonClient的时候,它们就会共用一种负载策略。如果一定放到同级目录下,也可以手动exclude排除掉。
在这里插入图片描述

上面一直说帮我们做负载,Ribbon具体有哪几种负载均衡?

(1)RoundRobinRule轮询(默认):

第一次到A,第二次就到B,第三次又到A,第四次又到B…
具体实现是一个负载均衡算法:第N次请求 % 服务器集群的总数 = 实际调用服务器位置的下标
那么怎么保证线程安全问题呢?因为N次请求次数会自增,怎么保证不会多次请求都拿到同一个N进行自增?答案就是简单的CAS:
在这里插入图片描述

关于CAS,有另外一篇记录:Lock锁+CAS+与Synchronized比较

(2)RandomRule随机

在这里插入图片描述

再进去看(我看源码看到这一块看不懂了,求大佬赐教),只知道返回存活服务列表中的随机一个服务的下标,然后在存活列表upList.get(index) 这样去拿到随机的server返回:

在这里插入图片描述

(3)RetryRule轮询重试(重试采用的默认也是轮询)

在这里插入图片描述

(4)WeightedResponseTimeRule响应速度决定权重:

这个源码很长很复杂,就不放出来了,其实是对RoundRobbin的一种增强,加入了权重和计算响应时间的概念,其中响应速度最快的权重越大,权重越大则选中的概率越大。

(5)BestAvailableRule最优可用(底层也有RoundRobinRule):

最优可用,判断最优其实用的是并发连接数。选择并发连接数较小的server发送请求。
在这里插入图片描述

(6)AvailabilityFilteringRule可用性过滤规则(底层也有RoundRobinRule):

我直接翻译就是可用过滤规则,其实它功能是先过滤掉不可用的Server实例,再选择并发连接最小的实例。
在这里插入图片描述

(7)ZoneAvoidanceRule区域内可用性能最优:

基于AvailabilityFilteringRule基础上做的,首先判断一个zone的运行性能是否可用,剔除不可用的区域zone的所有server,然后再利用AvailabilityPredicate过滤并发连接过多的server。
源码真的很长,我不跟下去了…大概就是这么个意思还挺好理解。

也可以自定义负载均衡规则,模仿它们的写法,继承RoundRibbonRule,重写一些方法,加上自己的Server即可。先总结到这里,如果有理解错误的希望指正,以后有更多领悟再补充进来分享~


http://chatgpt.dhexx.cn/article/FHtLmpkD.shtml

相关文章

负载均衡有哪些常见策略?

分析&回答 轮循 Round Robin 这种方法会将收到的请求循环分配到服务器集群中的每台机器,即有效服务器。如果使用这种方式,所有的标记进入虚拟服务的服务器应该有相近的资源容量 以及负载相同的应用程序。如果所有的服务器有相同或者相近的性能那么选…

负载均衡策略-七种策略

LoadBalancer LoadBalancer下面更底层的7种内置的负载均衡策略 RandomRule - 随性而为 RoundRobinRule - 按部就班 RandomRule是随性而为挑选节点,RobinRule却按部就班从一个节点一步一步地向后选取节点,既不会跳过一个,也不会原地踏步&am…

【Nginx】Nginx服务器之负载均衡策略(6种)

一、关于Nginx的负载均衡 在服务器集群中,Nginx起到一个代理服务器的角色(即反向代理),为了避免单独一个服务器压力过大,将来自用户的请求转发给不同的服务器。 二、Nginx负载均衡策略 负载均衡用于从“upstream”模块…

负载均衡策略图文详解

一、「负载均衡」是什么 正如题图所示的这样,由一个独立的统一入口来收敛流量,再做二次分发的过程就是「负载均衡」,它的本质和「分布式系统」一样,是「分治」。 如果大家习惯了开车的时候用一些导航软件,我们会发现…

常用负载均衡及策略图解

文章目录 一、负载均衡二、负载均衡模型分类三、CDN负载均衡四、LVS负载均衡4.1 LVS 支持的三种模式4.1.1 DR 模式4.1.2 TUN 模式4.1.3 NAT 模式 4.2 LVS 基于 Netfilter 的框架实现 五、负载均衡策略是什么六、常用负载均衡策略图解6.1 轮询6.2 加权轮询6.3 最少连接数6.4 最快…

关于0范数、1范数和无穷范数

若 则p范数 p取0时对应0范数,p取1时对应1范数,p取无穷大时对应无穷范数 //LaTeX真的好用 【注意理解】当p取无穷大时,最终只与元素中绝对值最大的元素有关,证明如下:

向量和矩阵的 1范数、2范数

1.向量的范数:0范数,向量中非零元素的个数。 1范数,为绝对值之和。 2范数,就是通常意义上的模。 无穷范数,就是取向量的最大值。 但是向量的范数和矩阵的范数关系不大,百度了好久也没看到狠心的东西&…

向量的范数norm:1范数、2范数、无穷范数;矩阵的行范数、列范数

0范数: 向量中非零元素的个数。1范数: 为绝对值之和。2范数: 通常意义上的模。无穷范数:取向量的最大值。 转自:范数对于数学的意义?1范数、2范数、无穷范数

向量的1范数,2范数,无穷范数,KNN中的Lp距离

L-0范数:用来统计向量中非零元素的个数。 L-1范数:向量中所有元素的绝对值之和。 L-2范数:欧式距离。 L-∞范数:计算向量中的最大值。 你也可以这样理解 1-范数: ║ x ║ 1 │ x 1 │ │ x 2 │ … │ x n │ ║…

范数与模

复数的模 向量的范数 范数,在机器学习中通常用于衡量一个向量的大小,范数的定义如下: P>1 比如如下常见的范数 1-范数:║x║1│x1││x2│…│xn│ (曼哈顿距离) 2-范数&…

求矩阵的1,和2范数

1.向量的范数:0范数,向量中非零元素的个数。 1范数,为绝对值之和。 2范数,就是通常意义上的模。 无穷范数,就是取向量的最大值。 但是向量的范数和矩阵的范数关系不大,百度了好久也没看到狠心的东西&…

矩阵L2,1范数及矩阵L2,p范数的求导

常见的矩阵范数有L1,L2, ∞ 范数,F范数和引申出的L2,1范数。而在机器学习的特征选择中,利用选择矩阵的范数对选择矩阵进行约束,即是正则化技术,是一种稀疏学习。 L0 , L1 向量范数 L0 范数 L0 …

计算方法 | 范数(向量:1范数、2范数、无穷范数;矩阵:行范数、列范数)

0范数: 向量中非零元素的个数。1范数: 为绝对值之和。2范数: 通常意义上的模。无穷范数:取向量的最大值。 行范数:矩阵中每行绝对值之和的最大值列范数:矩阵中每列绝对值之和的最大值 详细研究请访问&#…

到底什么是范数?什么是0范数、1范数、2范数?区别又是什么?

其实我的专业不是数学专业,只不过在阅读paper时,我们会经常看到0范数或者1范数这些范数问题。本文就来分析看看到时什么是范数?什么是0范数、1范数、2范数?它们的区别又是什么?为了方便某些着急的people,先…

向量和矩阵的各种范数比较(1范数、2范数、无穷范数等等)

一、向量的范数 首先定义一个向量(一般用列向量表示)为: 1.1 向量的1范数 向量的1范数即:向量的各个元素的绝对值之和,上述向量a的1范数结果就是:29,MATLAB代码实现为:norm(a,1&am…

未为python配置解释器_Python环境安装,解释器配置

下载安装完Pycharm后,创建一个py文件编写代码会提示No Python interpreter configured for the project,这是提示要配置解释器,可以去官网下载安装。 从官网下载https://www.python.org/downloads/windows/ 以我的电脑为例,选择64…

Python开发环境安装及配置

提示:在Python中,一切皆为对象 文章目录 前言初始PythonPyCharm开发环境主要包括以下特点:一、Python自带编辑器IDLE使用二、Anaconda集成环境安装及使用Anaconda环境创建 三、PyCharm环境安装及使用 前言 提示:这里可以添加本文…

2021最新版Python环境安装变量配置超详细教程,看了就会

Python都更新到3.10最新版本了,赶快下载更新,新功能很香。本文图文并茂教你安装和变量配置,我保证你看了就会,小白赶快学起来。先了解下新功能有哪些。 目录 一、Python 3.10 相比 3.9 的新增特性 带圆括号的上下文管理器 更清楚的…

超详细的Python安装和环境搭建教程

目录 安装简介: 第一步,下载Python 第二步,安装Python 1.勾选 And Python 3.9 PATH 选项 2.选择自定义安装(Cutormize installation) 第三步,检查Python是否正常安装成功 安装错误 1.重复安装 2.Python不是内部命令或外部命…