用过dubbo的都接触过zookeeper,小同事不知道dubbo在zookeeper里存的是什么,如何实现服务注册与发现。本文一起来实战一下zookeeper,下文简称zk了。
zk本质就是一个文件系统,你可以往里边写数据,这个在zk里叫做node节点,节点里可以添加子节点。话说操作系统里,貌似都是文件,数据库也是读写文件,redis在内存里读写,持久化还是要到文件。。。。
zk光有节点读写数据是不行的,另一个主要特点就是事件监听通知机制,简单说就是你可以监听某个节点,节点发生change事件时进行回调。话说js给select下拉框加一个onchange事件,下拉选项变动时,触发你的自定义函数,类似酱紫的。。。。
那有了以上两个特点,zk自己再来一个集群,就可以作为高可靠的分布式协调服务框架了。使用zkclient就可以操作了:
@Overridepublic void process(WatchedEvent event) { //注意这里不能只使用状态来判断,想想why if(EventType.None == event.getType() && KeeperState.SyncConnected == event.getState()) { connectLatch.countDown(); }else if(EventType.NodeDataChanged == event.getType()) { System.out.println("节点数据变动: " + event.getPath()); }else if(EventType.NodeDeleted == event.getType()) { System.out.println("节点删除: " + event.getPath()); }}public static void main(String[] args) { ZooKeeper zkClient = new ZooKeeper("192.168.0.1:2181", 5000, new ZkTest()); connectLatch.await(); zkClient.create("/star", "star".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); System.out.println(new String(zkClient.getData("/star", true, null))); zkClient.setData("/star", "star666".getBytes(), 0); System.out.println(new String(zkClient.getData("/star", true, null))); zkClient.delete("/star", 0);}