本文主要接者上文說的 admin 的流程翠拣,討論一下 Bootstrap 端的流程和 Zookeeper 數(shù)據(jù)同步方式的時序圖萍程。
Bootstrap 端
啟動 bootStrap 時,命令行的日志顯示 zkClient 啟動并完成了數(shù)據(jù)同步咱枉。
2021-01-26 11:34:58.346 INFO 34694 --- [ main] s.b.s.d.z.ZookeeperSyncDataConfiguration : you use zookeeper sync soul data.......
2021-01-26 11:34:58.354 INFO 34694 --- [-localhost:2181] org.I0Itec.zkclient.ZkEventThread : Starting ZkClient event thread.
...
2021-01-26 11:34:58.445 INFO 34694 --- [ain-EventThread] org.I0Itec.zkclient.ZkClient : zookeeper state changed (SyncConnected)
啟動時
soul 封裝了自己的 boot湾碎,將 ZookeeperSyncDataConfiguration
納入自動配置中觉增。
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.dromara.soul.spring.boot.sync.data.zookeeper.ZookeeperSyncDataConfiguration
ZookeeperSyncDataConfiguration
中 SyncDataService
, ZkClient
注冊了 Bean孕锄,而 ·SyncDataService
是個接口類吮廉,實際上是 ZookeeperSyncDataService
, 該實現(xiàn)的構(gòu)造函數(shù)中含有 watcherData, watchAppAuth畸肆, watchMetaData 的方法宦芦, 這個三個方法都是都是直接或者間接更新本地的緩存,并調(diào)用 zkClient.subscribeDataChanges 開啟監(jiān)聽 Zookeeper 的數(shù)據(jù)變更轴脐。
大致流程圖如下:
這個流程重在 ZookeeperSyncDataService 中调卑。
更新數(shù)據(jù)時
由于啟動時, zkClient.subscribeDataChanges 也開啟了數(shù)據(jù)變化監(jiān)聽大咱, 以更改 rule 為例恬涧, 在 subscribeRuleDataChanges 方法中得到看出:
private void subscribeRuleDataChanges(final String path) {
zkClient.subscribeDataChanges(path, new IZkDataListener() {
@Override
public void handleDataChange(final String dataPath, final Object data) {
cacheRuleData((RuleData) data);
}
...
});
}
zkClient 訂閱到了 Zookeeper 的數(shù)據(jù)變更,最終在 CommonPluginDataSubscriber#subscribeDataHandler 的方法中徽级,進行配置的更新气破。大致如下:
時序圖
經(jīng)過 admin 端和 bootstrap 端的數(shù)據(jù)流轉(zhuǎn),再此總結(jié)一下總的時序圖餐抢。
總結(jié)
- Zookeeper 數(shù)據(jù)同步的大體思想和之前的 Nacos 很相近现使,都是先寫入注冊中心,然后 bootstrap 端從注冊中心拿數(shù)據(jù)旷痕。
- 利用 MapStruct 生成對應(yīng)的實現(xiàn)類碳锈,可以在日常開發(fā)中使用。Mapping Frameworks 的對比
- Zookeeper 的 watch 機制還需要進一步的深入欺抗。
- 時序圖和 uml 的表達方式還得再加強售碳。