Zookeeper(三)-- JAVA原生API

1、前提

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

2、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
 */
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);
    }
}
复制代码

欢迎关注个人公众号,第一时间接收最新文章~ 搜索公众号: 码咖 或者 扫描下方二维码:

img
相关文章
相关标签/搜索