基于Zookeeper实现配置中心

在Zookeeper的主要应用场景中,其中之一是作为分布式系统的配置中心。

实现原理
在Zookeeper建立一个根节点,比如/CONFIG,代表某个配置文件。将配置文件中的信息作为根节点的子节点存储,比如配置项timeout=3000,在Zookeeper中展现为:/CONFIG/timeout ,节点内容是3000。然后让所有使用到该配置信息的应用机器集成Zookeeper并监控/CONFIG的状态,一旦配置信息也就是子节点发生变化,每台应用机器就会收到ZK的通知,然后从ZK中获取新的配置信息应用到系统中。

以下代码仅用于展现实现思路,具体生产还需要根据实际场景处理和优化
我们使用Curator来实现一个简易的配置中心,关于Curator框架的使用可参考zookeeper客户端框架Curator

项目中引入依赖包:

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.0.1</version>
</dependency>

Config.java 配置类

public class Config {
private Map<String, String> cache = new HashMap<>();
private CuratorFramework client;
private static final String CONFIG_PREFIX = "/CONFIG";

// 初始化zk连接
public Config() {
this.client = CuratorFrameworkFactory.newClient("localhost:2181", new RetryNTimes(3, 1000));
this.client.start();
this.init();
}

public void init() {
try {
// 从zk中获取配置项并保存到缓存中
List<String> childrenNames = client.getChildren().forPath(CONFIG_PREFIX);
for (String name : childrenNames) {
String value = new String(client.getData().forPath(CONFIG_PREFIX + "/" + name));
cache.put(name, value);
}

// 绑定一个监听器 cacheData设为true,事件发生后可以拿到节点发送的内容。
// 使用该配置文件的每个应用机器都需要监听,这里只是用于演示
PathChildrenCache watcher = new PathChildrenCache(client, CONFIG_PREFIX, true);
watcher.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent event) throws Exception {

String path = event.getData().getPath();
if (path.startsWith(CONFIG_PREFIX)) {
String key = path.replace(CONFIG_PREFIX + "/", "");
// 子节点新增或变更时 更新缓存信息
if (PathChildrenCacheEvent.Type.CHILD_ADDED.equals(event.getType()) ||
PathChildrenCacheEvent.Type.CHILD_UPDATED.equals(event.getType())) {
cache.put(key, new String(event.getData().getData()));
}
// 子节点被删除时 从缓存中删除
if (PathChildrenCacheEvent.Type.CHILD_REMOVED.equals(event.getType())) {
cache.remove(key);
}
}
}
});
watcher.start();
} catch (Exception e) {
e.printStackTrace();
}
}

// 保存配置信息
public void save(String name, String value) {
String configFullName = CONFIG_PREFIX + "/" + name;
try {
Stat stat = client.checkExists().forPath(configFullName);
if (stat == null) {
client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(configFullName, value.getBytes());
} else {
client.setData().forPath(configFullName, value.getBytes());
}
cache.put(name, value);
} catch (Exception e) {
e.printStackTrace();
}

}
// 获取配置信息
public String get(String name) {
return cache.get(name);
}
}

Test.java 测试类

