前言
應用項目中都會有一些參數,一般的做法通常可以選擇將其存儲在本地配置文件或者內存變量中;對於集群機器規模不大、配置變更不是特別頻繁的情況下,這兩種方式都能很好的解決;但是一旦集群機器規模變大,且配置信息越來越頻繁,依靠這兩種方式就越來越困難;我們希望能夠快速的做到全局參數的變更,因此需要一種參數的集中式管理,下面利用Zookeeper的一些特性來實現簡單的參數管理。
準備
Maven引入
目標
1.可以同時配置監聽多個節點如/app1,/app2;
2.希望只需要配置如/app1,就能夠監聽其子節點如/app1/modual1以及子節點的子節點如/app1/modual1/xxx/…;
3.服務器啟動能獲取當前指定父節點下的所有子節點數據;
4.在添加節點或者在更新節點數據的時候能夠動態通知,這樣代碼中就能夠實時獲取最新的數據;
5.spring配置中可以從Zookeeper中讀取參數進行初始化。
實現
提供ZKWatcher類主要用來和Zookeeper建立連接,監聽節點,初始化節點數據,更新節點數據,存儲節點數據等
1.同時配置監聽多個節點
提供一個字符串數組給用戶用來添加需要監聽的節點:
2.能夠監聽其子節點以及子節點的子節點
使用遞歸的方式用來獲取指定監聽節點的子節點:
3.服務器啟動初始化節點數據
上面已經遞歸獲取了所有的節點,所有可以遍歷獲取所有節點數據,並且存儲在Map中:
4.監聽節點數據的變更
使用PathChildrenCache用來監聽子節點的CHILD_ADDED,CHILD_UPDATED,CHILD_REMOVED事件:
5.spring配置中可以從Zookeeper中讀取參數進行初始化
實現自定義的PropertyPlaceholderConfigurer類ZKPropPlaceholderConfigurer:
通過以上的處理,可以使用如下簡單的配置來達到目標:
詳細代碼svn地址:http://code.taobao.org/svn/temp-pj/DynamicConf
測試
1.首先啟動Zookeeper
2.初始化需要使用的節點
創建需要的節點方便ZKWatcher來監聽,這裡根據以上的配置,分別初始化/a3/m1/v2/t2和/a2/m1/v1/t1
3.啟動Main,分別驗證配置文件中的初始化以及代碼動態獲取參數
4.觀察日誌同時更新參數:
部分日誌如下:
總結
通過Zookeeper實現了一個簡單的參數化平臺,當然想在生產中使用還有很多需要優化的地方,本文在於提供一個思路;當然除了Zookeeper還可以使用MQ,分佈式緩存等來實現參數化平臺。加Java架構師進階交流群獲取Java工程化、高性能及分佈式、高性能、深入淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走很多的彎路的 群號是:883922439 對了 小白勿進 最好是有開發經驗
注:加群要求
1、具有工作經驗的,面對目前流行的技術不知從何下手,需要突破技術瓶頸的可以加。
2、在公司待久了,過得很安逸,但跳槽時面試碰壁。需要在短時間內進修、跳槽拿高薪的可以加。
3、如果沒有工作經驗,但基礎非常紮實,對java工作機制,常用設計思想,常用java開發框架掌握熟練的,可以加。
4、覺得自己很牛B,一般需求都能搞定。但是所學的知識點沒有系統化,很難在技術領域繼續突破的可以加。
5.阿里Java高級大牛直播講解知識點,分享知識,多年工作經驗的梳理和總結,帶著大家全面、科學地建立自己的技術體系和技術認知!
閱讀更多 Java開發交流 的文章