spring cloud ribbon源碼解析(二)
在上一篇文章中主要梳理了ribbon的執行過程,這篇主要講講ribbon的負載均衡,ribbon的負載均衡是通過ILoadBalancer來實現的,對ILoadBalancer有以下幾個類
1、AbstractLoadBalancer
AbstractLoadBalancer是對ILoadBalancer的具體實現,通過枚舉類定義了ALL:所有服務、STATUS_UP正常服務、STATUS_NOT_UP停止的服務。通過getServerList傳入不同的分組獲取不同的服務列表。
2、BaseLoadBalancer
BaseLoadBalancer繼承AbstractLoadBalancer,是ribbon負載均衡的基礎實現類,定義並維護了兩個服務實例列表,一個是所有服務,一個維護了正常的服務,定義了檢查服務是否正常的IPing,定義了負載均衡的處理規則IRule,執行策略IPingStrategy。IPing的默認執行間隔為10秒。
實現了ILoadBalancer的方法:
- addServers向負載均衡加入新的服務實例
- markServerDown標記服務實例不可用
- getReachableServers獲取可用的服務實例
- getAllServers獲取所有服務實例
3、DynamicServerListLoadBalancer
DynamicServerListLoadBalancer是對BaseLoadBalancer的擴展,實現了服務實例運行中動態更新的能力,同時也具有對服務實例過濾的功能
- 更新服務實例
進入serverListUpdater服務更新器,其中定義了一些控制和獲取信息的操作
- 過濾服務實例
4、ZoneAwareLoadBalancer
ZoneAwareLoadBalancer是對DynamicServerListLoadBalancer的擴展,在之前幾個負載均衡類中沒有重寫chooseServer,都是使用BaseLoadBalancer的RoundRobbinRule,采用輪詢的方式,並沒有zone的概念,這樣會導致跨區域的時候導致延遲,產生性能問題,ZoneAwareLoadBalancer則可以避免這個問題。
- 當zone小於等於1還是按原來的方式,只有大於1才會執行接下來的策略;
- 調用createSnapshot為所有區域創建快照;
- 使用getAvailableZones獲取可用區域;
- randomChooseZone隨機選擇某個區域;
- 區域確定後獲取到負載均衡器,並調用chooseServer來選擇具體服務實例。
spring cloud ribbon源碼解析(二)