📢 本文由 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 實作可以修改負載平衡規則,有兩種方式:
- 程式碼方式:在配置類別中,定義一個新的 IRule (全域設定)
| |
- 設定檔方式:在 orderServer application.yml 檔案中,新增設定以修改規則
| |
懶載入
Ribbon 預設是採用懶載入 (Lazy Load),即第一次存取時才會去建立 LoadBalanceClient,請求時間會很長;而預先載入 (Eager Load) 則會在專案啟動時建立,降低第一次存取的耗時。配置開啟預先載入:
| |