【4.1】Ribbon负载均衡原理

news2024/9/24 6:19:33

【4.1】Ribbon负载均衡

  • 1 Ribbon--负载均衡原理
    • 1.1 负载均衡流程
    • 1.2 源码分析(debug)
  • 2 总结


1 Ribbon–负载均衡原理

1.1 负载均衡流程

在这里插入图片描述
图中的地址是真实可用的地址吗?
显然不是。
这样一个请求实际上是无法直接到达user-service的。
因此中间一定会有“人”将这个请求拦下并做一些处理。
“这个人就是”Ribbon

Ribbon在拦截下请求之后,要想办法找到真实的地址。它首先要知道这个请求指定的是哪个服务,然后去找eureka-server拉取userservice,然后eureka-server返回服务列表。
在这里插入图片描述
然后就挑选到具体的user-service:
在这里插入图片描述

1.2 源码分析(debug)

打开OrderApplication.java:
在这里插入图片描述
@LoadBalanced注解就是一个标记,标记将来RestTemplate发起的请求要被Ribbon去拦截和处理。
那么拦截的动作是谁去完成的呢?
这里我的快捷键是双击 /
找到下图的类,打开:
在这里插入图片描述
在这里插入图片描述
可以看到它实现了一个接口,叫做ClientHttpRequestInterceptor ,它会去拦截由客户端发起的http请求。RestTemplate正是一个发起http请求的客户端,所以就会被拦截。
这个接口的方法名叫intercept。
回到LoadBalancerInterceptor.java,可以看到实现了这个方法:
在这里插入图片描述
在图上位置打个断点,回浏览器去发起请求:
在这里插入图片描述
回到idea:
在这里插入图片描述
可以看到这个请求确实被拦截了,拦截之后做什么呢?
可以看到 request.getURI (),也就是获取请求地址。
再走一步:
在这里插入图片描述
originalUri.getHost()也就是获得主机名
再往下走:
在这里插入图片描述
可以看到它拿到了服务名称userservice,接下来就是去找Eureka完成服务的拉取。
然后可以看到这里将获取的serviceName交给了loadBalancer去执行。
loadBalancer又是什么呢?看图:
在这里插入图片描述
它是一个RibbonLoadBanlancerClient对象。
接下来我们跟入这个方法:
在这里插入图片描述
可以看到执行完成之后得到一个loadBalancer对象,右下角看到这个对象的名字叫做
DynamicServerListLoadBalancer动态服务列表负载均衡器
然后展开可以看到:

在这里插入图片描述
ServerList也就是服务列表。可以看到8081和8082已经被成功的拉取到了。
所以由此可知上面代码中的:
ILoadBalancer loadBalancer = this.getLoadBalancer(serviceId);
就是在根据服务名称找eureka拉取服务列表。
此时服务列表已经拿到,下一步就是做负载均衡。

在这里插入图片描述
图中打断点这行:
Server server = this.getServer(loadBalancer, hint);
上面图中显示了loadBalancer中有一个ServerList,这里getServer取出一个。
再跟进这个方法:
在这里插入图片描述
发现它调用了chooseServer这个方法,再跟进去:
在这里插入图片描述
发现他去找super.chooseServer,再跟进去:
在这里插入图片描述
可以看到这里有个rule.choose(key);
rule也就是规则的意思,相当于现在要从DynamicServerList中选一个,需要一种规则。
接下来看一下这个rule是什么类型的对象:
在这里插入图片描述
可以看到它是一个IRule类,I代表接口,Rule代表规则,也就是说它是一个规则的接口,接下来用ctrl+H查看它的实现类:
在这里插入图片描述
RandomRule随机
RoundRobinRule轮询
而默认的负载规则是:ZoneAvoidanceRule
基于分区下的服务器的可用性选出可用分区列表,再从可用分区列表中随机选择一个分区,采用轮询的策略选择该分区的一个服务器。
在这里插入图片描述
然后继续往下:
在这里插入图片描述
可以看到拿到了8081。
拿到地址信息了,下一步就可以根据真实的ip地址和端口号来替代原来的服务名称去发起真实请求。


2 总结

当请求进入Ribbon之后,Ribbon会怎么去处理呢?
首先,请求会被一个拦截器拦住, 这个拦截器的名字叫做LoadBalancerInterceptor负载均衡拦截器
在这里插入图片描述
它拦截下来以后会得到请求中的服务名称,然后把它交给 RibbonLoadBanlancerClient

