1、创建一个maven工程,引入zookeeper jar包,.pom文件中添加以下内容:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
</dependency>
2、通过Java AIP实现连接Zookeeper,然后打印连接状态,并创建、修改、删除节点
public static void main(String[] args) {
try {
final CountDownLatch countDownLatch = new CountDownLatch(1);
ZooKeeper zk = new ZooKeeper("192.168.1.102:2181,192.168.1.102:2182,192.168.1.102:2183",
4000, new Watcher() {
@Override
public void process(WatchedEvent event) {
if(Event.KeeperState.SyncConnected == event.getState()) {
//收到了服务器端响应事件,连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
System.out.println("zk state:" + zk.getState());
// 创建节点
zk.create("/zk-demo-test", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
Thread.sleep(1000);
Stat stat = new Stat();
byte[] bytes = zk.getData("/zk-demo-test", null, stat);
System.out.println("result:" + new String(bytes));
// 修改节点的值
zk.setData("/zk-demo-test", "1".getBytes(), stat.getVersion());
byte[] bytes1 = zk.getData("/zk-demo-test", null, stat);
System.out.println("result:" + new String(bytes1));
// 删除节点
zk.delete("/zk-demo-test", stat.getVersion());
zk.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
3、Zookeeper的Watcher事件示例
public static void main(String[] args) {
try {
final CountDownLatch countDownLatch = new CountDownLatch(1);
final ZooKeeper zk = new ZooKeeper("192.168.1.102:2181,192.168.1.102:2182,192.168.1.102:2183",
4000, new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("default:" + event.getType() + " - " +event.getPath());
if(Event.KeeperState.SyncConnected == event.getState()) {
//收到了服务器端响应事件,连接成功
countDownLatch.countDown();
}
}
});
countDownLatch.await();
// 创建节点
zk.create("/zk-demo-test", "0".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
Thread.sleep(1000);
// exists getData getChildren
Stat stat = zk.exists("/zk-demo-test", new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println(event.getType() + " - " +event.getPath());
try {
zk.exists("/zk-demo-test", true);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
stat = zk.setData("/zk-demo-test", "3".getBytes(), stat.getVersion());
Thread.sleep(1000);
zk.delete("/zk-demo-test", stat.getVersion());
System.in.read();
zk.close();
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (KeeperException e) {
e.printStackTrace();
}
}
注:watcher特性:当数据发生变化的时候,zookeeper会产生一个watcher事件,并且会发送到客户端。但是客户端只会收到一次通知。如果后续这个节点再次发生变化,那么之前设置watcher的客户端不会再次收到消息。(watcher是一次性的操作)。可以通过循环监听去达到永久监听效果。
什么样的操作会产生什么类型的事件呢?
zk-demo-che(监听事件) | /zk-demo-che/children(监听事件) | |
---|---|---|
create(/zk-demo-che) | NodeCreated | 无 |
delete(/zk-demo-che) | NodeDeleted | 无 |
setData(/zk-demo-che) | NodeDataChanged | 无 |
create(/zk-demo-che/children) | NodeChildrenChanged | NodeCreated |
delete(/zk-demo-che/children) | NodeChildrenChanged | NodeDeleted |
setData(/zk-demo-che/children) | 无 | NodeDataChanged |
zookeeper的节点特性:
1、同一级节点 key 名称是唯一的。
2、创建节点时,必须要带上全路径,节点存在父子关系,必须有先后。
3、session会话关闭,临时节点自动清除。
4、自动创建顺序节点。