一,简单操作zk的节点
加入如下pom配置:
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
public class TestZookeeperNode {
// 根节点
public static final String ROOT = "/root-ktv";
public static void main(String[] args) throws Exception {
Watcher watcher=new Watcher() {
// 监控所有被触发的事件
@Override
public void process(WatchedEvent event) {
System.out.println("状态:" + event.getState() + ":"
+ event.getType() + ":" + event.getWrapper() + ":"
+ event.getPath());
}
};
// 创建一个与服务器的连接
ZooKeeper zk = new ZooKeeper("localhost:2181", 30000, watcher);
if(zk.exists(ROOT, watcher)==null){
//创建一个总的目录ktv,并不控制权限,这里需要持久化节点,不然下面容易出错
zk.create(ROOT, "root-ktv".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
}
if(zk.exists(ROOT+"/杭州ktv", watcher)==null){
//然后杭州开一个ktv, PERSISTENT_SEQUENTIAL 类型会自动加上0000000000 自增的后缀
zk.create(ROOT+"/杭州ktv", "杭州ktv".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
}
if(zk.exists(ROOT+"/北京KTV", watcher)==null){
//然后北京开一个,EPHEMERAL session过期了就会自动删除
zk.create(ROOT+"/北京KTV", "北京KTV".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
}
if(zk.exists(ROOT+"/北京KTV-分店", watcher)==null){
//北京分店,EPHEMERAL_SEQUENTIA:加上0000000000 自增的后缀 ,session过期了就会自动删除
zk.create(ROOT+"/北京KTV-分店", "北京KTV-分店".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
}
//查看节点
List<String> ktvs=zk.getChildren(ROOT, true);
System.out.println(Arrays.toString(ktvs.toArray()));
for(String node:ktvs){
//删除节点
zk.delete(ROOT+"/",-1);
}
//根目录得最后删除的
zk.delete(ROOT, -1);
zk.close();
}
}
嘿嘿,你run一下看看~~
二,zookeeper数据结构
zookeeper数据结构特点:
1,每个子目录项都被称为znode,这个znode是被它所在的路径唯一标识。
2,znode可以有子节点目录,并且每个znode可以存储数据。
3,znode是有版本的,每个znode众存储的数据可以有多个版本,也就是一个访问路径中可以存储多份数据;
4,znode可以是临时结点,一旦创建这个znode的客户端与服务器失去联系,这个znode也将自动删除,zookeeper的客户端和服务器通信采用长连接方式,每个客户端和服务器通过心跳检测来保持连接,这个连接状态被称为session。如果znode是临时结点,这个session失效,znode也就删除了。
5,znode的目录名可以自动编号
6,znode可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦编号可以通知设置监控的客户端,这个是zk的核心特性,zk的很多功能都是基于这个特性实现的。
三,zk的常见应用场景
1,数据的发布与订阅
2,统一命名服务
3,分布通知/协调
4,分布式锁
5,集群管理
6,队列管理