Ribbon组件的负载均衡原理

  1. 原因背景
    1. spring cloud的底层负载均衡是采用Ribbon组件,我们将user-service服务注册到eureka-server中,那么当我们在另一个服务的代码层面请求远程调用API接口http://user-service/users/5时,程序代码如何解析远程调用的user-service服务名转化为相应的服务ip地址以及端口,从而实现指定服务的远程调用
  2. 源码跟踪
    1. 我们通过http请求服务的时候,请求地址是服务名,很显然是有相应的拦截器将我们的服务名拦截修改成相应的ip地址以及端口,这个拦截器就是LoadBalancerInterceptor类
    2. 接下来我们进入this.loadBalancer.execute(serviceName,this.requestFactory.createRequest(request, body, execution))方法,可以知道接下来获取一个负载均衡器ILoadBalancer,然后通过执行getServer(loadBalancer, hint)方法,采用内置的负载均衡算法从eureka-server获取的服务列表中选择其中一个服务实例
    3. 接下来我们进入getServer(loadBalancer, hint)方法,如果没有配置将会采用默认的(default)
    4. 继续进入loadBalancer.chooseServer(hint != null ? hint : "default")方法
    5. 可以看出默认的负载均衡算法是RoundRobinRule,也就是轮询的意思
    6. 最终执行可以看出,当前经过负载均衡算法得到的实例服务是localhost:8081
  3. 总结
    1. LoadBalancerInterceptor拦截我们的RestTemplate请求http://user-service/users/5
    2. RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service
    3. DynamicServerListLoadBalancer根据user-service到eureka-server拉取服务列表
    4. 获取eureka-server返回user-service的服务列表,localhost:8080、localhost:8081、localhost:8082
    5. IRule利用内置负载均衡规则,从服务列表中选择一个实例,例如localhost:8081
    6. RibbonLoadBalancerClient修改请求地址,用localhost:8081替代user-service,得到http://localhost:8081/users/5,进而发起真实的http请求
相关推荐
Leighteen30 分钟前
Redis与MySQL双写一致性:从问题根源到工程落地
数据库·redis·mysql
AI-好学者1 小时前
阶段二-Cypher查询语言详解
数据库·rag·graphrag
龙仔7251 小时前
SQL Server 批量多库只读账号一键脚本(带逐行注释完整脚本 + 分段逐句详细解释)
服务器·数据库·sql·sqlserver·dba
咏方舟【长江支流】2 小时前
【开源】跨语言·跨平台·跨数据库(2) —— 用宝轻量框架设计必读
数据库·架构·开源·ai编程·咏方舟-长江支流·用宝框架
手握风云-3 小时前
Redis:不只是缓存那么简单(十五)
数据库·redis·缓存
weixin_307779133 小时前
Linux下Docker Compose里运行PostgreSQL数据库故障诊断Shell脚本
linux·运维·数据库·docker·postgresql
醉城夜风~3 小时前
MySQL 常用内置函数全解:字符串、数值、日期、流程控制实战教程
数据库·mysql
程序猿秃头之路3 小时前
DDD 系列:实体和值对象详解
数据库·oracle·ddd·领域驱动设计
明天谭3 小时前
EzCloud自定义BI报表模块源码解析:动态SQL查询、可视化图表与多租户数据统计实现
数据库·sql·数据报表·bi可视化·ezcloud·java动态sql