1、概述
SpringCloud Ribbon 是 基于 Netflix Ribbon实现的一套客户端(服务消费侧)负载均衡工具
Ribbon客户端组件提供一些列完善的配置项,如连接超时,重试等。简单的来说,就是在配置文件中列出Load Balance后面所有的机器,Ribbon会自动帮助你基于某种规则去连接这些机器。我们很容易使用Ribbon实现自定义的负载均衡算法
2、Ribbon负载均衡演示
1)架构说明:
Ribbon 是一个软负载均衡的客户端组件
Ribbon在工作时候分为两步:
① 选择EurekaServer , 它优先选择在同一个区域负载较少的Server
② 根据用户指定的策略,在server取到的服务注册列表中选择一个地址。其中Ribbon提供了很多策略:比如轮询,随机和
根据响应时间加权
2)pom文件
spring-cloud-starter-netflix-eureka-client 中 集成了 ribbon
3、Ribbon核心组件IRule
1) IRule : 是一个接口
其作用是:根据特定算法从服务列表中选取一个要访问的服务
IRule的继承结构如下:
IRule的主要实现类:
2)如何替换Ribbon默认的轮询规则
①、自定义配置类MySelfRule
将IRule的一个实现类添加到spring容器中
@Configuration public class MySelfRule { @Bean public IRule myRule(){ return new RandomRule(); } }
【注意】
这个自定义配置类不能放在@ComponentScan所扫描的当前包及其子包下
否则我们自定义的这个配置类会被所有的Ribbon客户端所共享,达不到特殊化定制的目的了
②、主配置类上添加:
@RibbonClient(name="CLOUD-PAYMENT-SERVICE",configuration = MySelfRule.class)
告诉服务消费者使用的ribbon规则
4、Ribbon负载均衡算法
1)RoundRobinRule(轮询算法)原理:
2)源码
int nextServerIndex = incrementAndGetModulo(serverCount); //cas自旋锁 => nextServerCyclicCounter: 第几次请求 private int incrementAndGetModulo(int modulo) { for (;;) { int current = nextServerCyclicCounter.get(); int next = (current + 1) % modulo; if (nextServerCyclicCounter.compareAndSet(current, next)) return next; } }