上一節中,我們新增了@loadbalanced註解,即可實現負載均衡功能,這是什麼原理呢?
springcloud底層其實是利用了乙個名為ribbon的元件,來實現負載均衡功能的。
那麼我們發出的請求明明是http://userservice/user/1,怎麼變成了http://localhost:8081的呢?
為什麼我們只輸入了service名稱就可以訪問了呢?之前還要獲取ip和埠。
顯然有人幫我們根據service名稱,獲取到了服務例項的ip和埠。它就是loadbalancerinterceptor
,這個類會在對resttemplate的請求進行攔截,然後從eureka根據服務id獲取服務列表,隨後利用負載均衡演算法得到真實的服務位址資訊,替換服務id。
我們進行原始碼跟蹤:
可以看到這裡的intercept方法,攔截了使用者的httprequest請求,然後做了幾件事:
這裡的this.loadbalancer
是loadbalancerclient
型別,我們繼續跟入。
繼續跟入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註...