1. 程式人生 > >springcloud-consul-ribbon詳解

springcloud-consul-ribbon詳解

Ribbon是一個客戶端負載均衡器,它可以很好地控制HTTP和TCP客戶端的行為。Feign已經預設使用了Ribbon(參考文章)

一、先來看看ribbon的幾個核心類

1、IClientConfig 預設實現類DefaultClientConfigImpl,主要用來配置ribbon客戶端的相關屬性配置

2、ServerListUpdater預設實現類PollingServerListUpdater,主要負責動態更新伺服器列表

  • start方法呼叫後會啟動一個定時任務,延時1s開始執行,以每30s的時間間隔週期執行

    • 週期時間間隔可以通過ribbon.ServerListRefreshInterval=1000
      或者ribbonClientName.ribbon.ServerListRefreshInterval=1000來設定
  • start方法的啟動由DynamicServerListLoadBalancer初始化的時候執行呼叫

3、ServerList獲取伺服器列表

  • 預設實現類ConfigurationBasedServerList,預設是從配置檔案取伺服器列表,這樣配置[ribbonClinetName].ribbon.listOfServers=xxx,xxx
  • ConsulServerList引入consul作服務發現的實現類,主要負責獲取註冊中心的伺服器列表

    備註:可以通過配置來擴充套件自己的ServerList實現,像這樣:[ribbonClient].ribbon.NIWSServerListClassName=類名

4、ServerListFilter伺服器列表過濾器

  • 預設實現類ZonePreferenceServerListFilter主要根據分割槽來過濾伺服器列表
  • HealthServiceServerListFilter引入consul服務發現的實現類,主要負責過濾consul健康檢查通過的伺服器列表(在ConsulServerList中會獲取所有的伺服器列表,包括健康檢查沒有通過的伺服器)

    備註:可以通過配置來擴充套件自己的ServerList

    實現,像這樣[ribbonClient].ribbon.NIWSServerListFilterClassName=類名

5、IPing檢查伺服器是否或者

  • 預設實現DummyPing,這是一個假的檢測著,永遠返回是true
  • ConsulPing,引入consul服務發現的實現類,主要根據consul返回的checks引數來判斷伺服器是否活著,跟HealthServiceServerListFilter的過濾判斷一樣

    備註:可以通過配置來擴充套件自己的ServerList實現,像這樣:[ribbonClient].ribbon.NFLoadBalancerPingClassName=類名

6、IRule負載均衡選擇器

  • 預設實現ZoneAvoidanceRule,複合判斷server所在區域的效能和server的可用性選擇server
  • RandomRule:隨機選擇一個server
  • RoundRobinRule:roundRobin方式輪詢選擇server
  • RetryRule:對選定的負載均衡策略機上重試機制。
  • WeightedResponseTimeRule:根據響應時間分配一個weight,響應時間越長,weight越小,被選中的可能性越低。
  • AvailabilityFilteringRule:過濾掉那些因為一直連線失敗的被標記為circuit tripped的後端server,並過濾掉那些高併發的的後端server(active connections 超過配置的閾值)
  • BestAvailableRule:選擇一個最小的併發請求的server

image

7、ILoadBalancer負載均衡總控制器,預設實現類ZoneAwareLoadBalancer,其啟動了整個負載均衡客戶端

  • 可以通過配置來擴充套件自己的ServerList實現,像這樣:[ribbonClient].ribbon.NFLoadBalancerClassName=類名

    負載均衡器啟動時序圖:

  • 初始化時首先會初始化一個定時任務,每隔30s執行一次,快取裡面會儲存所有從註冊中心獲取例項列表allServerList和經過ping成功的例項列表upServerList,但是負載均衡的時候拿到的列表是allServerList而非upServerList,不明白這個ping的意義在哪裡
  • 啟動一個定時任務,定時從註冊中心拉取服務列表,每個30s執行一次
  • 初始化獲取服務列表,拉取到的服務列表經過ServiceFilter過濾後儲存在快取裡面

當客戶端發起呼叫的時候會呼叫ILoadBalancer的chooseServer方法,根據IRule的負載均衡演算法選擇一個例項返回給呼叫者.