zookeeper学习(八)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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地址认证

完整代码地址:https://github.com/pengxincheng/zookeeper-learn

猜你喜欢

转载自blog.csdn.net/qq_27399407/article/details/85342824