這是本人第一次寫博,有不當之處敬請指正html
首先感謝config-toolkit 開發者 wangyuxuanjava
因爲分佈式項目修改某個值,就須要全部應用中的配置均須要修改, 因此項目須要將配置集中管理,在wangyuxuan大哥的幫助下,順利完成了config-toolkit與項目集成,本文是我的在集成config-toolkit時的心得node
config-toolkit 下載地址:https://github.com/dangdangdotcom/config-toolkit 在此地址中做者介紹了config-toolkit的做用以及使用python
本文在此基礎上進行詳細集成說明:git
開發環境:win七、jdk1.六、spring3.二、tomcat七、zookeeper3.3.6github
配置文件類型; *.propertiesweb
本人項目中使用config-toolkit特色:spring
下載config-toolkit,將config-web工程進行打成war包,部署到tomcat7下tomcat
注:因爲config-web使用了鑑權密碼,故須要執行如下python程序app
python -c "import hashlib;print hashlib.sha1('abc').hexdigest();" # a9993e364706816aba3e25717850c26c9cd0d89d echo "set /aaa/bbb a9993e364706816aba3e25717850c26c9cd0d89d" |./zkCli.sh -server localhost:2181
因爲本人不想執行python程序,故修改源代碼AuthDao.java,爲了快速進入控制界面,此處請原做者原諒
@Override public boolean checkAuth(String nodeName, String password) { LOGGER.debug("Check auth: [{}]", nodeName); String hash = password; //sha1Digest(password); boolean isPass = false; try { // 判斷節點是否存在 Stat stat = getClient().checkExists().forPath(nodeName); System.out.println("--------------------------stat:"+stat); System.out.println("--------------------------stat:"+ stat != null); if (stat != null) { byte[] data = getClient().getData().forPath(nodeName); System.out.println("--------------------------data:"+ data); System.out.println("--------------------------data String:"+ new String(data)); System.out.println("--------------------------hash:"+hash); isPass = hash.equals(new String(data)); System.out.println("--------------------------isPass:"+ isPass); } } catch (Exception e) { throw Throwables.propagate(e); } return isPass; }
給根節點建立版本號,上傳或者建立配置文件
Spring PlaceholderConfigurer集成
注:此集成僅支持spring3.2以上版本
<bean id="configFactory" class="com.dangdang.config.service.easyzk.ConfigFactory"> <constructor-arg name="connectStr" value="zoo.host1:8181,zoo.host2:8181,zoo.host3:8181" /> <constructor-arg name="rootNode" value="/projectx/modulex" /> </bean> <bean id="zookeeperSources" class="com.dangdang.config.service.easyzk.support.spring.ZookeeperSourceFactory" factory-method="create"> <constructor-arg name="configFactory" ref="configFactory" /> <constructor-arg name="nodes"> <list> <value>config-group1</value> <value>config-group2</value> <value>config-group3</value> </list> </constructor-arg> </bean> <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer"> <property name="order" value="1" /> <property name="ignoreUnresolvablePlaceholders" value="true" /> <property name="propertySources" ref="zookeeperSources" /> </bean>
集成完畢,使用SPEL讀取配置值
此集成方式不支持熱更新,不須要進行熱更新的配置建議使用此集成方式
此方式支持spring3.0以上
編寫config-toolkit.properties
#zookeeper服務地址 zk.address=10.100.15.173:8900 #zookeeper節點版本 用於灰度發佈 zk.version=2.0.0
將configNode交給spring管理,將如下代碼copy到spring配置文件
<util:properties id="configToolkitCommon" location="classpath:config-toolkit.properties" /> <bean id="configFactory" class="com.dangdang.config.service.easyzk.ConfigFactory"> <constructor-arg name="connectStr" value="#{configToolkitCommon['zk.address']}" /> <constructor-arg name="rootNode" value="/toolkit" /> <constructor-arg name="version" value="#{configToolkitCommon['zk.version']}" /> </bean> <bean id="configNode" class="com.dangdang.config.service.easyzk.ConfigNode" factory-bean="configFactory" factory-method="getConfigNode"> <constructor-arg name="node" value="helloworld" /> </bean>
將configNode注入到業務bean中
@Component public class ExampleBeanWithSpel { @Autowired private ConfigNode configNode; public void someMethod() { System.out.println(configNode); System.out.println(configNode.get("passWord")); } }
測試熱更新結果