Spring Cloud 2.2.2 源碼之十七Ribbon執行原理三
基本流程圖
DynamicServerListLoadBalancer的restOfInit
enableAndInitLearnNewServersFeature開啓服務列表更新的定時任務
開啓更新定時器:
開啓定時器,延遲10秒,間隔30秒,然後執行updateListOfServers
方法。
updateListOfServers服務列表更新
定時器開好了,會先進行一次服務列表更新。
就是上篇說的DomainExtractingServerList
的getUpdatedListOfServers
方法。
DiscoveryEnabledNIWSServerList的obtainServersViaDiscovery
最終到這裏,其實就是獲取EurekaClient
,然後調用他的方法獲取服務列表,然後封裝成DiscoveryEnabledServer
對象,放入serverList
集合返回。
private List<DiscoveryEnabledServer> obtainServersViaDiscovery() {
List<DiscoveryEnabledServer> serverList = new ArrayList<DiscoveryEnabledServer>();
...
//獲取客戶端
EurekaClient eurekaClient = eurekaClientProvider.get();
if (vipAddresses!=null){
for (String vipAddress : vipAddresses.split(",")) {
// if targetRegion is null, it will be interpreted as the same region of client
List<InstanceInfo> listOfInstanceInfo = eurekaClient.getInstancesByVipAddress(vipAddress, isSecure, targetRegion);
for (InstanceInfo ii : listOfInstanceInfo) {
if (ii.getStatus().equals(InstanceStatus.UP)) {
...
DiscoveryEnabledServer des = createServer(ii, isSecure, shouldUseIpAddr);
serverList.add(des);
}
}
if (serverList.size()>0 && prioritizeVipAddressBasedServers){
break; // if the current vipAddress has servers, we dont use subsequent vipAddress based servers
}
}
}
return serverList;
}
最後獲取到的集合還要去更新負載均衡器裏的集合,也就是BaseLoadBalancer
的allServerList
,這個就不說了,自己看下好了。
這樣ZoneAwareLoadBalancer
初始化乾的事基本說完了,開啓Ping
定時任務,和刷新服務列表任務,刷刷一次服務列表,設置負載均衡規則等設置。
好了,今天就到這裏了,希望對學習理解有幫助,大神看見勿噴,僅爲自己的學習理解,能力有限,請多包涵。