本文是數(shù)據(jù)同步 zookeeper 系列的第二篇文章,主要講從代碼出發(fā),講解數(shù)據(jù)怎么從啟動(dòng),到更新操作等,是怎么同步到網(wǎng)關(guān)端的流程。
前文概要性的介紹了 zookeeper 的概念和它的主要特性,介紹了 Soul 網(wǎng)關(guān)是怎么配置 Zookeeper 的。
admin 端
admin 啟動(dòng)時(shí)
2021-01-25 23:00:40.661 INFO 32864 --- [-localhost:2181] org.I0Itec.zkclient.ZkEventThread : Starting ZkClient event thread.
...
2021-01-25 23:00:40.692 INFO 32864 --- [ main] org.apache.zookeeper.ZooKeeper : Initiating client connection, connectString=localhost:2181 sessionTimeout=5000 watcher=org.I0Itec.zkclient.ZkClient@4eb9ae4d
...
2021-01-25 23:02:06.010 ERROR 32864 --- [upstream-task-1] o.d.s.a.s.impl.UpstreamCheckService : check the url=192.168.0.1:22 is fail
從日志中得出,啟動(dòng)后會(huì)有心跳檢測(cè)。接下來注意看 zooInspector 連接 Zookeeper 的變化,

由此可以看出,Zookeeper 的方式是有初始化數(shù)據(jù)的功能的。對(duì)比之前的 nacos 是沒有,現(xiàn)在的 nacos 已經(jīng)有了,詳見 issue1052。
查看源碼得出,在啟動(dòng)時(shí) admin 會(huì)注入 ZkClient 和 ZookeeperDataInit,DataChangedListener 的 Bean。這里的 ZookeeperDataInit 就是初始化 Zookeeper 中數(shù)據(jù)的。 ZookeeperDataChangedListener 實(shí)現(xiàn)了 DataChangedListener 。 大致流程圖如下:

admin 更新數(shù)據(jù)時(shí)
打開 admin 的管理后臺(tái),配置信息時(shí),會(huì)發(fā)布一個(gè) DataChangedEvent,DataChangedListener 就會(huì)監(jiān)聽到此時(shí)的變化,從而做出相應(yīng)的變化。大致的流程圖如下圖所示:

之前一直沒有注意到點(diǎn)的是:PluginTransfer 是一個(gè)接口, 而這個(gè)接口的實(shí)現(xiàn)類都是怎么來的。 這里用了一個(gè)插件 mapstruct
admin 的基本分析完了, 它的主要職責(zé)是將數(shù)據(jù)同步到 Zookeeper 上。不管剛啟動(dòng)還是啟動(dòng)后它就會(huì)觸發(fā) DataChangedEvent 事件,然后經(jīng)過一系列的操作, 最后由 ZkClient 將數(shù)據(jù)同步到 Zookeeper。 總體來說,流程比較簡(jiǎn)單。