public class Main {
public static void main(String[] args) {
Config config = new Config();
// 模拟一个配置项,实际生产中会在系统初始化时从配置文件中加载进来
config.save("timeout", "1000");

// 每3S打印一次获取到的配置项
for (int i = 0; i < 10; i++) {
System.out.println(config.get("timeout"));
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

启动本地zookeeper服务器,我们来测试下。Main.java执行后会在控制台每隔3S打印一下当前获取到的配置信息,当我们使用其它zk客户端重新设置timeout值时会发现获取到的信息及时更新了。

至此,我们使用Zookeeper实现了一个简单的共享配置中心。
————————————————
版权声明:本文为CSDN博主「岸远水声微」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hzygcs/article/details/88387408

原文地址:https://www.cnblogs.com/zhoading/p/12157407.html

时间: 2024-10-17 01:26:11

基于Zookeeper实现配置中心的相关文章

Zookeeper作为配置中心使用说明

为了保证数据高可用,那么我们采用Zookeeper作为配置中心来保存数据.SpringCloud对Zookeeper的集成官方也有说明:spring_cloud_zookeeper 这里通过实践的方式讲解下使用方式. 1.添加依赖包 <!-- 运维监控 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actua

Zookeeper(3)-使用ZooKeeper作为配置中心

ZooKeeper作为配置中心现在我们大多数应用都是采用的是分布式开发的应用,搭建到不同的服务器上,我们的配置文件,同一个应用程序的配置文件一样,还有就是多个程序存在相同的配置.当我们配置文件中有个配置属性需要改变,我们需要改变每个程序的配置属性,这样会很麻烦的去修改配置.而现在可以使用SpringCloud提供的配置中心,或者使用zookeeper来实现配置中心. 如何使用Zookeeper作为配置中心?我们可以清除的了解ZooKeeper的Znode节点提供了一个Watcher,我们可以通过

ZooKeeper实现配置中心的实例(原生API实现)(转)

说明:要实现配置中心的例子,可以选择的SDK有很多,原生自带的SDK也是不错的选择.比如使用I0Itec,Spring Boot集成等. 大型应用通常会按业务拆分成一个个业务子系统,这些大大小小的子应用,往往会使用一些公用的资源,比如:需要文件上传.下载时,各子应用都会访问公用的Ftp服务器.如果把Ftp Server的连接IP.端口号.用户名.密码等信息,配置在各子应用中,然后这些子应用再部署到服务器集群中的N台Server上,突然有一天,Ftp服务器要换IP或端口号,那么问题来了?),而是如

基于zookeeper实现配置集中管理

基于ZK的优点: 简单.尽管前期搭建ZooKeeper服务器集群较为麻烦,但是实现该方案后,修改配置整个过程变得简单很多.用户只要修改配置,无需进行其他任何操作,配置自动生效. 可靠.ZooKeeper服务集群具有无单点失效的特性,使整个系统更加可靠.即使ZooKeeper 集群中的一台机器失效,也不会影响整体服务,更不会影响分布式应用配置信息的更新. 实时.ZooKeeper的数据更新通知机制,可以在数据发生变化后,立即通知给分布式应用程序,具有很强的变化响应能力. 转自:http://www

zookeeper(5)配置中心

案例 使用Zookeeper作为配置中心,实现配置的修改和自动下发,基于Spriing Cloud我们可以轻松的实现. 添加依赖 pom.xml的关键信息如下 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-zookeeper-config</artifactId> </dependency> 启动配置

使用zookeeper实现配置同步

前言 应用项目中都会有一些配置信息,这些配置信息数据量少,一般会保存到内存.文件或者数据库,有时候需要动态更新.当需要在多个应用服务器中修改这些配置文件时,需要做到快速.简单.不停止应用服务器的方式修改并同步配置信息到所有应用中去.本篇文章就是介绍如何使用ZooKeeper来实现配置的动态同步. ZooKeeper 在<hive Driver类运行过程>一文中可以看到hive为了支持并发访问引入了ZooKeeper来实现分布式锁.参考<ZooKeeper典型应用场景一览>一文,Zo

.Net配置中心-Zookeper版

简介 zookeeper的基本概念和作用这里不做介绍,现在很多的公司都在使用它,说起它的作用,可能最先想到的是配置中心,可以将配置项作为一个node存储在zookeeper中,其他应用可以“关注”这个节点,当配置的值发生变化的时候,其他应用可以很快的被通知到. 这里有一个细节,就是通知的次数,我在初次认识zookeeper的时候,以为“关注”了某个节点后,之后这个节点的值发生变化都可以通知到,但是实际情况是客户端在“关注”了某个节点后,这个节点的首次变化会被通知到,之后的变化都不会再通知,如果想

基于zookeeper的分布式配置中心(一)

最近在学习zookeeper,发现zk真的是一个优秀的中间件.在分布式环境下,可以高效解决数据管理问题.在学习的过程中,要深入zk的工作原理,并根据其特性做一些简单的分布式环境下数据管理工具.本文首先对zk的工作原理和相关概念做一下介绍,然后带大家做一个简单的分布式配置中心. zookeeper介绍 zookeeper是一个分布式协调框架,主要是解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理.分布式锁等. zookeeper使用 查看

基于ZK构建统一配置中心的方案和实践

背景: 近期使用Zk实现了一个简单的配置管理的小东西,在此开源出来,有兴趣的希望提出您的宝贵意见.如果恰巧您也使用或者接触过类似的东西, 也希望您可以分享下您觉得现在这个项目可以优化和改进的地方. 项目地址: https://github.com/cncduLee/zk-ucc 需求: 1.不需要重启应用.修改代码就可以对业务做开关操作 2.避免不必要的重复拉取配置信息,降低网络IO,节省服务器资源. 例如1:开发一个评论系统,违禁词这个东西,应该是可配置的,同时又是变动极少的.如何设计这个违禁