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

news2024/11/17 15:53:42

前言:在上一篇文章中我们介绍了如何去切换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然后对服务总数求模取余的操作,然后不断返回下标,不断的返回相应下标的服务

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

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

相关文章

HTML静态网页成品作业(HTML+CSS)——动漫海绵宝宝介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

外卖小程序开发指南:从源码开始构建高效的外卖平台

今天&#xff0c;笔者将为您详细讲解如何从源码开始构建一个高效的外卖小程序&#xff0c;帮助您快速进入这一蓬勃发展的市场。 一、需求分析与设计 需求分析包括&#xff1a; 1.用户需求 2.市场需求 3.技术需求 二、前端开发 以下是开发步骤&#xff1a; -使用微信开发…

听说部门来了个00后测试开发,一顿操作给我整麻了

公司新来了个同事&#xff0c;听说大学是学的广告专业&#xff0c;因为喜欢IT行业就找了个培训班&#xff0c;后来在一家小公司实习半年&#xff0c;现在跳槽来我们公司。来了之后把现有项目的性能优化了一遍&#xff0c;服务器缩减一半&#xff0c;性能反而提升4倍&#xff01…

labelme的使用

创建虚拟环境 听说是要用这个3.6版本的python环境 conda create --namelabelme python3.6激活虚拟环境 activate labelme下载labelme pip install labelme #安装labelme组件启动labelme 在你打开文件的时候推荐还是自己先建立一个label.txt 把自己要分的类别放进去 label.…

【CSP CCF】202104-2 邻域均值

题目 过程 前缀和 定义 假定一个数组&#xff0c;前缀和就是该元素前所有元素和。也就是如果我们舌钉一个数组s为前缀和数组&#xff0c;那么s[3]就是我们原数组前三个元素之和。 优势 降低计算复杂度。 如果我们要求一段区间的和&#xff0c;那么我们用普通数组要从第一…

Linux驱动开发笔记(二) 基于字符设备驱动的I/O操作

文章目录 前言一、设备驱动的作用与本质1. 驱动的作用2. 有无操作系统的区别 二、内存管理单元MMU三、相关函数1. ioremap( )2. iounmap( )3. class_create( )4. class_destroy( ) 四、GPIO的基本知识1. GPIO的寄存器进行读写操作流程2. 引脚复用2. 定义GPIO寄存器物理地址 五、…

一个 Go 实现的跨平台 GUI 框架 Fyne

今天&#xff0c;推荐一个 Go 实现的 GUI 库 - fyne。 Go 官方也没有提供标准的 GUI 框架&#xff0c;在 Go 实现的几个 GUI 库中&#xff0c;Fyne 算是最出色的&#xff0c;它有着简洁的API、支持跨平台能力&#xff0c;且高度可扩展。这也就是说&#xff0c;Fyne 是可以开发…

如果直升机一直在空中悬停,24小时后能否绕行地球一圈?

直升机悬停在空中&#xff0c;似乎给了我们一种静止的错觉。但如果直升机一直保持这种状态&#xff0c;24小时后&#xff0c;它是否能够神奇地绕地球一圈&#xff1f; 地球自转&#xff1a;直升机悬停的无形锁链 问题的答案并非像表面上看起来那样简单。要解答这个问题&#…

Win10玩红警黑屏有声音的解决方法

Win10玩红警黑屏怎么解决&#xff1f;红色警戒&#xff0c;可以说是一款深受青少年朋友喜爱的网游&#xff0c;但是&#xff0c;当我们在使用win10电脑运行红色警戒的时候免不了会出现不兼容、权限不足等问题。相信玩过红警的小伙伴都有遇到过黑屏的问题&#xff0c;那该怎么解…

弱密码系统登录之后强制修改密码

在你登录的时候&#xff0c;获取到弱密码&#xff0c;然后将他存到vuex里面&#xff0c;在登录进去之后&#xff0c;index页面再去取&#xff0c;思路是这样的 一、vuex里面定义密码字段 我是直接在user.js里面写的 import { login, logout, getInfo } from /api/login impo…

