SpringCloud系列(22)--Ribbon默认负载轮询算法原理及源码解析

前言:在上一篇文章中我们介绍了如何去切换Ribbon的负载均衡模式,而本章节内容则是介绍Ribbon默认负载轮询算法的原理。

1、负载轮询算法公式

rest接口第N次请求数 % 服务器集群总数 = 实际调用服务器下标(每次服务器重启后rest接口计数从1开始)

举例子:

现在集群有两台服务器,分别有payment8001、payment8002这两个实例,即服务器集群总数为2

把这两个实例放进一个List集合里,即List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");

如:List[0] instances = 127.0.0.1:8001

       List[1] instances = 127.0.0.1:8002

之后对请求数进行%服务器集群总数的操作,然后取出实际调用的服务器下标,用该下标从实例集合里取出的实例就是要访问的服务器

如:

第1次请求 : 1 % 2 = 1,即这时要调用List集合下标为1的服务器,获得instances下标为1的服务器地址127.0.0.1:8002,然后调用这台服务器

第2次请求 : 2 % 2 = 0,即这时要调用List集合下标为0的服务器,获得instances下标为0的服务器地址127.0.0.1:8001,然后调用这台服务器

第3次请求 : 3 % 2 = 1,即这时要调用List集合下标为1的服务器,获得instances下标为1的服务器地址127.0.0.1:8002,然后调用这台服务器

第4次请求 : 4 % 2 = 0,即这时要调用List集合下标为0的服务器,获得instances下标为0的服务器地址127.0.0.1:8001,然后调用这台服务器

第5次请求 : 5 % 2 = 1,即这时要调用List集合下标为0的服务器,获得instances下标为1的服务器地址127.0.0.1:8002,然后调用这台服务器

如此类推.......

以上就是Ribbon轮询算法的原理

2、Ribbon负载轮询算法源码解析

(1)我们进入到MySelfRule这个类里面,然后点进IRule类

(2)点击跳转到IRule接口的RoundRobinRule实现类里,RoundRobinRule这个类就是关于轮询算法的代码实现

(3)解析源代码

[1]我们可以看到RoundRobinRule构造方法里初始化了一个值为0的AtomicInteger类

[2]负载均衡算法主要实现在choose方法里,我们看choose方法可以看到关于各种关于服务的非空判断和各种的取值,其中最重要的是通过incrementAndGetModulo方法取得下标,然后根据这个下标从服务集合里取出其中一个服务

[3]incrementAndGetModulo方法,它的实现方式就跟我们第一个步骤介绍的算法一样,即: 

往incrementAndGetModulo方法传入服务总数,nextServerCyclicCounter.get()方法取得原子类当前的值,因为默认值是0,所以取得的值是0,即current的值为0,(current + 1) % modulo的计算方式就跟我们第一个步骤说的一样,即是请求次数%服务总数,current为0,module是服务总数,假使我们当前的服务有有payment8001、payment8002两个,即module是2,(current + 1) % modulo求得next的值为1,nextServerCyclicCounter.compareAndSet(current, next))方法能比较AtomicInteger的值是否被其他线程改变了,若没改变则把next的值更新到AtomicInteger里,如被改变了,则继续下次循环,直到设置AtomicInteger值成功,把next的值返回为止,在不断地调用choose方法时,会不断地进行对AtomicInteger+1然后对服务总数求模取余的操作,然后不断返回下标,不断的返回相应下标的服务

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分享:大数据风险检测报告,哪里查询比较好?

随着大数据技术的发展&#xff0c;逐渐被运用到各个领域&#xff0c;基于大数据技术的个人风险检测也就是我们常说的大数据报告在金融环境中运用的十分普遍&#xff0c;那大数据风险检测报告哪里查询比较好呢?本文就为大家简单介绍一下。 大数据风险检测报告查询能查到什么? …

超大Sql文件切分工具SQLDumpSplitter —— 筑梦之路

官网&#xff1a;PLB PLB - SQLSplitter 用于将大型MySQL转储拆分为可独立执行的小型SQL文件。 显示100%时并不是已经处理完了&#xff0c;而是才开始 优点 软件程序小巧&#xff0c;不需要安装&#xff0c;直接点击运行就可以最厉害的是SQLDumpSplitter可以自动将结构语句&…

基于放射组学的深度学习用于左心房CT图像中房颤亚型的分类

文章目录 Radiomics-Informed Deep Learning for Classification of Atrial Fibrillation Sub-Types from Left-Atrium CT Volumes摘要方法实验结果 Radiomics-Informed Deep Learning for Classification of Atrial Fibrillation Sub-Types from Left-Atrium CT Volumes 摘要…

多微信如何高效管理?一台电脑就能搞定!

对于有多个微信号的人来说&#xff0c;管理这些微信无疑是一道难题。 今天&#xff0c;就给大家分享一个能够让你高效管理多个微信号的神器——个微管理系统&#xff0c;下面&#xff0c;就一起来看看它都有哪些功能吧&#xff01; 1、多号同时登录在线 系统支持多个微信号同…

EI数据库如何出具中文论文检索报告?

Ei Compendex数据库是全球最全面的工程检索二次文献数据库&#xff0c;它收录了7,000,000多篇论文的参考文献和摘要。这些论文出自5,000多种工程类期刊、会议论文集和技术报告。Ei Compendex收录的文献涵盖了所有的工程领域&#xff0c;其中大约22%为会议文献&#xff0c;90%的…

在线人才测评在企业招聘和大学生求职中的应用场景

