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然后對服務總數求模取余的操作,然后不斷返回下標,不斷的返回相應下標的服務

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17757.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17757.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17757.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

爬蟲在金融領域的應用:股票數據收集

介紹 在金融領域&#xff0c;準確及時的數據收集對于市場分析和投資決策至關重要。股票價格作為金融市場的重要指標之一&#xff0c;通過網絡爬蟲技術可以高效地從多個網站獲取實時股票價格信息。本文將介紹網絡爬蟲在金融領域中的應用&#xff0c;重點討論如何利用Scrapy框架…

展銳平臺+Android系統開發概要

文章目錄 一、縮略語二、系統分區1. UIS7885android13的系統分區 三、系統編譯四、開發調試 一、縮略語 BBAT&#xff1a;Baseband Auto Test&#xff0c;基帶自帶測試CRC&#xff1a;Cyclic Redundancy Check&#xff0c;循環冗余檢驗SPL&#xff1a;Secondary Program Loade…

給uniapp的擴展組件uni-file-picker設置默認顯示的圖片

官方給出的代碼如下所示&#xff0c;但是按照官網給出的代碼圖片并沒有顯示出來。 <template><uni-file-picker readonly :value"fileLists" :imageStyles"imageStyles" file-mediatype"image"></uni-file-picker> </temp…

FLutter里的“線程” 一文通關

前言 在Flutter中&#xff0c;啟動一個新線程來處理任務通常是指在另一個隔離區(isolate)中執行代碼。由于Dart使用單線程模型&#xff0c;它通過隔離區來實現并發。隔離區是獨立的執行線程&#xff0c;不共享內存&#xff0c;通過消息傳遞來通信。這種方法可以用來運行長時間…

JavaScript 自定義屬性操作

在 JavaScript 中&#xff0c;可以使用自定義屬性來存儲與元素相關的數據。自定義屬性允許開發人員在元素上存儲任何類型的數據&#xff0c;包括字符串、數字、對象等。接下來&#xff0c;我將詳細解析如何在 JavaScript 中操作自定義屬性&#xff0c;并提供相應的代碼示例。 …

四川農業大學Java實訓項目圓滿收官,匯智知了堂引領學子實踐創新

近日&#xff0c;四川農業大學與匯智知了堂共同舉辦的Java實訓項目正式迎來了項目匯報階段。本次實訓是匯智知了堂在高等教育領域深化校企合作、推動產教融合的一次重要實踐&#xff0c;旨在為廣大學子提供一個將理論知識與實際操作相結合的平臺。 在實訓過程中&#xff0c;匯…

cherry-markdown公式不好選中的問題

在我上一篇博客中&#xff0c;在解決公式插入預覽無效之后&#xff0c;還f發現cherry-markdown是通過css的:hover來進行公式的展示&#xff0c;導致不好選中 上一篇博客速達&#xff1a;cherry-markdown公式能插入但是預覽無效-CSDN博客 下面是解決方案&#xff0c;其實就是改…

selenium源碼學習

這里寫自定義目錄標題 歡迎使用Markdown編輯器新的改變功能快捷鍵合理的創建標題&#xff0c;有助于目錄的生成如何改變文本的樣式插入鏈接與圖片如何插入一段漂亮的代碼片生成一個適合你的列表創建一個表格設定內容居中、居左、居右SmartyPants 創建一個自定義列表如何創建一個…

vr數字成果展在線展示突破用戶傳統認知

想要輕松搭建一個充滿互動與創意的3D數字展廳嗎?vr互動數字展廳搭建編輯器將是您的不二之選!華銳視點3D云展平臺提供的vr互動數字展廳搭建編輯器將空間重建與互動制作完美結合&#xff0c;讓您輕松實現3D空間的搭建與互動營銷制作。 在vr互動數字展廳搭建編輯器的幫助下&#…

ai語音機器人工作的原理流程電銷機器人部署

ai機器人電銷其實就相當于一個程序&#xff0c;可以代替人工進行一個電話外呼工作&#xff0c;可以模擬真人對話、智能回答客戶問題。 其實機器人這個東西很早之前就已經有了&#xff0c;但是近幾年&#xff0c;才被電銷企業所應用。目前ai機器人電銷已經取代了一部分人工&…

牛客題霸-SQL大廠面試真題(一)