SQLmap学习以及题解运用

1.简介 SQLmap是一款开源的SQL注入工具&#xff0c;用于检测和利用Web应用程序的SQL注入漏洞。SQLmap支持多种数据库管理系统&#xff0c;包括MySQL、Oracle、PostgreSQL、Microsoft SQL Server、SQLite等&#xff0c;并支持各种不同的操作系统和平台。 这里主要分为四大部分…

计网(部分在session学习章)

TCP/UDP TCP:面向连接,先三次握手建立连接,可靠传输。 UDP:无连接,不可靠,传递的快。 TCP可靠传输 1.分块编号传输; 2.校验和,校验首部和数据的检验和,检测数据在传输中的变化; 3.丢弃重复数据; 4.流量控制,TCP 利⽤滑动窗⼝实现流量控制。TCP的拥塞控制采⽤…

一年前的Java作业,模拟游戏玩家战斗

说明&#xff1a;一年前写的作业&#xff0c;感觉挺有意思的&#xff0c;将源码分享给大家。 刚开始看题也觉得很难&#xff0c;不过写着写着思路更加清晰&#xff0c;发现也没有想象中的那么难。 一、作业题目描述&#xff1a; 题目&#xff1a;模拟游戏玩家战斗 1.1 基础功…

台灯的功能作用有哪些?护眼台灯真的护眼吗?

现在的学生会长时间使用平板、手机、电脑等&#xff0c;这些设备的屏幕会产生一定的频闪和蓝光辐射&#xff0c;也就会影响视力健康&#xff0c;而护眼养眼也成了家长关注的问题&#xff0c;视力疲劳和眼部疾病不仅影响个体的生活质量&#xff0c;还可能导致长期的健康问题。当…

IPIDEA与您分享:代理IP究竟是如何保护用户隐私的?

在信息化、网络化的今天&#xff0c;互联网已成为人们生活中不可或缺的一部分。无论是日常沟通、学习工作&#xff0c;还是娱乐休闲&#xff0c;网络都扮演着举足轻重的角色。然而&#xff0c;随着网络活动的增加&#xff0c;网络安全问题也日益凸显&#xff0c;为了保护个人隐…

Mybatis源码剖析---第二讲

Mybatis源码剖析—第二讲 那我们在讲完了mappedstatement这个类&#xff0c;它的一个核心作用之后呢&#xff1f;那下面我有一个问题想问问各位。作为mappedstatement来讲&#xff0c;它封装的是一个select标签或者insert标签。但是呢&#xff0c;我们需要大家注意的是什么&am…

LeetCode --- 398周赛

题目列表 3151. 特殊数组 I 3152. 特殊数组 II 3153. 所有数对中数位不同之和 3154. 到达第 K 级台阶的方案数 一、特殊数组I 遍历数组&#xff0c;看相邻元素的奇偶性是否相同即可&#xff0c;代码如下 class Solution { public:bool isArraySpecial(vector<int>&…

LangChain - 为何我们选择 ClickHouse 作为 LangSmith 的动力

本文字数&#xff1a;4742&#xff1b;估计阅读时间&#xff1a;12 分钟 作者&#xff1a;Ankush Gola 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 “我们在使用 ClickHouse 方面有着良好的经历。它使我们能够将 LangSmith 扩展到…

centos7.9用docker运行一个nginx容器

首先你的linux 系统里面已经安装好了docker&#xff0c;docker的安装教程看这个 1&#xff0c;下载nginx镜像 有很多文章会把镜像下载说成是拉取镜像&#xff0c; 我觉得就是下载的意思啊&#xff0c;搞不懂为什么要说拉取&#xff1f; docker pull nginx 下载最新版 Nginx …

PostgreSQL基础(二):PostgreSQL的安装与配置

文章目录 PostgreSQL的安装与配置 一、PostgreSQL的安装 二、PostgreSQL的配置 1、远程连接配置