Ribbon核心组件IRule及负载均衡算法

Ribbon常用负载均衡算法:

IRule接口,Riboon使用该接口,根据特定算法从所有服务中,选择一个服务,

Rule接口有7个实现类,每个实现类代表一个负载均衡算法,默认使用轮询

如何替换掉轮询

我们需要新建一个规则类,然后在启动类中添加注解即可。

但是:

官方文档给出了警告:

这个自定义配置类不能放在 @CommpomentScan 所扫描的当前包下以及子包下,

(即不能放在SpringBoot启动类包下及其子包)

否则我们自定义的这个规则类会被所有的 Ribbon 客户端共享,达不到特殊定制化的目的。

下面我们来操作:

在已有的order80服务中新建一个package,(即服务提供者)

目录结构如下

在主启动类添加注解

测试,访问查看调用消费者是否已经随机而不是轮询

在之前轮询的情况下端口是8001与8002交替出现,而负载均衡规则变为随机后,端口是随机出现的

负载均衡轮询算法

负载均衡算法:rest 接口第几次请求数 % 服务器集群总数量 = 时机调用服务器位置下标,每次服务重启后rest 接口技术求从1开始。

List<ServiceInstance> instances = discoverClient.getInstances("CLOUD-PROVIDER-SERVICE");

8001 + 8002 组合为集群,他们共计2台服务器,集群总数为2 , 按照轮询算法原理:

当请求总数为1 时:1%2 = 1, 对应下标位置为1, 则获得服务地址为 127.0.0.1:8001

当请求总数为2 时:2%2 = 0, 对应下标位置为1, 则获得服务地址为 127.0.0.1:8002

当请求总数为3 时:2%2 = 1, 对应下标位置为1, 则获得服务地址为 127.0.0.1:8001

以此类推。

Ribbon中轮询算法关键源码如下:

其中核心用到了CAS与自旋锁。

当用CAS判断时,如果不满足期望的预期值,则一直循环,采用取模运算,来以此分配给已有的服武器。

猜你喜欢

转载自blog.csdn.net/m0_46405589/article/details/114698838