八、Ribbon负载均衡服务调用
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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?