ZooKeeper学习笔记—配置管理
為什么80%的碼農都做不了架構師?>>> ??
? ? 最近在工作中,為了完善公司集群服務的架構,提高可用性,降低運維成本,因此開始學習ZooKeeper。? ? 至于什么是ZooKeeper?它能做什么?如何安裝ZooKeeper?我就不一一介紹了,類似這些資料網上到處都是。我主要是把在開發過程中,以及個人對ZooKeeper的一些了解記錄下來,大家如果遇到類似場景時,希望我的文章能夠給你提供一些思路。
? ? 我使用的ZooKeeper(以下簡稱:ZK)客戶端是Curator Framework,是Apache的項目,它主要的功能是為ZK的客戶端使用提供了高可用的封裝。在Curator Framework基礎上封裝的curator-recipes,實現了很多經典場景。比如:集群管理(Leader選舉)、共享鎖、隊列、Counter等等。可以總結Curator主要解決以下三類問題:
- 封裝ZK Client與Server之間的連接處理;?
- 提供了一套Fluent風格的操作API;?
- 提供ZK各種應用場景的抽象封裝;
? ?本文主要完成的目標是:Spring PropertyPlaceholderConfigurer配置文件加載器集成ZooKeeper來實現遠程配置讀取。
? ? 配置管理(Configuration Management)。? ? 在集群服務中,可能都會遇到一個問題:那就是當需要修改配置的時候,必須要對每個實例都進行修改,這是一個很繁瑣的事情,并且易出錯。當然可以使用腳本來解決,但這不是最好的解決辦法。
OK,Let's go!
我們先看看項目結構
ZooKeeperPropertyPlaceholderConfigurer.java
繼承org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,重寫processProperties(beanFactoryToProcess, props)來完成遠端配置加載的實現
package org.bigmouth.common.zookeeper.config.spring;import java.io.UnsupportedEncodingException; import java.util.Properties;import org.apache.commons.lang.StringUtils; import org.bigmouth.common.zookeeper.config.Config; import org.bigmouth.common.zookeeper.config.ZooKeeperConfig; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.config.PropertyPlaceholderConfigurer;public class ZooKeeperPropertyPlaceholderConfigurer extends PropertyPlaceholderConfigurer {public static final String PATH = "zoo.paths";@Overrideprotected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)throws BeansException {super.processProperties(beanFactoryToProcess, props);try {fillCustomProperties(props);System.out.println(props);}catch (Exception e) {// Ignoree.printStackTrace();}}private void fillCustomProperties(Properties props) throws Exception {byte[] data = getData(props);fillProperties(props, data);}private void fillProperties(Properties props, byte[] data) throws UnsupportedEncodingException {String cfg = new String(data, "UTF-8");if (StringUtils.isNotBlank(cfg)) {// 完整的應該還需要處理:多條配置、value中包含=、忽略#號開頭String[] cfgItem = StringUtils.split(cfg, "=");props.put(cfgItem[0], cfgItem[1]);}}private byte[] getData(Properties props) throws Exception {String path = props.getProperty(PATH);Config config = new ZooKeeperConfig();return config.getConfig(path);}}
Config.java
配置操作接口? package org.bigmouth.common.zookeeper.config;public interface Config {byte[] getConfig(String path) throws Exception; }
程序啟動入口
配置操作接口ZooKeeper的實現
管理ZooKeeper客戶端連接
applicationContext.xml
配置加載器使用我們自己創建的ZooKeeperPropertyPlaceholderConfigurer,因為它重寫了processProperties方法。這個方法里會去讀取遠程配置。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans><bean class="org.bigmouth.common.zookeeper.config.spring.ZooKeeperPropertyPlaceholderConfigurer"><property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" /><property name="ignoreResourceNotFound" value="true" /><property name="locations"><list><value>classpath:application.properties</value></list></property></bean></beans>
application.properties
項目配置文件,里面除了配置ZooKeeper服務器地址和讀取的節點以外,其他所有的配置都應該保存在ZooKeeper中。
zoo.paths=/properties設置ZooKeeper數據
登錄ZooKeeper中為節點?/cfg/properties?添加一條配置項:
如圖所示:我創建了一個節點 /cfg/properties 并設置內容為:jdbc.driver=org.postgresql.Driver
運行Startup.java
OK 了,zoo.paths是本地application.properties文件中的,jdbc.driver是遠程ZooKeeper服務器中的。
項目中需要依賴的jar包
相關資料:
Apache Curator FrameworkApache ZooKeeper
博主,問個zk值被刷了的問題。
假設,我們現在配置的數據,都是從zk中獲取的,但是某個值被刷新了,我們有個watch監控到了,但是這個值怎么刷入到內存中,或者說重新注冊那個bean?
有沒有這方面的解決思路,我有點迷惑
ZKClient 可以輕松監聽到配置什么時候變化,但變化后該怎么做?如果你用了spring,或許這篇文章能幫到你:https://github.com/jamesmorgan/ReloadablePropertiesAnnotation
轉載于:https://my.oschina.net/boltwu/blog/464149
總結
以上是生活随笔為你收集整理的ZooKeeper学习笔记—配置管理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS平台快速发布HT for Web拓
- 下一篇: secureFX上传文件的时候报错,se