ZooKeeperConfig.java
  配置操作接口ZooKeeper的实现
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
  配置加载器使用我们自己创建的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包
<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>