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请求
相关推荐
阳光宅男@李光熠7 小时前
【电子通识】一起学习TDK的EMC基础——电池兼容设计方法概述
java·前端·数据库
知识的搬运工旺仔7 小时前
唯一索引与 NULL 值:PostgreSQL 主键约束与 NULLS NOT DISTINCT
数据库·后端·sql·postgresql
我的xiaodoujiao8 小时前
Django 基础知识详细图文教程 9-Django 模板引擎 2
开发语言·数据库·后端·django
蓝速科技8 小时前
商用复杂环境翻译机耐用性选型指南丨蓝速科技
大数据·运维·数据库·人工智能·科技
starzy19909 小时前
Flink Sliding Window 详解及代码实现:从窗口重叠到状态爆炸防控
运维·数据库·flink
jnrjian9 小时前
DRG-50857 ORA-30576 drixmd.PurgeKGL CTXSYS
数据库·oracle
志栋智能10 小时前
集成是关键:让巡检超自动化融入现有工具链
运维·服务器·数据库·架构·自动化
IvorySQL10 小时前
PostgreSQL 日报|逻辑解码竞态条件修复(9 月 20 日)
数据库·人工智能·postgresql
adinnet202612 小时前
为什么 RAG 需要 Milvus?向量数据库到底存了什么
大数据·数据库
Elastic 中国社区官方博客12 小时前
使用 Elasticsearch 和 Jina 进行 AI 视频搜索:精准找到你需要的视频片段秒数
大数据·数据库·人工智能·elasticsearch·搜索引擎·ai·全文检索