zookeeper特性:
1. 可以直接存储数据的类unix目录节点
2. 通知和监听机制
演示:
这里我们使用zookeeper单机环境。虚拟机下载配置好zookeeper之后,在bin目录下
使用 .zkServer.sh start开启服务端
然后 执行.zkCli.sh start开启客户端
我们先用 ls / 查看/下的节点
使用命令新建一个znode节点: create /helloworld today
这样等于新建了一个存储 "today"字符串的 /helloworld 节点
然后,我们在IDE中 pom.xml中引入依赖:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.0</version>
</dependency>
这里版本最好跟你虚拟机中的服务端版本保存一致,避免意外bug
新建一个类ZooTest实现zookeeper的Watcher接口,这里重点是process(WatchedEvent event)的具体实现
当zk连接成功或服务端的节点数据发生变动时,都会触发process方法, 在这里处理如下:
代码实现:
package com.example.demo.zoo;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import java.io.IOException;
import java.util.concurrent.CountDownLatch;
/**
*
* 分布式注册中心demo
*/
public class ZooTest implements Watcher {
private static ZooKeeper zk = null;
private static Stat stat = new Stat();
private static CountDownLatch connectedSemaphore = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
String path = "/helloworld";
zk = new ZooKeeper("192.168.237.128:2181", 5000, new ZooTest());
connectedSemaphore.await();
System.out.println("获取到配置值为: "+new String(zk.getData(path,true,stat)));
Thread.sleep(Integer.MAX_VALUE);
}
@Override
public void process(WatchedEvent watchedEvent) {
//zk连接成功
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
if (Event.EventType.None == watchedEvent.getType() && null == watchedEvent.getPath()) {
connectedSemaphore.countDown();
} else if (watchedEvent.getType() == Event.EventType.NodeDataChanged) { //zk目录节点数据变化通知事件
try {
System.out.println("配置已修改,新值为: "+new String(zk.getData(watchedEvent.getPath(),true,stat)));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
利用 上面的zkCli 客户端修改 /helloworld为 tomorrow,
观察终端结果:
这个也是zookeeper服务注册中心的基础
可能会有同学出现终端连接问题,这里最简单的方法就是 关掉虚拟机的防火墙