本文基于前段時間學習總結的 MySQL 相關的查詢語法&#xff0c;在牛客網找了相應的 MySQL 題目進行練習&#xff0c;以便加強對于 MySQL 查詢語法的理解和應用。 由于涉及到的數據庫表較多&#xff0c;因此本文不再展示&#xff0c;只提供 MySQL 代碼與示例輸出。 以下內容是…

抖店類目錯放怎么辦?怎么改類目?快速解決抖店類目錯放問題

大家好&#xff0c;我是電商花花。 我們運營抖音小店的時候&#xff0c;都知道不要放錯類目&#xff0c;也知道放錯類目的后果&#xff0c;類目錯放可能導致商品無法在正確的類目中展示&#xff0c;從而影響到商品的一個曝光率。 嚴重的話還被平臺扣分&#xff0c;扣保證金&a…

隱藏服務器源IP怎么操作,看這一篇學會!

在當今的網絡環境中&#xff0c;服務器作為信息和服務的中樞&#xff0c;常駐于公網之上&#xff0c;面臨著各式各樣的安全威脅&#xff0c;其中&#xff0c;分布式拒絕服務&#xff08;DDoS&#xff09;攻擊尤為猖獗&#xff0c;它通過協調大量計算機同時向目標服務器發送請求…

跳繩步法匯總

跳繩步法 跳繩是一項多樣化且富有樂趣的運動&#xff0c;擁有許多不同的步法和技巧。以下是一些常見的跳繩步法&#xff1a; 1. 基本步法 雙腳并跳&#xff1a;雙腳并攏一起跳&#xff0c;每次跳繩通過腳下時雙腳同時離地。單腳跳&#xff1a;用一只腳跳&#xff0c;另一只腳…

設計一套Kafka到RocketMQ的雙寫+雙讀技術方案,實現無縫遷移!

設計一套Kafka到RocketMQ的雙寫雙讀技術方案&#xff0c;實現無縫遷移&#xff01; 1、背景2、方案3、具體邏輯 1、背景 假設你們公司本來線上的MQ用的主要是Kafka&#xff0c;現在要從Kafka遷移到RocketMQ去&#xff0c;那么這個遷移的過程應該怎么做呢&#xff1f;應該采用什…

JAVA開發面試超詳細

一、Java 基礎 1.JDK 和 JRE 有什么區別&#xff1f; jdk&#xff1a;java development kit jre&#xff1a;java runtime Environment jdk是面向開發人員的&#xff0c;是開發工具包&#xff0c;包括開發人員需要用到的一些類。 jre是java運行時環境&#xff0c;包括java虛擬機…

Selenium探險家:駕馭Web自動化的秘籍與實戰

Hi&#xff0c;我是阿佑&#xff0c;今天將帶大伙們學會如何使用Selenium進行高效的網站測試&#xff0c;如何配置Selenium Grid實現分布式測試&#xff0c;以及如何預測和擁抱自動化測試的未來&#xff01; 文章目錄 1. 引言2. 背景介紹2.1 Selenium概覽2.2 Python與Selenium的…

python數據可視化:自定義閉合區域填充顏色matplotlib.pyplot.fill()

【小白從小學Python、C、Java】 【考研初試復試畢業設計】 【Python基礎AI數據分析】 python數據可視化&#xff1a; 自定義閉合區域填充顏色 matplotlib.pyplot.fill() [太陽]選擇題 以下關于matplotlib.pyplot.fill()函數說法正確的是&#xff1f; import matplotlib.pyplo…

【ARM+Codesys案例】T3/RK3568/樹莓派+Codesys鋰電疊片機方案:結合CODESYS實現高效生產

鋰電疊片機解決方案 乘風破浪&#xff0c;促進新能源行業發展 鋰電池是依靠鋰離子在正極與負極之間移動來達到充放電目的的一種可充電電池&#xff0c;具有高能量密度、高電壓、壽命長、無記憶效應等優點。鋰電池屬于國家政策扶持的高速發展行業&#xff0c;近年發展快速&…

【Beyond Compare】專業的文件對比工具

一、Beyond Compare官方下載 二、Beyond Compare簡介 三、Beyond Compare 4激活 一、Beyond Compare官方下載 Beyond Compare官方下載 https://www.beyondcompare.cc/ Beyond Compare 4中文包 鏈接&#xff1a;https://pan.baidu.com/s/14igdUm0Xy7DFp4Jzb58AZg?pwdGLNG 提…