Zookeeper配置管理自动更新
用于解决通用配置问题,客户端无需每次重启,直接监听Zookeeper的Znode值变更,动态修改用程序的配置信息。
一、服务端
1、创建Znode目录和节点
package Zookeeper;
import org.apache.zookeeper.*;
import org.junit.Test;
import java.io.IOException;
public class Server {
//开启集群
private static String url="192.168.186.128:2181,192.168.186.129:2181,192.168.186.130:2181";
private static String root="/mysql";
private static String userNameNode=root+"/username";
private static String passwordNode=root+"/password";
private static String auth_type="digest";
private static String auth_password="123456";
@Test
public void init() throws IOException, InterruptedException, KeeperException {
ZooKeeper zooKeeper=new ZooKeeper(url, 3000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("触发了事件:"+watchedEvent.getType());
}
});
while (zooKeeper.getState()!=ZooKeeper.States.CONNECTED){
Thread.sleep(3000);
}
zooKeeper.addAuthInfo(auth_type,auth_password.getBytes());
zooKeeper.delete(userNameNode,-1);
zooKeeper.delete(passwordNode,-1);
zooKeeper.delete(root,-1);
if(zooKeeper.exists(root,true)==null){
zooKeeper.create(root,"mysql".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.PERSISTENT);
}
if(zooKeeper.exists(userNameNode,true)==null){
zooKeeper.create(userNameNode,"root".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.PERSISTENT);
}
if(zooKeeper.exists(passwordNode,true)==null){
zooKeeper.create(passwordNode,"Qingfeng@2020".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL,CreateMode.PERSISTENT);
}
zooKeeper.close();
System.out.println("finished");
}
}
2、常见问题
ls目录无权限

addauth digest 123456 /mysql
digest和123456对应


二、Client配置与监听
package Zookeeper;
import lombok.Data;
import lombok.SneakyThrows;
import org.apache.zookeeper.*;
import org.junit.Test;
import java.io.IOException;
@Data
public class MyZKClient implements Watcher {
//开启集群
private static String url="192.168.186.128:2181,192.168.186.129:2181,192.168.186.130:2181";
private String rootNode ="/mysql";
private String userNameNode= rootNode +"/username";
private String passwordNode= rootNode +"/password";
private String auth_type="digest";
private String auth_password="123456";
private String rootString;
private String userNameString;
private String passwordString;
private ZooKeeper zooKeeper=null;
public void initConnectString() throws KeeperException, InterruptedException {
this.rootString=new String(zooKeeper.getData(rootNode,true,null));
this.userNameString=new String(zooKeeper.getData(userNameNode,true,null));
this.passwordString=new String(zooKeeper.getData(passwordNode,true,null));
}
public ZooKeeper init() throws IOException, InterruptedException, KeeperException {
zooKeeper=new ZooKeeper(url, 3000, this);
zooKeeper.addAuthInfo(auth_type,auth_password.getBytes());
while (zooKeeper.getState()!=ZooKeeper.States.CONNECTED){
Thread.sleep(3000);
}
System.out.println("connect server success.");
return zooKeeper;
}
@Test
public void test() throws InterruptedException, IOException, KeeperException {
MyZKClient client=new MyZKClient();
ZooKeeper zooKeeper = client.init();
int i=0;
while (true){
client.initConnectString();
System.out.println("root:"+client.getRootString());
System.out.println("userName:"+client.getUserNameString());
System.out.println("password:"+client.getPasswordString());
System.out.println("------------------------------------------");
i++;
Thread.sleep(10000);
if(i==100){
break;
}
}
zooKeeper.close();
}
@SneakyThrows
@Override
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getType()== Event.EventType.None){
System.out.println("连接成功");
}
if(watchedEvent.getType()== Event.EventType.NodeCreated){
System.out.println("节点创建成功");
}
if(watchedEvent.getType()== Event.EventType.NodeDeleted){
System.out.println("节点删除成功");
}
if(watchedEvent.getType()== Event.EventType.NodeDataChanged){
System.out.println("节点更新成功");
this.initConnectString();
}
if(watchedEvent.getType()== Event.EventType.NodeChildrenChanged){
System.out.println("子节点创建成功");
this.initConnectString();
}
}
}

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix