ZooKeeper作爲應用系統參數配置服務的實踐

配置之痛與解決之道

當有不少項目須要你來不停的向集成,測試和生產環境發時, 配置文件的差別性會形成很大的困撓.
一方面你不但願把敏感信息處處保存. 另外一方面會大量的地址信息,url,api-key,username/password須要配置. 每一個引入的第三方api都須要配置, 每每不一樣環境的還都不同. 一旦搞錯了,輕則項目起不來,重則數據搞亂. 總之,頭疼得很.html

把這一切交給zookeeper, 讓項目只有zookeeper的鏈接,其餘找zookeeper要, 不失爲一個解決辦法.
若是將zookeeper寫入hosts文件或dns服務, 則徹底有可能實現應用零配置發佈. 而zookeeper有完整的分佈管理,權限管理等解決方案, 真正的開箱可用.git

commons-configuration介紹

項目主頁github

commons-configuration包解決的是項目配置參數集中管理的問題.
配置參數可能來自於不一樣渠道,操做系統環境變量,JVM啓動參數,各類配置文件,數據庫,web.xml中的應用初始化參數和servlet初始參數等等. 經過統的一接口,爲應用程序屏避這個細節上的差別,同時保持多種渠道完成應用配置的靈活性.同時增長緩存功能, 減小參數獲取的時間延遲.web

cofiguration接口實現類的繼承關係
圖片描述spring

commons-configuration-zookeeper擴展介紹

github上有三個相似的項目
針對的是不一樣版本的commons-configuration數據庫

擴展模塊主頁,與commons-configuration 1.10整合, 本文以此爲例.apache

簡單整合
這個只接實現的Configuration接口,把節點路徑作爲key,節點data作爲value.
能夠對屬性進行回寫,支持不一樣數據類型,是一個不錯的輕量級的方案.缺點是不能對zookeeper數據修改作出反應.api

commons-configuration2.0整合
這個項目master上沒有發佈,develope分支上有代碼,沒有構建好的庫到maven庫.
直接使用會有些不方便.緩存

pudn上也有一個 http://www.pudn.com/Download/...
但沒有積分了, 下載不下來,也就當沒看見了.app

擴展以zookeeper的數據樹爲來源,當作相似的分佈式的文件系統,讀取某個節點的數據,
經過Properties的文本鍵值對格式或XML格式進行解析並緩存在內存中, 在遠程數據沒有變化時,後續的getProperty讀取的是本地緩存,若是遠程數據發生改變, 緩存會觸發更新,後續讀取getProperty會獲得新的數據.

值得說明的是setProperty與getProperty並不對稱. 你設置的值僅在本地緩存裏發生改變,並無真正持久化到遠程的zookeeper.這與DatabaseConfiguration的行爲是不同的,只有DatabaseConfiguration是真正持久化的.

圖片描述

經過zookeeper得到動態屬性與Spring進行整合

爲spring bean的PropertyPlaceHolder賦值

能夠硬編碼實現,但這樣顯然很差 ;), 但好處是少引入兩個包(spring-context, spring-context-support),由於不須要ApplicationContext, 只要BeanFactory便可.

Properties p =
             Config.getZooProperties(ZK_CONFIG_SPRING_PATH);
             PropertyPlaceholderConfigurer cfg = new
             PropertyPlaceholderConfigurer();
             cfg.setProperties(p);
             cfg.postProcessBeanFactory(m_oXMLlBeanFactory);

能夠用註解的方式, 但對spring3.1的項目不太友好.
XML是經典的方式, 讓咱們來試試

先定義的個類,繼承BeanFactoryPostProcessor

public class MyBeanFactoryPostProcessor implements BeanFactoryPostProcessor {  

    private static final String ZK_CONFIG_SPRING_PATH="default";
    private String path=ZK_CONFIG_SPRING_PATH;
    public void setPath(String path){this.path=path;}
    
    @Override
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {  
       
        Properties p  = Config.getZooProperties(path);
        PropertyPlaceholderConfigurer cfg = new PropertyPlaceholderConfigurer();
        cfg.setProperties(p);
        cfg.postProcessBeanFactory(beanFactory);     
    }  
  
}

再在XML聲明一行

<bean id="myBeanFactoryPostProcessor" class="com.ssll.MyBeanFactoryPostProcessor" >
    <property name="path" value="custompath" />
    </bean>

這樣作的好處是path變得可配置. 而不是硬編碼進去,在同時運行多個應用時,易於解決衝突問題.

可視化工具zookeeper-inspector

這個也有幾個不一樣的版本
我用的是這個
https://github.com/zzhang5/zo...

雖然在github上星多,但也是有幾年沒有更新了,還好,對個人一些需求來講足夠好了.
能夠可視化展現全部節點和數據,能編輯修改文本節點和數據. 遺憾的是沒有備份和恢復功能.

下載後經過maven構建一下就能夠用了.
不過有個小問題就是新版本的Mac OS (High Sierra / Java 8)下Java路徑判斷有問題

把pom.xml中的appassemble-maven-plugin的版本升級至2.0.0就能夠了

diff --git a/pom.xml b/pom.xml
index 9e80d00..26b38be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -67,7 +67,7 @@
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>appassembler-maven-plugin</artifactId>
-        <version>1.1.1</version>
+        <version>2.0.0</version>
         <configuration>
           <binFileExtensions>
             <unix>.sh</unix>

備份與維護

zookeeper官方說法是拷貝datadir下的文件和binlog日誌. 我也沒有找到太好的方法, 誰知道給留個言.

項目源碼

說了半天,沒有源碼就太不厚道了. 因此呢, 猛擊此處下載 , 加不加星,就不強求了, 但有bug必定要反饋喲!

相關文章
相關標籤/搜索