RibbonLoadBanlancerClient又会将服务交给 DynamicServerListLoadBalancer

然后DynamicServerListLoadBalancer又会去eureka-server拉取服务列表
在这里插入图片描述
之后,DynamicServerListLoadBalancer会去找 IRule
IRule会基于规则选择某个服务,并将选中的服务返回给RibbonLoadBanlancerClient
在这里插入图片描述
然后RibbonLoadBanlancerClient就会用得到的真实的ip和端口替换服务名称,得到真实的请求地址然后就去完成请求。
在这里插入图片描述
这就是整个Ribbon工作的流程。


By --Suki 2023/1/4

知识内容来自于黑马程序员视频教学和百度百科。博主仅作笔记整理便于回顾学习。如有侵权请私信我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/140822.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

求一款免费好用的进销存管理软件?

求一款免费好用的进销存管理软件? 免费好用的进销存管理软件,“免费”一词对用户最具吸引力。 很多的小微企业在企业发展的过程都会选择免费的进销存管理软件来协助自己运营。都会希望,花最低的成本,实现最大的利益。 进销存管…

牛客网数据库sql实战剖析(一)

牛客网SQL实战 1.查找最晚入职员工的所有信息 思路:找出入职时间最大的时间,作为子查询条件进一步查找到该员工的其它信息。 SELECT * FROM employees WHERE hire_date (SELECT MAX(hire_date)FROM employees );这里不能用order by的方式&#xff0c…

私募证券基金动态-12月报

成交量:2022全年日均9,277.25亿元12月A股两市日均成交7,875.28亿元,环比下降15.15%、同比下降26.83%,是2022年继9月以后成交量次低的月份。2022年全年,日均成交量9,277.25亿元。管理人:新提交备案29家,备案…

【北京理工大学-Python 数据分析-1.2-NumPy数据存储与函数】

一、数据CSV文件的存取 CSV文件(Comma-Separated Value,逗号分隔值)是一种常见的文件格式,用来存储批量数据。 如常见的数据存储为CSV后 NumPy中有两个函数可以写入CSV格式,并从CSV文件中读取数据。 CSV文件的存储 np.savetxt…

mysql中的rand()函数简介以及和其他函数组合使用实践

一、本文结构简介 本文首先介绍rand()的基本使用 其次分别介绍round与rand的合用、ceiling与rand的合用、floor与rand的合用、md5与rand的合用 二、rand()的基本使用 rand()是系统自带的获取随机数的函数 (1)无参数:产生获取[0,1)之间的float型的数字 (2)有参数&a…

【jQuery】写一个电梯导航

今天大概是跟着pink老师学习JS的第八天&#xff0c;看了有410章了。 视频教程&#xff1a;pink JS 今天早上跟着老师做了一个电梯导航&#xff1a; 还是那个熟悉的品优购项目。。。 之后我打算自己练习一下&#xff0c;然后就出现bug了。 <div class"tuijian"&…

CO13 订单取消确认报错:“在为订单XXXX 确定实际成本中出错”处理分析

用户再操作CO13时报了一个错误&#xff1a;在为订单XXXX 确定实际成本中出错。 看到这个错误以为是财务同时没有发布成本导致的。然后我也操作了一下发现了一些过账中的错误。 原来是冲销这个工单的账期是在前几个月&#xff0c;而那个月已经关账期了&#xff0c;所以报错。 …

ORB-SLAM3代码和算法学习—浅谈代码中的纯定位模式

0总述 在Tracking线程中&#xff0c;当系统初始化完成后就会正式进入跟踪环节。在ORB-SLAM3算法代码中提供了两种模式&#xff0c;一种是纯定位模式&#xff0c;一种是定位建图的SLAM模式。 对于纯定位模式&#xff0c;在源码中由成员变量mbOnlyTracking控制&#xff0c;这个…

django 利用Form上传文件到 media 文件夹

背景&#xff1a;利用 Form 收集用户提交的信息&#xff0c;包括字符串和文件对象&#xff0c;文件保存在项目的 media 文件夹&#xff0c;因为 static 文件一般是用来存静态文件 css 或者项目所需要的图片&#xff0c;用户上传的文件应该保存在其他文件夹; 1、 启用 media&am…

实战演练 | 使用 SQL 别名简化查询并自定义结果

