美文网首页
Zookeeper(三)-- JAVA原生API

Zookeeper(三)-- JAVA原生API

作者: 码咖 | 来源:发表于2019-08-01 09:21 被阅读0次

    一、前提

    jar包:zookeeper-3.4.9.jar,slf4j-api-1.6.1.jar,slf4j-log4j12-1.6.1.jar,log4j-1.2.15.jar

    二、Demo

    package com.xbq.zookeeper;
    
    import java.security.NoSuchAlgorithmException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.zookeeper.CreateMode;
    import org.apache.zookeeper.KeeperException;
    import org.apache.zookeeper.WatchedEvent;
    import org.apache.zookeeper.Watcher;
    import org.apache.zookeeper.ZooDefs;
    import org.apache.zookeeper.ZooDefs.Ids;
    import org.apache.zookeeper.ZooKeeper;
    import org.apache.zookeeper.data.ACL;
    import org.apache.zookeeper.data.Id;
    import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
    
    /** 
     * @ClassName: ZookeeperDemo
     * @Description: TODO zookeeper测试
     * @author xbq
     * @version 1.0
     * @date 2017-3-10 下午5:05:16
     */
    public class ZookeeperDemo {
    
        private static final int SESSION_TIMEOUT = 3000;
        
        public static void main(String[] args) {
         Zookeeper zooKeeper = null;
            try {
                zooKeeper = new ZooKeeper("192.168.242.128:2183", SESSION_TIMEOUT, new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        System.out.println("触发事件:" + event.getType());
                    }
                });
                String path = "/node_xbq";
                String data = "TestxbqCoder";
                
                create(zooKeeper, path, data);
                
    //            update(zooKeeper, path, data);
                
    //            delete(zooKeeper, path);
                
    //            aclOper(zooKeeper, path, data);
                
    //            aclOper2(zooKeeper, path, data);
                
    //            doWatch(zooKeeper, path, data);
                
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
            if(zooKeeper ! = null){
              try{
                zooKeeper.close();
              }catch(Exception e){
              }
           }
            }
        }
        
        /**
         * @Title: create
         * @Description: TODO    增加操作
         * @param zooKeeper
         * @param path
         * @param data
         * @throws KeeperException
         * @throws InterruptedException
         * @return: void
         */
        public static void create(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
            if(zooKeeper.exists(path, false) == null){    // 如果不存在节点,就新建
                // 第三个参数是 权限,第四个参数 代表持久节点
           // 权限分类:OPEN_ACL_UNSAFE:对所有用户开放    READ_ACL_UNSAFE:只读   CREATOR_ALL_ACL: 创建者可以做任何操作
                zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
            System.out.println(new String(zooKeeper.getData(path, true, null)));
        }
        
        /**
         * @Title: update
         * @Description: TODO 修改操作
         * @param zooKeeper
         * @return: void
         * @throws InterruptedException 
         * @throws KeeperException 
         */
        public static void update(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException { 
            zooKeeper.setData(path, data.getBytes(), -1);  // -1标识任何版本号 都可以
            System.out.println(new String(zooKeeper.getData(path, true, null)));
        }
        
        /**
         * @Title: delete
         * @Description: TODO 删除
         * @param zooKeeper
         * @param path
         * @throws KeeperException
         * @throws InterruptedException
         * @return: void
         */
        public static void delete(ZooKeeper zooKeeper, String path) throws KeeperException, InterruptedException{
            if(zooKeeper.exists(path, false) != null){
                zooKeeper.delete(path, -1);
            }
            if(zooKeeper.exists(path, false) != null){
                System.out.println(new String(zooKeeper.getData(path, true, null)));
            }
        }
        
        /**
         * @Title: aclOper
         * @Description: TODO 权限测试    先创建一个只读权限节点,然后更新该节点
         * @param zooKeeper
         * @param path
         * @param data
         * @throws KeeperException
         * @throws InterruptedException
         * @return: void
         */
        public static void aclOper(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
            // 首先创建一个只读的节点。第三个参数 代表只读权限
            zooKeeper.create(path, data.getBytes(), Ids.READ_ACL_UNSAFE, CreateMode.PERSISTENT);
            System.out.println(new String(zooKeeper.getData(path, true, null)));
            // 测试更新节点,因为增加的是 只读的,所以 应该是不可以修改的。发现报错:org.apache.zookeeper.KeeperException$NoAuthException: KeeperErrorCode = NoAuth for /node_xbq
            zooKeeper.setData(path, "testRead_ACL".getBytes(), -1);
        }
        
        /**
         * @Title: aclOper2
         * @Description: TODO  自定义权限验证
       * 自定义schema权限类型:digest,world,auth,ip,这里用 digest举例
         * @param zooKeeper
         * @param path
         * @param data
         * @throws KeeperException
         * @throws InterruptedException
         * @throws NoSuchAlgorithmException
         * @return: void
         */
        public static void aclOper2(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException, NoSuchAlgorithmException{
            // 第一个参数是 所有的权限,第二个参数是 通过 用户名和密码 验证
            ACL acl = new ACL(ZooDefs.Perms.ALL, new Id("digest", DigestAuthenticationProvider.generateDigest("root:root")));
            List<ACL> acls = new ArrayList<ACL>();
            acls.add(acl);
            
            if(zooKeeper.exists(path, false) == null){
                zooKeeper.create(path, data.getBytes(), acls, CreateMode.PERSISTENT);
            }
            
            zooKeeper.addAuthInfo("digest", "root:root".getBytes());
            
            // 通过下面的方式 是可以取到值的,因为 加了 用户名和 密码 验证 ,需要 加上  zooKeeper.addAuthInfo("digest", "root:root".getBytes());
            System.out.println(new String(zooKeeper.getData(path, true, null)));
        }
        
        /**
         * @Title: doWatch
         * @Description: TODO 监听
         * @param zooKeeper
         * @param path
         * @param data
         * @throws KeeperException
         * @throws InterruptedException
         * @return: void
         */
        public static void doWatch(ZooKeeper zooKeeper, String path, String data) throws KeeperException, InterruptedException{
            if(zooKeeper.exists(path, false) == null){
                zooKeeper.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }
            // 监听 path节点
            zooKeeper.getData(path, new Watcher() {
                @Override
                public void process(WatchedEvent event) {
                    System.out.println("触发了节点变更事件:" + event.getType());
                }
            }, null);
            // 用更新操作触发 监听事件
            zooKeeper.setData(path, "updateTest".getBytes(), -1);
        }
    }
    

    欢迎关注我的公众号,第一时间接收文章推送~ 搜索公众号: 码咖 或者 扫描下方二维码:


    qrcode_wx.jpg

    相关文章

      网友评论

          本文标题:Zookeeper(三)-- JAVA原生API

          本文链接:https://www.haomeiwen.com/subject/jnbfdctx.html