Ribbon 負載平衡

📢 本文由 gemini-3-flash-preview 翻譯

消費者發送請求會被 Ribbon 攔截,Ribbon 從 Eureka 取得提供者列表,Eureka 回傳提供者列表,Ribbon 根據 IRule 選擇伺服器發送請求。

詳細攔截:請求 -> DynamicServerListLoadBalancer (獲取 URL 中的服務 ID, userService) -> DynamicServerListLoadBalancer -> Eureka -> DynamicServerListLoadBalancer -> IRule -> DynamicServerListLoadBalancer -> 發送請求

負載平衡策略

內建負載平衡規則類別規則描述
ZoneAvoidanceRule (Eureka 預設)以區域可用的伺服器為基礎進行伺服器的選擇。使用 Zone 對伺服器進行分類,這個 Zone 可以理解為一個機房、一個機架等。而後再對 Zone 內的多個服務做輪詢
RoundRobinRule簡單輪詢服務列表來選擇伺服器。它是 Ribbon 預設的負載平衡規則
AvailabilityFilteringRule對以下兩種伺服器進行忽略:
(1)在預設情況下,這台伺服器如果 3 次連線失敗,這台伺服器就會被設置為「短路」狀態。短路狀態將持續 30 秒,如果再次連線失敗,短路的持續時間就會呈幾何級數增加
(2)併發數過高的伺服器。如果一個伺服器的併發連線數過高,配置了 AvailabilityFilteringRule 規則的用戶端也會將其忽略。併發連線數的上限,可以由用戶端的 <clientName>.<clientConfigNameSpace>.ActiveConnectionsLimit 屬性進行配置
WeightedResponseTimeRule為每一個伺服器賦予一個權重值。伺服器回應時間越長,這個伺服器的權重就越小。這個規則會隨機選擇伺服器,這個權重值會影響伺服器的選擇
BestAvailableRule忽略那些短路的伺服器,並選擇併發數較低的伺服器
RandomRule隨機選擇一個可用的伺服器
RetryRule重試機制的選擇邏輯

使用隨機策略

透過定義 IRule 實作可以修改負載平衡規則,有兩種方式:

  1. 程式碼方式:在配置類別中,定義一個新的 IRule (全域設定)
1
2
3
4
@Bean
public IRule randomRule(){
    return new RandomRule();
}
  1. 設定檔方式:在 orderServer application.yml 檔案中,新增設定以修改規則
1
2
3
userService: # 為某個微服務配置負載平衡規則,這裡是 userservice 服務
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule # 負載平衡規則 

懶載入

Ribbon 預設是採用懶載入 (Lazy Load),即第一次存取時才會去建立 LoadBalanceClient,請求時間會很長;而預先載入 (Eager Load) 則會在專案啟動時建立,降低第一次存取的耗時。配置開啟預先載入:

1
2
3
4
ribbon:
  eager-load:
    enabled: true
    clients: userService # 指定對 userService 這個服務進行預先載入
This post is licensed under CC BY-NC-SA 4.0 by the author.
最後更新 2025-02-05 17:27 +0900