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();
        }
    }
}

 

 

 

posted @   mick0802  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示