测试类:
import org.apache.zookeeper.ZooKeeper; import org.junit.Before; import org.junit.Test; /** * @program: mxnzookeeper * @ClassName TestConfig * @description: * @author: muxiaonong * @create: 2021-10-19 22:04 * @Version 1.0 **/ public class TestConfig { ZooKeeper zk; @Before public void conn(){ zk = ZKUtils.getZK(); } /** @Author mxn * @Description //TODO 关闭ZK * @Date 21:16 2021/10/20 * @Param * @return **/ public void close(){ try { zk.close(); }catch (Exception e){ e.printStackTrace(); } } @Test public void getConf(){ WatchCallBack watchCallBack = new WatchCallBack(); watchCallBack.setZk(zk); MyConfig myConfig = new MyConfig(); watchCallBack.setConf(myConfig); //阻塞等待 watchCallBack.aWait(); while(true){ if(myConfig.getConf().equals("")){ System.out.println("zk node 节点丢失了 ......"); watchCallBack.aWait(); }else{ System.out.println(myConfig.getConf()); } // try { //每隔500毫秒打印一次 Thread.sleep(500); } catch (InterruptedException e) { e.printStackTrace(); } } }
运行测试
首先我们要知道,因为我们连接IP的时候加上了 /mxn这个目录结构,所以我们在服务器初始状态就必须要有这个节点:
集群初始状态:
[zk: localhost:2181(CONNECTED) 7] ls / [mxn, zookeeper]
我们启动程序看看
连接成功
这个时候我们如果删除/mxn/myZNode节点,会发生什么呢,前面我们已经写了watch,如果Znode被删除了,,watch and callback执行
case NodeDeleted: //节点删除 conf.setConf(""); //重新开启CountDownLatch cc = new CountDownLatch(1); break; if(myConfig.getConf().equals("")){ System.out.println("zk node 节点丢失了 ......"); 此时应该阻塞住,等待着node重新创建 watchCallBack.aWait(); }
删除/mxn/myZNode节点
delete /mxn/myZNode
我们可以看到前面还在打印数据,后面就提示丢失。
程序正常运行,并且成功获取到了zk配置的最新数据,到这里基本上就实现了,ZooKeeper的分布式配置中心功能了
在这里我测试用的是 getData,但是在项目实战用可能用的更多的是 子节点的操作 getChildren
总结
到这里我们这篇 ZooKeeper分布式配置注册发现 就讲完了,如果有疑问的地方欢迎进行讨论,ZooKeeper 可以作为分布式配置中心,也可以用来当然微服务的注册,不过现在微服务都有自己的一套服务发现,对于了解ZooKeeper可以我们方便我们在进行技术选型的时候更好的去抉择, ZooKeeper 的高可用和最终一致性也是比较稳定,
本文代码地址:
https://github.com/muxiaonong/ZooKeeper/tree/master/mxnzookeeper
如果对你有帮助,请帮忙star,感谢!
我是牧小农,如果对你有帮助的话,记得一键三连啊,怕什么真理无穷,进一步有一步的欢喜,大家加油 ~