当前位置: 首页 > news >正文

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请求

相关文章:

  • 电脑搜不自己的手机热点,其余热点均可!
  • 采样率越高噪声越大?
  • 【redis笔记】分布式锁
  • 【Lidar】基于Python的三维点云数据转二维平面+散点图绘制
  • 2次MD5加密——用于分布式对话
  • Labelme2Yolo labelme格式的json标注转yolo格式txt
  • 【尘缘送书第五期】Java程序员:学习与使用多线程
  • 排序:直接选择排序
  • 分享几种 Java8 中通过 Stream 对列表进行去重的方法
  • 论文精读 MOG2 阴影检测
  • [传智杯 #2 初赛] 1024 程序员节发橙子
  • python-比较Excel两列数据,并分别显示差异
  • 如何在Ubuntu上清理缓存和垃圾文件
  • 【android开发-06】android中textview,button和edittext控件的用法介绍
  • 程序员如何开发高级python爬虫?
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • C++入门教程(10):for 语句
  • canvas 五子棋游戏
  • CAP 一致性协议及应用解析
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • JS基础之数据类型、对象、原型、原型链、继承
  • JS正则表达式精简教程(JavaScript RegExp 对象)
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • Spark RDD学习: aggregate函数
  • spring cloud gateway 源码解析(4)跨域问题处理
  • springboot_database项目介绍
  • webpack4 一点通
  • yii2中session跨域名的问题
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 创建一种深思熟虑的文化
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 少走弯路,给Java 1~5 年程序员的建议
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • $.ajax()参数及用法
  • (c语言)strcpy函数用法
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net Redis的秒杀Dome和异步执行
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 编译期间能确定的相同字符串,在运行期间是相同的实例
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • .net连接oracle数据库
  • .pyc文件是什么?
  • /etc/sudoers (root权限管理)
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @RequestBody与@ResponseBody的使用
  • @软考考生,这份软考高分攻略你须知道
  • [2010-8-30]
  • [20181219]script使用小技巧.txt
  • [Docker]十.Docker Swarm讲解
  • [JavaWeb学习] idea新建web项目