初識 Nacos
Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu) (例如微服務(wù)范式泡态、云原生范式) 的服務(wù)基礎(chǔ)設(shè)施,
能快速實現(xiàn)動態(tài)服務(wù)發(fā)現(xiàn)、服務(wù)配置怀骤、服務(wù)元數(shù)據(jù)及流量管理,是 alibaba 開源注冊中心中間件。
數(shù)據(jù)流程
了解了 nacos 的基本概念之后,我們繼續(xù)昨天的話題壁肋,昨天配置 nacos 的數(shù)據(jù)同步方式時号胚,出現(xiàn)了一個 bug。雖然后面利用配置好的各種數(shù)據(jù)浸遗,按同步按鈕還是能啟動的猫胁。但是這么做就不是那么的完美。那我們今天來 Debug 一下他的一個流程跛锌。
soul-admin 端
我們將斷點打在 DataChangedEventDispatcher#afterPropertiesSet 的方法下弃秆,啟動 admin, 發(fā)現(xiàn)斷點是可以到這里的髓帽。
執(zhí)行完后啟動成功驾茴,請注意這里是沒有初始化 nacos 步驟的,這幾天應(yīng)該會把這個優(yōu)化掉氢卡,因為 zookeeper 是有 初始化這個步驟的。
當斷點打在 DataChangedEventDispatcher#onApplicationEvent
的 plugin case 時晨缴, 點擊 admin 后臺 System Manage > Plugin > Synchronized All Data
時译秦,出現(xiàn)了以下情況,說明已經(jīng)成功這步击碗。
查看 nacos 的后臺筑悴,soul.plugin.json
, soul.auth.json
, soul.selector.json
, soul.rule.json
, soul.meta.json
這些 data-id
是否都存在。如果都存在稍途,說明到 nacos 的數(shù)據(jù)同步已經(jīng)完成阁吝。
同步數(shù)據(jù)到 nacos 大致流程如下:
bootstrap 端
根據(jù)啟動 bootstrap,我們在命令行終端查看到
2021-01-23 07:31:01.211 INFO 13161 --- [ main] d.s.s.s.s.d.n.NacosSyncDataConfiguration : you use nacos sync soul data.......
全文檢索日志得知械拍,NacosSyncDataConfiguration
會在啟動時注冊3個 bean突勇,
- NacosSyncDataService : Nacos 數(shù)據(jù)同步的服務(wù)
查看他的構(gòu)造函數(shù): NacosSyncDataService :
public NacosSyncDataService(final ConfigService configService, final PluginDataSubscriber pluginDataSubscriber,
final List<MetaDataSubscriber> metaDataSubscribers, final List<AuthDataSubscriber> authDataSubscribers) {
super(configService, pluginDataSubscriber, metaDataSubscribers, authDataSubscribers);
start();
}
start() 會去更新 updatePluginMap,這時 pluginDataSubscriber 會重新訂閱這條插件數(shù)據(jù)坷虑,然后更新緩存
- ConfigService: Nacos config service
- NacosConfig : nacos 的配置
然后我在更新一條數(shù)據(jù)甲馋,start() 中的 watcherData() ,會監(jiān)聽到配置的改變迄损,
protected void watcherData(final String dataId, final OnChange oc) {
Listener listener = new Listener() {
@Override
public void receiveConfigInfo(final String configInfo) {
oc.change(configInfo);
}
@Override
public Executor getExecutor() {
return null;
}
};
oc.change(getConfigAndSignListener(dataId, listener));
LISTENERS.getOrDefault(dataId, new ArrayList<>()).add(listener);
}
然后進行數(shù)據(jù)的改變定躏。大致的流程圖如下: