(4)什麼是Ribbon負載均衡

2022-09-20 15:18:19 字數 3014 閱讀 9630

上一節中,我們新增了@loadbalanced註解,即可實現負載均衡功能,這是什麼原理呢?

springcloud底層其實是利用了乙個名為ribbon的元件,來實現負載均衡功能的。

那麼我們發出的請求明明是http://userservice/user/1,怎麼變成了http://localhost:8081的呢?

為什麼我們只輸入了service名稱就可以訪問了呢?之前還要獲取ip和埠。

顯然有人幫我們根據service名稱,獲取到了服務例項的ip和埠。它就是loadbalancerinterceptor,這個類會在對resttemplate的請求進行攔截,然後從eureka根據服務id獲取服務列表,隨後利用負載均衡演算法得到真實的服務位址資訊,替換服務id。

我們進行原始碼跟蹤:

可以看到這裡的intercept方法,攔截了使用者的httprequest請求,然後做了幾件事:

這裡的this.loadbalancerloadbalancerclient型別,我們繼續跟入。

繼續跟入execute方法:

**是這樣的:

放行後,再次訪問並跟蹤,發現獲取的是8081:

果然實現了負載均衡。

在剛才的**中,可以看到獲取服務使通過乙個getserver方法來做負載均衡:

我們繼續跟入:

繼續跟蹤原始碼chooseserver方法,發現這麼一段**:

我們看看這個rule是誰:

這裡的rule預設值是乙個roundrobinrule,看類的介紹:

這不就是輪詢的意思嘛。

到這裡,整個負載均衡的流程我們就清楚了。

基本流程如下:

負載均衡的規則都定義在irule介面中,而irule有很多不同的實現類:

不同規則的含義如下:

內建負載均衡規則類

規則描述

roundrobinrule

簡單輪詢服務列表來選擇伺服器。它是ribbon預設的負載均衡規則。

**ailabilityfilteringrule

對以下兩種伺服器進行忽略: (1)在預設情況下,這台伺服器如果3次連線失敗,這台伺服器就會被設定為「短路」狀態。短路狀態將持續30秒,如果再次連線失敗,短路的持續時間就會幾何級地增加。 (2)併發數過高的伺服器。如果乙個伺服器的併發連線數過高,配置了**ailabilityfilteringrule規則的客戶端也會將其忽略。併發連線數的上限,可以由客戶端的..activeconnectionslimit屬性進行配置。

weightedresponsetimerule

為每乙個伺服器賦予乙個權重值。伺服器響應時間越長,這個伺服器的權重就越小。這個規則會隨機選擇伺服器,這個權重值會影響伺服器的選擇。

zone**oidancerule

以區域可用的伺服器為基礎進行伺服器的選擇。使用zone對伺服器進行分類,這個zone可以理解為乙個機房、乙個機架等。而後再對zone內的多個服務做輪詢。

best**ailablerule

忽略那些短路的伺服器,並選擇併發數較低的伺服器。

randomrule

隨機選擇乙個可用的伺服器。

retryrule

重試機制的選擇邏輯

預設的實現就是zone**oidancerule,是一種輪詢方案

通過定義irule實現可以修改負載均衡規則,有兩種方式:

@bean

public irule randomrule()

userservice: # 給某個微服務配置負載均衡規則,這裡是userservice服務

ribbon:

nfloadbalancerruleclassname: com.netflix.loadbalancer.randomrule # 負載均衡規則

注意,一般用預設的負載均衡規則,不做修改。

ribbon預設是採用懶載入,即第一次訪問時才會去建立loadbalanceclient,請求時間會很長。

而飢餓載入則會在專案啟動時建立,降低第一次訪問的耗時,通過下面配置開啟飢餓載入:

ribbon:

eager-load:

enabled: true

clients: userservice

Ribbon負載均衡

在resttemplate feign zuul中都整合了ribbon負載均衡,其中ribbon負載均衡通過iruler介面來實現,總共有6種實現類 其中預設配置方式為簡單輪詢,自定義配置有兩種 1 配置config ribbonclients defaultconfiguration defaul...

Ribbon負載均衡

ribbon主要功能是提供客戶端的軟體負載均衡演算法,提供一系列完整的配置項,例如連線超時 重試等。在eureka的自動配置依賴模組spring cloud starter eureka中,已經整合了ribbon,可以直接使用ribbon來實現客戶端的負載均衡 在eureka中使用ribbon十分簡...

Ribbon負載均衡

什麼是負載均衡?負載均衡 簡單的講就是將使用者的請求均勻的分發到多台伺服器上。使用ribbon實現負載均衡 因為eureka中已經整合了ribbon,所以我們無需引入新的依賴,直接修改 在呼叫服務方加註解,本次使用的是spring在resttemplate的配置方法上新增 loadbalanced註...