每年的春招秋招&#xff0c;都是毕业生们忙着找工作的季节&#xff0c;相比社招来说&#xff0c;春招秋招是每个毕业生务必重视的机会&#xff0c;大厂名企毕竟名额有限&#xff0c;如果找到自己心仪的职业岗位&#xff0c;作为毕业生就必须提前准备&#xff0c;深入了解招聘的…

YOLOv8独家改进:mamba系列 | 视觉态空间(VSS)块结合C2f二次创新,提升捕捉广泛的上下文信息 | VMamba2024年最新成果

💡💡💡创新点:Mamba UNet采用了纯基于视觉Mamba(VMamba)的编码器-解码器结构,融入了跳跃连接,以保存网络不同规模的空间信息。这种设计有助于全面的特征学习过程,捕捉医学图像中复杂的细节和更广泛的语义上下文。我们在VMamba块中引入了一种新的集成机制,以确保编…

百度集团:AI重构,走到哪了?

内有自家公关一号“自曝”狼性文化&#xff0c;主动制造舆论危机。 外有&#xff0c;OpenAI、谷歌、字节、华为等大模型劲敌扎堆迭代新产品&#xff0c; 强敌环伺。 今天我们要说的是早就从BAT掉队的——百度。 最近&#xff0c;在武汉Aapollo Day 2024上&#xff0c;百度发布了…

[数据结构] -- 单链表

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

小红书云原生 Kafka 技术剖析:分层存储与弹性伸缩

面对 Kafka 规模快速增长带来的成本、效率和稳定性挑战时&#xff0c;小红书大数据存储团队采取云原生架构实践&#xff1a;通过引入冷热数据分层存储、容器化技术以及自研的负载均衡服务「Balance Control」&#xff0c;成功实现了集群存储成本的显著降低、分钟级的集群弹性迁…

ABB机器人---基础编程

目录 第一章 代码解释 1.1 基础代码 1.1.2 关于 VAR robtarget pos 1.1.3 关于四元数 1.2 机器人初始化程序 1.3 配置通信 (ProfiNet 示例&#xff0c;ABB RAPID) 1.4 设置干涉区 (ABB RAPID) 1.5 示教轨迹和自动过程 (ABB RAPID) 1.6 配置抓手并进行抓取操作 (ABB RA…

[WUSTCTF2020]funnyre

ida打开 mian 函数 不能反汇编&#xff0c;往下翻有一处报红&#xff0c;一看是花指令&#xff0c;还怪长&#xff0c;报红的都nop后&#xff0c;全选按P重新生成函数 三百多个变量&#xff0c;也是不太可能一个个去解了&#xff0c;刚好前两天简单练了一下 angr &#xff08;…

拓数派入选中电联大数据与统计分会两大重点专项工作组

自中国电力企业联合会大数据与统计分会成立以来&#xff0c;深入贯彻党中央、国务院关于不断做强做优做大我国数字经济有关要求&#xff0c;充分发挥数据要素乘数效应&#xff0c;凝聚行业专家及能源电力产业链各主体力量&#xff0c;持续推进能源电力数据资源交易共享&#xf…

Xinstall:开启携带参数注册新时代,提升用户体验与运营效率

在移动互联网时代&#xff0c;App推广和运营面临着诸多挑战。其中&#xff0c;如何精准追踪用户来源、评估推广效果以及优化用户体验&#xff0c;一直是开发者们关注的焦点。而Xinstall作为一家一站式App全渠道统计服务商&#xff0c;通过其独特的携带参数注册功能&#xff0c;…

electron调试自动更新,不触发下载进度解决方案

调试时候删除掉后缀是.blockmap的文件。如果你的代码在改动不大的情况下发布一个新版本。那个安装器可能会根据这个数据自动合成一个包&#xff0c;而不走网络路径。从而不触发下载进度。

kubectl--操作指令大全

目录 一 kubectl 1 查看版本信息 2 查看资源对象简写 3 查看集群信息 4 配置kubectl自动补全 5 node节点查看日志 二 基本信息查看 1 查看 master 节点状态 2 查看命令空间 3 查看命名空间为default的所有资源 4 创建命名空间app 5 删除命名空间app 6 指定pod控…

外卖系统源码开发全攻略:外卖小程序与后台管理系统的设计与实现

今天&#xff0c;小编将详细介绍外卖系统源码的开发全攻略&#xff0c;从需求分析到设计与实现&#xff0c;为开发者提供全面指导。 一、需求分析 1.用户需求 用户是外卖系统的核心&#xff0c;需满足以下基本需求&#xff1a; -浏览菜单并下单 -实时追踪订单 -多种支付方…

对安卓手机上损坏的 SD 卡进行故障排除:恢复提示和修复

概括 如果您总是在旅途中&#xff0c;那么您很可能每天都在使用 SD 卡。这些微小但功能强大的闪存已经变得和手机的内部存储一样有用。它们可以存储数据并移动您想要的任何数据类型&#xff0c;因为它们在 Android 设备上添加了额外的存储空间。不幸的是&#xff0c;他们可能会…

leetCode-hot100-数组专题之双指针

数组双指针专题 1.同向双指针1.1例题26.删除有序数组中的重复项27.移除元素80.删除有序数组中的重复项 Ⅱ 2.相向双指针2.1例题11.盛最多水的容器42.接雨水581.最短无序连续子数组 双指针在算法题中很常见&#xff0c;下面总结双指针在数组中的一些应用&#xff0c;主要分为两类…

探索自动化办公的新境界:批量操作与智能管理

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、自动化办公的必要性与价值 二、基础操作与自动化脚本 三、Python在自动化办公中的应用…