分布式配置中心是ZooKeeper的一个常见应用场景,它允许在分布式系统中集中管理配置信息,使得配置的变更能够实时生效,而无需重新部署应用。下面是一个简单的Java代码示例,展示了如何使用ZooKeeper来实现一个基本的分布式配置中心。
示例代码基于curator
库来实现,确保你的项目中引入了curator
的依赖。
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.utils.CloseableUtils;
public class DistributedConfigCenter {
private final CuratorFramework client;
private final String configPath;
public DistributedConfigCenter(String connectString, String configPath) {
this.client = CuratorFrameworkFactory.newClient(connectString, new ExponentialBackoffRetry(1000, 3));
this.configPath = configPath;
client.start();
}
public String getConfigValue() throws Exception {
byte[] data = client.getData().forPath(configPath);
return new String(data);
}
public void watchConfigChanges() throws Exception {
NodeCache nodeCache = new NodeCache(client, configPath);
nodeCache.getListenable().addListener(() -> {
if (nodeCache.getCurrentData() != null) {
String newValue = new String(nodeCache.getCurrentData().getData());
System.out.println("Config changed: " + newValue);
}
});
nodeCache.start();
}
public void close() {
CloseableUtils.closeQuietly(client);
}
public static void main(String[] args) throws Exception {
String connectString = "localhost:2181"; // ZooKeeper连接地址
String configPath = "/myApp/config"; // 配置节点路径
DistributedConfigCenter configCenter = new DistributedConfigCenter(connectString, configPath);
// 获取配置值
String value = configCenter.getConfigValue();
System.out.println("Initial config value: " + value);
// 监听配置变更
configCenter.watchConfigChanges();
// 模拟配置变更
Thread.sleep(5000);
configCenter.client.setData().forPath(configPath, "newConfigValue".getBytes());
Thread.sleep(10000);
configCenter.close();
}
}
在上述代码中,DistributedConfigCenter
类封装了配置中心的基本功能。通过getConfigValue
方法获取配置值,通过watchConfigChanges
方法监听配置变更。在示例的main
方法中,首先创建一个ZooKeeper客户端并初始化配置中心,然后获取初始配置值,并监听配置变更。当配置发生变化时,会输出新的配置值。
请注意,这只是一个简单的示例,实际项目中还需要考虑更多的异常处理、线程安全、定时刷新等问题。同时,还可以根据具体需求扩展更多的功能,如支持不同环境的配置、配置权限控制等。