- 原因背景
- spring cloud的底层负载均衡是采用Ribbon组件,我们将user-service服务注册到eureka-server中,那么当我们在另一个服务的代码层面请求远程调用API接口http://user-service/users/5时,程序代码如何解析远程调用的user-service服务名转化为相应的服务ip地址以及端口,从而实现指定服务的远程调用
- 源码跟踪
- 我们通过http请求服务的时候,请求地址是服务名,很显然是有相应的拦截器将我们的服务名拦截修改成相应的ip地址以及端口,这个拦截器就是LoadBalancerInterceptor类
- 接下来我们进入this.loadBalancer.execute(serviceName,this.requestFactory.createRequest(request, body, execution))方法,可以知道接下来获取一个负载均衡器ILoadBalancer,然后通过执行getServer(loadBalancer, hint)方法,采用内置的负载均衡算法从eureka-server获取的服务列表中选择其中一个服务实例
- 接下来我们进入getServer(loadBalancer, hint)方法,如果没有配置将会采用默认的(default)
- 继续进入loadBalancer.chooseServer(hint != null ? hint : "default")方法
- 可以看出默认的负载均衡算法是RoundRobinRule,也就是轮询的意思
- 最终执行可以看出,当前经过负载均衡算法得到的实例服务是localhost:8081
- 我们通过http请求服务的时候,请求地址是服务名,很显然是有相应的拦截器将我们的服务名拦截修改成相应的ip地址以及端口,这个拦截器就是LoadBalancerInterceptor类
- 总结
- LoadBalancerInterceptor拦截我们的RestTemplate请求http://user-service/users/5
- RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
- DynamicServerListLoadBalancer根据user-service到eureka-server拉取服务列表
- 获取eureka-server返回user-service的服务列表,localhost:8080、localhost:8081、localhost:8082
- IRule利用内置负载均衡规则,从服务列表中选择一个实例,例如localhost:8081
- RibbonLoadBalancerClient修改请求地址,用localhost:8081替代user-service,得到http://localhost:8081/users/5,进而发起真实的http请求
Ribbon组件的负载均衡原理
upton-nan2023-12-13 10:40
相关推荐
聆风吟º6 小时前
Oracle到KingbaseES数据库迁移:全流程实战指南与避坑总结哈__6 小时前
Oracle至KingbaseES数据库迁移全攻略:痛点拆解、配置实操与问题排查JZC_xiaozhong7 小时前
电商ERP如何同步订单数据到MySQL?集成方案解析消失的旧时光-19437 小时前
第四篇(实战): 订单表索引设计实战:从慢 SQL 到毫秒级知识分享小能手7 小时前
Oracle 19c入门学习教程,从入门到精通, Oracle 表空间与数据文件管理详解(9)zhengfei6117 小时前
Chroma DB — 未经授权的信息披露KaiwuDB8 小时前
KaiwuDB 获评“2025 中国大数据产业年度国产化优秀代表厂商”百***07458 小时前
一步API+Gemini 3.0 Pro进阶实战:多模态开发、性能调优与项目落地不想写bug呀8 小时前
Redis主从复制介绍颜颜yan_8 小时前
Oracle 迁移到 KingbaseES 实战:从评估到追平的一套可落地流程