别名能够在不影响基础表或视图的情况下临时重命名表或列。作为大多数甚至所有关系数据库管理系统都支持的 SQL 功能&#xff0c;别名是简化查询和/或自定义结果集中列标题的好方法。在这篇文章中&#xff0c;我们将使用 Navicat Premium 16 来完成这两项工作。重命名列许多数据…

十级NLPer才能笑出声的算法梗!

文&#xff5c;付奶茶近期小编整理出了一些非常好笑的梗图&#xff0c;与各位NLPer共赏&#xff0c;希望与大家一起评选出本期最好笑的梗图选手&#xff01;【1号选手&#xff1a;非常擅长讲笑话的NLM】前排评论区&#xff1a;&#xff08;1&#xff09;I enjoyed your joke ab…

Android 深入系统完全讲解(一)

因为很多朋友还是会咨询 Android 相关的内容&#xff0c;于是便花费了一些时间&#xff0c;把我总结的方法&#xff0c;一些系统代码的跟踪流程&#xff0c;做一个完整的梳理&#xff0c; 算是给自己职业生涯画个完美的句号。 虽然说后续写代码会相对少一些&#xff0c;但是还…

P1044 [NOIP2003 普及组] 栈

P1044 [NOIP2003 普及组] 栈 方法一&#xff1a;递推dp 思路&#xff1a; 求n的总数&#xff0c;我们可以分解成n在第i&#xff08;1<i<n)位置输出讨论。 我们用a[i][j]表示数i在第j位置输出的情况总数&#xff0c;ans[i][j]表示数i在第1--j位置输出总数和 1&#x…

ROS地图栅格信息

一.地图栅格消息nav_msgs/OccupancyGrid // 栅格地图消息 std_msgs/Header header nav_msgs/MapMetaData info time map_load_time float32 resolution // 分辨率 geometry_msgs/Pose origin // 原点坐标 geometry_msgs/Quaternion orientati…

元数据管理Datahub基于Docker进行部署

目录1. 服务器要求2. 安装Docker3. 安装jq4. 安装python35. 安装docker-compose v1(deprecated&#xff0c;为了兼容性)5.1 安装virtualenv5.2 安装docker-compose6. 安装datahub(在docker-compose-v1-py虚拟环境下)7. 访问Web页面&#xff0c;然后导入测试元数据8. 删除datahu…

数字孪生的概念是什么【深度】

数字孪生技术最早提出是用于航空航天领域&#xff0c;美国 NASA 指出“一个数字孪生&#xff0c;是一种集成化了的多种物理量、多种空间尺度的运载工具或系统的仿真&#xff0c;该仿真使用了当前最为有效的物理模型、传感器数据的更新、飞行的历史等等&#xff0c;来镜像出其对…

C语言C++中与接收、输出字符相关的问题

C语言中&#xff0c;在使用scanf("%c",&data);读取一个字符时&#xff0c;有时会遇到scanf吞回车符的情况。 这里搜到几种常用的解决方法&#xff1a; 1.在scanf()中使用’\n’屏蔽回车符号。 scanf("\n%c",&c);2.在scanf()格式串最前面添加空格&…

【Linux】缓冲区的理解

文章目录什么是缓冲区&#xff1f;为什么要有缓冲区&#xff1f;缓冲区刷新策略请看下面代码&#xff1a;接着上篇【Linux】文件操作|文件描述符|重定向 什么是缓冲区&#xff1f; 我们口中说的缓冲区&#xff0c;一般指的是用户级语言层面给我们提供的缓冲区。本质就是一段…

nRF24L01芯片(模块)介绍

nRF24L01芯片&#xff08;模块&#xff09;简介nRF24L01是由NORDIC生产的工作在2.4GHz~2.5GHz的ISM 频段的单片无线收发器芯片。无线收发器包括&#xff1a;频率发生器、增强型“SchockBurst”模式控制器、功率放大器、晶体振荡器、调制器和解调器。输出功率频道选择和协议的设…

使用 K8S 部署 RSS 全套自托管解决方案- RssHub + Tiny Tiny Rss

前言 什么是 RSS? RSS 是一种描述和同步网站内容的格式&#xff0c;是使用最广泛的 XML 应用。RSS 搭建了信息迅速传播的一个技术平台&#xff0c;使得每个人都成为潜在的信息提供者。发布一个 RSS 文件后&#xff0c;这个 RSS Feed 中包含的信息就能直接被其他站点调用&…