一、同步配置(ConfigService)
Nacos客戶端里負責配置同步的是NacosConfigService
偿曙,它里面有一個ClientWorker
围小。在nacos1.4里是有個executor
線程池去跑checkConfigInfo()
方法來長輪詢拉取配置。nacos2.0宵睦,ClientWorker
里面有個ConfigRpcTransportClient
的agent
,他里面有個executor
線程池墅诡,執(zhí)行executeConfigListen()
方法拉取配置壳嚎。長輪詢拉取配置的過程:
在一個死循環(huán)里,發(fā)送請求給nacos服務端去獲取發(fā)生了變化的配置的changedGroupKeys
(即namespace末早,groupid烟馅,dataid信息),如果獲取到了然磷,在用這些key去獲取具體的配置郑趁。
這個請求發(fā)送到nacos服務端時,nacos服務端根據(jù)請求里的想要監(jiān)聽的配置計算一下MD5姿搜,跟服務端的數(shù)據(jù)對比一下寡润,如果不一樣捆憎,說明發(fā)生了變化,那就返回梭纹。否則創(chuàng)建一個任務(里面包含請求數(shù)據(jù))放到一個集合allSubs
里躲惰,然后通過定時器執(zhí)行此任務,30s(isFixedPolling的話29.5s)后執(zhí)行变抽,將此任務移出allSubs
础拨,如果配置發(fā)生了變化,那就響應相應的key绍载。這是服務端處理請求的邏輯诡宗,而在這30s之內(nèi),當服務端配置發(fā)生變化時逛钻,會發(fā)布一個事件僚焦,事件監(jiān)聽器在收到事件后锰提,遍歷allSubs
曙痘,判斷里面的請求的keys是否包含當前變化的key,如果有那就響應立肘。
二边坤、同步服務(NamingService)
- 客戶端發(fā)起事件訂閱后,HostReactor中有UpdateTask線程谅年,每10s發(fā)送一次Pull請求茧痒,獲得服務端最新的地址列表
- 服務端與服務提供者的實例之間維持了心跳檢測,一旦服務提供者出現(xiàn)異常融蹂,則會發(fā)送一個Push消息給Nacos客戶端旺订,也就是服務消費者
- 服務消費者收到請求后,使用HostReactor的processServiceJSON方法解析消息超燃,更新本地服務地址列表区拳。