目录
一、环境搭建
二、API操作Zookeeper
1、连接Zookeeper
前言
连接Zookeeper
2、创建节点
前言
创建节点
3、删除节点
前言
删除节点
org.apache.zookeeper
zookeeper
3.5.7
junit
junit
4.13.1
zookeeper-3.5.7.jar
jline-0.9.94.jar、
log4j-1.2.16.jar、
netty-3.10.5.Final.jar、
slf4j-api-1.6.1.jar、
slf4j-log4j12-1.6.1.jar
将上述jar包拷贝到工程的lib目录。并build一下,导入工程。
环境搭建完成之后,就可以使用Java代码来操作Zookeeper啦!第一步当然是连接Zookeeper了。
Java API连接Zookeeper只需要一步:即创建Zookeeper对象。
首先进入到Zookeeper类中可以看到:
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException {
this(connectString, sessionTimeout, watcher, false);
}
创建Zookeeper对象需要传入三个参数:
有了上述基础之后,就可以连接Zookeeper了!
Zookeeper zkClient = "";
String connectStr = "node1:2181,node2:2181,node3:2181";
zkClient = new ZooKeeper(connectStr, 2000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) { }
});
连接成功:
【注意】
创建节点所需要的方法是create()。此处需要传入四个参数:
public String create(String path, byte[] data, Listacl, CreateMode createMode) throws KeeperException, InterruptedException {}
四个参数代表的含义是:
- String path:节点路径
- byte[] data,:节点数据---字节数组
- List
acl :节点权限- CreateMode createMode:节点类型
其中,设置文件权限的基本参数解读如下:
(1) OPEN_ACL_UNSAFE :完全开放。 事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了 OPEN_ACL_UNSAFE 时,是对所有的连接开放。
(2) CREATOR_ALL_ACL :给创建该znode连接所有权限。 事实上这里是采用了auth验证模式,使用sessionID做验证。所以设置了 CREATOR_ALL_ACL 时,创建该znode的连接可以对该znode做任何修改。
(3) READ_ACL_UNSAFE :所有的客户端都可读。 事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了READ_ACL_UNSAFE时,所有的连接都可以读该znode。
设置文件类型的基本参数解读如下:
观察CreateMode源码可以发现CreateMode是一个枚举类。 创建Node的类型有:持久节点、持久有序号的节点、短暂节点、短暂有序号的节点
@Test
public void createNode() throws InterruptedException, KeeperException {
String node = zkClient.create("/javaClient", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISENT);
System.out.println(node);
}
持久化节点创建成功:
创建持久带序号的节点:
@Test
public void createNode() throws InterruptedException, KeeperException {
String node = zkClient.create("/javaClient1", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISENT_SEQUENTIAL);
System.out.println(node);
}
创建成功:
创建短暂不带序号节点:
@Test
public void createNode() throws InterruptedException, KeeperException {
String node = zkClient.create("/javaClient2", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(node);
}
创建成功:
【注意】创建成功后在主机查看却发现没有/javaClient2这个节点。因为在Java运行结束之后,客户端服务就关闭了,此时临时节点已经删除,再去查看的时候已经没有了。此时可以通过设置一个线程睡眠时间,就可以在睡眠时间内另一台客户端看到文件。
@Test
public void createNode() throws InterruptedException, KeeperException {
String node = zkClient.create("/javaClient3", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println(node);
Thread.sleep(10000);
}
创建短暂带序号节点
创建短暂带序号节点就可以参照创建持久带序号节点完成了,只需要将CreateMode的值设为 "EPHEMERAL_SEQUENTIAL"即可
删除节点可以使用Zookeeper中的delete()方法
public void delete(String path, int version) throws InterruptedException, KeeperException {}
两个参数:第一个是删除的节点路径,第二个是要删除节点的版本号。版本号可以通过ls -s path查看节点详情信息,cversion即是对应的版本值。
如果写的版本不正确,将会报如下错误:
【注意】delete方法是用来删除单个节点的,不能进行迭代删除。
由于此处的/test节点下还有一个子节点
如果使用delete去删除,还会报如下错误:
public void deleteNode() throws InterruptedException, KeeperException {
zkClient.delete("/test20000000006", 0);
}
删除成功: