版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27399407/article/details/85342824
今天使用zookeeper的javaApi,来实现zk的基础操作,watch的实现,以及Acl权限的使用
1. 基于javaApi实现zk节点的增、删、改
countDownLatch.await();
//创建节点(持久化节点)
String path1 = "/test4"; //节点操作示例,
String path2 = "/test1/test1-1"; //子节点操作示例
if (null == zooKeeper.exists(path2, true)) {
String result = zooKeeper.create(path2, "789".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println(result);
TimeUnit.SECONDS.sleep(2);
}
//修改节点数据
if (null != zooKeeper.exists(path2, true)) {
zooKeeper.setData(path2, "pxc".getBytes(), -1);
TimeUnit.SECONDS.sleep(2);
}
if (null != zooKeeper.exists(path2, true)) {
//删除节点
zooKeeper.delete(path2, -1);
TimeUnit.SECONDS.sleep(2);
}
TimeUnit.SECONDS.sleep(10);
就是简单的create(),getData(),setData(),delete()。
需要注意以下:
- 子节点操作时路径要写完整。如:/test/test1
- 临时节点不能创建子节点
2. zookeeperde watch监听事件
@Override
public void process(WatchedEvent watchedEvent) {
try {
//如果当前的连接状态是连接成功的,那么通过计数器去控制
if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
switch (watchedEvent.getType()) {
case None:
countDownLatch.countDown();
System.out.println(watchedEvent.getState() + "-->" + watchedEvent.getType());
break;
case NodeCreated:
//watcher的通知是一次性,一旦触发一次通知后,该watcher就失效。监听执行完需要再次注册监听,此处在getData再次注册
logger.info("创建节点path={},data={}", watchedEvent.getPath(), new String(zooKeeper.getData(watchedEvent.getPath(), true, stat)));
break;
case NodeDataChanged:
logger.info("节点path={}值发生改变,改变后data={}", watchedEvent.getPath(), new String(zooKeeper.getData(watchedEvent.getPath(), true, stat)));
break;
case NodeChildrenChanged:
logger.info("子节点path={}值发生改变,改变后data={}", watchedEvent.getPath(), new String(zooKeeper.getData(watchedEvent.getPath(), true, stat)));
case NodeDeleted:
logger.info("节点被删除path={}", watchedEvent.getPath());
break;
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
注意:watcher的通知是一次性,一旦触发一次通知后,该watcher就失效。所以需要在接收到通知后再次注册
3. Acl操作
public static void main(String[] args) throws Exception {
zooKeeper = new ZooKeeper(CONNECTION_STRING, 50000, watchedEvent -> {
if (watchedEvent.getState() == Watcher.Event.KeeperState.SyncConnected) {
countDownLatch.countDown();
System.out.println(watchedEvent.getState());
}
});
countDownLatch.await();
/* ACL acl1 = new ACL(ZooDefs.Perms.CREATE,new Id("ip","192.168.11.161")); //允许该Ip创建子节点
//ACL acl2 = new ACL(ZooDefs.Perms.READ,new Id("digest","root:root"));
List<ACL> acls = new ArrayList<>();
acls.add(acl1);*/
zooKeeper.addAuthInfo("digest", "root:123456".getBytes());
String result = zooKeeper.create("/auth-test1", "asd".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);
System.out.println(result);
TimeUnit.SECONDS.sleep(10);
}
这里使用"digest":“root”:“123456”,创建了一个节点,并赋予所有权限(read,write.create,delete,admin权限),如图:
zookeeper的权限
- CREATE: 能创建子节点
- READ:能获取节点数据和列出其子节点
- WRITE: 能设置节点数据
- DELETE: 能删除子节点
- ADMIN: 能设置权限
zookeeper的认证方式:
- world:默认方式,相当于全世界都能访问
- auth:代表已经认证通过的用户(cli中可以通过addauth digest user:pwd 来添加当前上下文中的授权用户)
- digest:即用户名:密码这种方式认证,这也是业务系统中最常用的
- ip:使用Ip地址认证