這篇文章將為大家詳細講解有關ZooKeeper如何配置管理,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
站在用戶的角度思考問題,與客戶深入溝通,找到港北網(wǎng)站設計與港北網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設計與互聯(lián)網(wǎng)技術結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:網(wǎng)站設計、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣、域名申請、網(wǎng)站空間、企業(yè)郵箱。業(yè)務覆蓋港北地區(qū)。
主要完成的目標是:Spring PropertyPlaceholderConfigurer配置文件加載器集成ZooKeeper來實現(xiàn)遠程配置讀取。
配置管理(Configuration Management)。
在集群服務中,可能都會遇到一個問題:那就是當需要修改配置的時候,必須要對每個實例都進行修改,這是一個很繁瑣的事情,并且易出錯。當然可以使用腳本來解決,但這不是最好的解決辦法。
OK,Let's go!

ZooKeeperPropertyPlaceholderConfigurer.java
繼承org.springframework.beans.factory.config.PropertyPlaceholderConfigurer,重寫processProperties(beanFactoryToProcess, props)來完成遠端配置加載的實現(xiàn)
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";
@Override
protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)
throws BeansException {
super.processProperties(beanFactoryToProcess, props);
try {
fillCustomProperties(props);
System.out.println(props);
}
catch (Exception e) {
// Ignore
e.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;
}Startup.java
程序啟動入口
package org.bigmouth.common.zookeeper.config;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Startup {
public static void main(String[] args) {
new ClassPathXmlApplicationContext("classpath:/config/applicationContext.xml");
}
}ZooKeeperConfig.java
配置操作接口ZooKeeper的實現(xiàn)
package org.bigmouth.common.zookeeper.config;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.data.Stat;
public class ZooKeeperConfig implements Config {
@Override
public byte[] getConfig(String path) throws Exception {
CuratorFramework client = ZooKeeperFactory.get();
if (!exists(client, path)) {
throw new RuntimeException("Path " + path + " does not exists.");
}
return client.getData().forPath(path);
}
private boolean exists(CuratorFramework client, String path) throws Exception {
Stat stat = client.checkExists().forPath(path);
return !(stat == null);
}
}ZooKeeperFactory.java
管理ZooKeeper客戶端連接
package org.bigmouth.common.zookeeper.config;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class ZooKeeperFactory {
public static final String CONNECT_STRING = "172.16.3.42:2181,172.16.3.65:2181,172.16.3.24:2181";
public static final int MAX_RETRIES = 3;
public static final int BASE_SLEEP_TIMEMS = 3000;
public static final String NAME_SPACE = "cfg";
public static CuratorFramework get() {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(BASE_SLEEP_TIMEMS, MAX_RETRIES);
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString(CONNECT_STRING)
.retryPolicy(retryPolicy)
.namespace(NAME_SPACE)
.build();
client.start();
return client;
}
}applicationContext.xml
配置加載器使用我們自己創(chuàng)建的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服務器地址和讀取的節(jié)點以外,其他所有的配置都應該保存在ZooKeeper中。
zoo.paths=/properties
登錄ZooKeeper中為節(jié)點 /cfg/properties 添加一條配置項:

如圖所示:我創(chuàng)建了一個節(jié)點 /cfg/properties 并設置內(nèi)容為:jdbc.driver=org.postgresql.Driver

OK 了,zoo.paths是本地application.properties文件中的,jdbc.driver是遠程ZooKeeper服務器中的。
<dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.4</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>3.0.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>3.0.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>3.0.3.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>3.0.3.RELEASE</version> </dependency> <!-- ZooKeeper --> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.4.2</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>2.4.2</version> </dependency>
關于“ZooKeeper如何配置管理”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
網(wǎng)站名稱:ZooKeeper如何配置管理
瀏覽路徑:http://www.chinadenli.net/article48/ihoshp.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設、小程序開發(fā)、靜態(tài)網(wǎng)站、動態(tài)網(wǎng)站、網(wǎng)站設計、網(wǎng)站策劃
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)