1. 程式人生 > >spring cloud ribbon源碼解析(二)

spring cloud ribbon源碼解析(二)

abstract update rdo create 9.png 均衡器 nap 策略 cse

  在上一篇文章中主要梳理了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源碼解析(二)