當有不少項目須要你來不停的向集成,測試和生產環境發時, 配置文件的差別性會形成很大的困撓.
一方面你不但願把敏感信息處處保存. 另外一方面會大量的地址信息,url,api-key,username/password須要配置. 每一個引入的第三方api都須要配置, 每每不一樣環境的還都不同. 一旦搞錯了,輕則項目起不來,重則數據搞亂. 總之,頭疼得很.html
把這一切交給zookeeper, 讓項目只有zookeeper的鏈接,其餘找zookeeper要, 不失爲一個解決辦法.
若是將zookeeper寫入hosts文件或dns服務, 則徹底有可能實現應用零配置發佈. 而zookeeper有完整的分佈管理,權限管理等解決方案, 真正的開箱可用.git
項目主頁github
commons-configuration包解決的是項目配置參數集中管理的問題.
配置參數可能來自於不一樣渠道,操做系統環境變量,JVM啓動參數,各類配置文件,數據庫,web.xml中的應用初始化參數和servlet初始參數等等. 經過統的一接口,爲應用程序屏避這個細節上的差別,同時保持多種渠道完成應用配置的靈活性.同時增長緩存功能, 減小參數獲取的時間延遲.web
cofiguration接口實現類的繼承關係spring
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是真正持久化的.
爲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變得可配置. 而不是硬編碼進去,在同時運行多個應用時,易於解決衝突問題.
這個也有幾個不一樣的版本
我用的是這個
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必定要反饋喲!