1.5.1 Soul Admin Zookeeper 發布更新
我們還是從上次的入口進來 DataChangedEventDispatcher 的 onApplicationEvent 方法,我們開啟Zookeeper發送數據后,在 DataSyncConfiguration 中定義假如存在soul.sync.zookeeper 參數則會注入 zookeeperDataChangedListener 監聽器。
這里使用到@Import注解,該注解主要作用是用來導入@Configuration注解的配置類,這里我們只有但含有 Zookeeper 的配置項才可以注入ZookeeperListener 同理也只有在這個時候才會注入 ZookeeperConfiguration 類。我們看 ZookeeperProperties 類 @ConfigurationProperties 注解是假如沒有@Component 注解配合,Spring 是不會自動作為Bean注入的,需要使用@EnableConfigurationProperties 把使用 @ConfigurationProperties 的類進行了一次注入。
這里會根據 Zookeeper 的 Url new 了一個ZKClinet 作為后面數據寫入的客戶端。zookeeperDataChangedListener 再根據注入的這個ZkClient ,這里還有一個類就是 ZookeeperDataInit 它主要是實現了CommandLineRunner 這是 Spring 中程序啟動之前執行任何任務,這里是判斷zk 是否存在需要監聽的路徑,假如沒有則調用 SyncDataService 的syncAll 方法,這里和我們看到的WebSocket是一致的,最終將 Plugin ,Selector 和 Rule 三種數據通知個對應的 Listener , 這里就是調用到剛剛初始化完成的 zookeeperDataChangedListener 。
我們以Selector 為例,這里最終調用 createSelector 進行創建。
先創建對應的path,然后再根據Selector 的id 生產下一級路徑,最后將Selector 的 data 寫入該節點。
我們使用zookeeperInspect 查看,這里的數據已經寫入Zookeeper ,最終這里寫入了我們數據庫所有的數據。這里是直接使用 java 內置的序列化方式。
1.5.2 Soul BootStrap Zookeeper 同步數據
Soul BootStrap 使用Zookeeper 同步數據的主要配置類是 ZookeeperSyncDataConfiguration ,通過ZookeeperConfig 自動化生產 Zkclient。
ZookeeperSyncDataConfiguration 初始化主要做了三件事,就是綁定 data meta 和 auth 數據的監聽事件。我們從 selector 作為出發點,所以觸發的方法是 watcherData。
首先Soul 獲取了/soul/plugin 路徑下的所有插件信息。然后遍歷每個插件,調用 watcherAll 方法,監聽該插件的 Plugin Selector 和 Rule 信息。
我們看一下Hystrix 插件的 watchSelector 方法,它先看該節點下是否存在插件的selector 數據,假如有則將所有數據拿回來進行遍歷。
然后更新本地內存,這里主要是通知各個 plugin 插件更新內存數據。這里通過 pluginDataSubscriber 拿到各個插件數據處理的 Handler 進行數據處理。接著Soul為每一個子節點添加添加訂閱者,訂閱節點的數據變化。
我們觀察每個ZkDataListener 主要監聽Datachange 事件和DataDelete事件。
這里還是還是調用 cacheSelectorData 方法 ,主要還是調用 CommonPluginDataSubscriber 的 onSelectorSubscribe 方法,這里的 DataCache 就是緩存了所有數據的工廠,我們只需要更新這個工廠的數據。接著調用該插件的 handlerSelector 方法,這是個Defaut 方法留給各個插件實現,各個插件也可以選擇不實現。
這樣我們整個Zookeeper的更新流程就走完了,是不是很簡單。
1.5.3 總結
今天我們又掌握了Spring 的一些常用技巧如 @Import + @ConfigurationProperties + @EnableConfigurationProperties 這個三個注解組成的元數據加載方法,還有CommonLineRunner 通用的啟動后處理機制。