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

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

如何使用Zookeeper作为配置中心?
我们可以清除的了解ZooKeeper的Znode节点提供了一个Watcher,我们可以通过该方法来实现配置改变,来通知所有客户端配置的变化,并赋值。

如何存储配置信息呢
其实我们可以把key作为znode的节点名称,value则可以使用znode的数据域来储存,从而达成一个key-value的形式来存储配置信息。

下面是Zookeeper作为配置中心的代码
ConfigServer主要是对配置的读取,配置信息的写入,获取全部配置信息

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ConfigServer extends ConnectWatcher{
private String rootPath="/config";
public ConfigServer(){
this.connect();
}
//写入配置信息
public void write(String key,String value){
try {
Stat stat=this.zooKeeper.exists(rootPath+"/"+key,false);
if(stat!=null){
this.zooKeeper.setData(rootPath+"/"+key,value.getBytes(),-1);
}else{
this.zooKeeper.create(rootPath+"/"+key,value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public Map<String,String> getAllConfig(){
Map<String,String> resultMap=new HashMap<String, String>();
try {
List<String> paths=this.zooKeeper.getChildren(rootPath,false);
for (String path:paths
) {
System.out.println(path);
String value=new String(this.zooKeeper.getData(rootPath+"/"+path,false,null));
resultMap.put(path,value);
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return resultMap;
}
public void createRoot(){
try {
this.zooKeeper.create("/config",null, ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public String readConfig(String key, Watcher watcher){
byte[] bytes=null;
try {
bytes=this.zooKeeper.getData(rootPath+"/"+key,watcher,null);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return new String(bytes);
}

}

configClient主要是相当于我们每台服务器上对于配置中心的配置属性的监控
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.CountDownLatch;

public class ConfigClient implements Watcher {
private ConfigServer configServer=new ConfigServer();
private CountDownLatch countDownLatch=new CountDownLatch(1);
public void process(WatchedEvent watchedEvent) {
String path=watchedEvent.getPath();
if(watchedEvent.getType()== Event.EventType.NodeDataChanged){
this.updateConfig(path);
}
}
public void updateConfig(String path){

System.out.println(configServer.readConfig(path.substring(path.lastIndexOf("/")+1),this));
}
public void getAllConfig(){
Map<String,String> map=configServer.getAllConfig();
Iterator<String> keys=map.keySet().iterator();
while (keys.hasNext()){
String key=keys.next();
String value=map.get(key);
System.out.println("key:"+key+" value:"+value);
}
}

}

connectWatcher主要是用来创建ZK的连接及关闭
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

public class ConnectWatcher implements Watcher{
private final static String ZK_HOST="47.106.132.60:2181,47.106.132.60:2182,47.106.132.60:2183";
private final static int SESSION_TIME_OUT=3000;
private CountDownLatch countDownLatch=new CountDownLatch(1);
ZooKeeper zooKeeper;
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState()== Event.KeeperState.SyncConnected){
countDownLatch.countDown();
}
}
public void connect(){
try {
zooKeeper=new ZooKeeper(ZK_HOST,SESSION_TIME_OUT,this);
countDownLatch.await();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}

public void close(){
try {
this.zooKeeper.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

测试类
import org.junit.Test;

import java.util.concurrent.CountDownLatch;

public class Main {
public static void main(String[] args) {
CountDownLatch countDownLatch=new CountDownLatch(1);
ConfigClient configClient=new ConfigClient();
configClient.updateConfig("jdbc.url");
try {
countDownLatch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void addConfig(){
ConfigServer configServer=new ConfigServer();
configServer.createRoot();
configServer.write("jdbc.url","com.mysql.jdbc.Driver");
configServer.write("jdbc.password","1234");
configServer.close();
}
@Test
public void updateConfig(){
ConfigServer configServer=new ConfigServer();
configServer.write("jdbc.url","com.mysql.jdbc.update.test2");
configServer.close();
}
}

————————————————
版权声明:本文为CSDN博主「恋旧uni」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_30756815/article/details/80611166

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

时间: 2024-10-12 22:03:07

Zookeeper(3)-使用ZooKeeper作为配置中心的相关文章

用Zookeeper作为Spring cloud的配置中心(转)

本文转自https://blog.csdn.net/CSDN_Stephen/article/details/78856323 Spring Cloud 配置中心的主流实现方式 Spring cloud configSpring cloud zookeeper config以下是这两者的简介 Srping Cloud Config Spring cloud config就是和git(svn)集成来实现配置中心.Spring cloud config分服务端.客户端和git(svn)三部分,服务端

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

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

ASP.Net Core 中使用Zookeeper搭建分布式环境中的配置中心系列一:使用Zookeeper.Net组件演示基本的操作

前言:马上要过年了,祝大家新年快乐!在过年回家前分享一篇关于Zookeeper的文章,我们都知道现在微服务盛行,大数据.分布式系统中经常会使用到Zookeeper,它是微服务.分布式系统中必不可少的分布式协调框架.它的作用体现在分布式系统中解决了配置中心的问题,以及解决了在分布式环境中不同进程之间争夺资源的问题,也就是分布式锁的功能以及分布式消息队列功能等等.所以在微服务的环境中Zookeeper是现在很多公司首选的分布式协调框架,包括我之前的公司也在使用Zookeeper.说了这么多,没别的就

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

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

zookeeper(5)配置中心

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

Zookeeper作为配置中心使用说明

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

基于Zookeeper实现配置中心

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

ActiveMQ + ZooKeeper 集群高可用配置

一. 准备条件: (1) 最好是有3台服务器[2台也行, 只是根据(replicas/2)+1 公式至少得2个ActiveMQ服务存在才能保证运行, 自己测试的时候麻烦点, 关掉其中一个, 再开启, 看会不会选举到另一个ActiveMQ服务, 多试几次可以看到效果] (2)  ActiveMQ安装参考: ActiveMQ (3)  ZooKeeper安装参考:ZooKeeper 二. 配置 : ActiveMQ根目录下的conf/activemq.xml, 原来默认如下: <persistenc

ZooKeeper序列之ZooKeeper配置

在配置ZooKeeper配置文件时,有些参数是必需的,有些参数是可选的,这些必需的参数构成了Zookeeper配置文件的最低配置要求,如果需要对ZooKeeper进行更详细的配置,可以参考以下内容: 1.最低配置 以下是ZooKeeper配置文件中必需的最低配置参数: 1)clientPort:监听客户端连接的接口 2)dataDir:存储内存中数据快照的位置 3)tickTime:基本事件单元,以毫秒为单位,用来控制心跳和超时,默认情况下最小的会话超时时间为两倍的tickTime 注意:应该谨