- 原因背景
- 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
相关推荐
SelectDB2 分钟前
为什么 JSON 正在成为分析数据库新的竞争点?ClouGence1 小时前
开源数据库管理工具 CloudDM 4.2.0 发布,新增 GoldenDB、KingbaseES 等数据源发霉的馒头1 小时前
ORA-00845: MEMORY_TARGET not supported on this system的解决方法草莓熊Lotso3 小时前
【Redis 初阶】Set 类型深度解析:去重集合的运算能力与实战场景煎饼皮皮侠4 小时前
【设计】设计一个web版的数据库管理平台后端(之五) --借鉴mybatis东风破_11 小时前
danci 2:创建的单词书到底存在哪里?从 Supabase 一路理解 ORM、Drizzle 和 RLS橙子家12 小时前
OSS 文件上传的几个风险点和解决方案2601_9620664914 小时前
【Sql Server】Update中的From语句,以及常见更新操作方式愤怒的苹果ext14 小时前
MySQL Shell备份恢复数据库数字新视界16 小时前
DCIM管理系统的技术架构与部署模式详解







