springcloud-consul-ribbon詳解
阿新 • • 發佈:2018-11-07
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
:隨機選擇一個serverRoundRobinRule
:roundRobin方式輪詢選擇serverRetryRule
:對選定的負載均衡策略機上重試機制。WeightedResponseTimeRule
:根據響應時間分配一個weight,響應時間越長,weight越小,被選中的可能性越低。AvailabilityFilteringRule
:過濾掉那些因為一直連線失敗的被標記為circuit tripped的後端server,並過濾掉那些高併發的的後端server(active connections 超過配置的閾值)BestAvailableRule
:選擇一個最小的併發請求的server
7、ILoadBalancer
負載均衡總控制器,預設實現類ZoneAwareLoadBalancer
,其啟動了整個負載均衡客戶端
- 可以通過配置來擴充套件自己的
ServerList
實現,像這樣:[ribbonClient].ribbon.NFLoadBalancerClassName=類名
負載均衡器啟動時序圖:
- 初始化時首先會初始化一個定時任務,每隔30s執行一次,快取裡面會儲存所有從註冊中心獲取例項列表allServerList和經過ping成功的例項列表upServerList,但是負載均衡的時候拿到的列表是allServerList而非upServerList,不明白這個ping的意義在哪裡
- 啟動一個定時任務,定時從註冊中心拉取服務列表,每個30s執行一次
- 初始化獲取服務列表,拉取到的服務列表經過ServiceFilter過濾後儲存在快取裡面
當客戶端發起呼叫的時候會呼叫ILoadBalancer的chooseServer方法,根據IRule的負載均衡演算法選擇一個例項返回給呼叫者.