Zookeeper的Api使用

Zookeeper api

Zookeeper API共包含五个包,分别为:
(1)org.apache.zookeeper
(2)org.apache.zookeeper.data
(3)org.apache.zookeeper.server
(4)org.apache.zookeeper.server.quorum
(5)org.apache.zookeeper.server.upgrade
其中org.apache.zookeeper,包含Zookeeper类,他是我们编程时最常⽤的类⽂件。这个类是Zookeeper客户端的主要类⽂件。如果要使⽤Zookeeper服务,应⽤程序⾸先必须创建⼀个Zookeeper实例,这时就需要使⽤此类。⼀旦客户端和Zookeeper服务端建⽴起了连接,Zookeeper系统将会给本次连接会话分配⼀个ID值,并且客户端将会周期性的向服务器端发送⼼跳来维持会话连接。只要连接有效,客户端就可以使⽤Zookeeper API来做相应处理了。
准备⼯作:导⼊依赖

<dependency>
	 <groupId>org.apache.zookeeper</groupId>
	 <artifactId>zookeeper</artifactId>
	 <version>3.4.14</version>
 </dependency>

建立会话

public class CreateSession implements Watcher {

    private static final CountDownLatch countDownLatch = new CountDownLatch(1);

    public static void main(String[] args) throws IOException, InterruptedException {
        /*
        客户端可以通过创建一个zk实例来连接zk服务器
        new Zookeeper(connectString,sesssionTimeOut,Wather)
        connectString: 连接地址:IP:端口
        sesssionTimeOut:会话超时时间:单位毫秒
        Wather:监听器(当特定事件触发监听时,zk会通过watcher通知到客户端)
     */
        ZooKeeper zooKeeper = new ZooKeeper("8.129.124.193:2181",5000,new CreateSession());
        System.out.println(zooKeeper.getState());
        countDownLatch.await();
        System.out.println("=========Client Connected to zookeeper==========");
    }


    @Override
    public void process(WatchedEvent watchedEvent) {
        //当连接创建了,服务端发送给客户端SyncConnected事件
        if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
            countDownLatch.countDown();
            System.out.println("连接成功");
        }
    }
}

注意,ZooKeeper 客户端和服务端会话的建⽴是⼀个异步的过程,也就是说在程序中,构造⽅法会在处理完客户端初始化⼯作后⽴即返回,在⼤多数情况下,此时并没有真正建⽴好⼀个可⽤的会话,在会话的⽣命周期中处于“CONNECTING”的状态。 当该会话真正创建完毕后ZooKeeper服务端会向会话对应的客户端发送⼀个事件通知,以告知客户端,客户端只有在获取这个通知之后,才算真正建⽴了会话。

创建节点

public class CreateNote implements Watcher {
    
    private static ZooKeeper zooKeeper = null;

    public static void main(String[] args) throws IOException, InterruptedException {

        zooKeeper = new ZooKeeper("8.129.124.193:2181", 5000, new CreateNote());
      //  countDownLatch.await();
        System.out.println("=========Client Connected to zookeeper==========");
        Thread.sleep(Integer.MAX_VALUE);
    }

    @Override
    public void process(WatchedEvent watchedEvent) {
        //当连接创建了,服务端发送给客户端SyncConnected事件
        if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
        //    countDownLatch.countDown();
            System.out.println("连接成功");
        }

        try {
            createNoteSync();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void createNoteSync() throws Exception {
		/**
		 * path :节点创建的路径
		 * data[] :节点创建要保存的数据,是个byte类型的
		 * acl :节点创建的权限信息(4种类型)
		 * ANYONE_ID_UNSAFE : 表示任何⼈
		 * AUTH_IDS :此ID仅可⽤于设置ACL。它将被客户机验证的ID替
		换。
		 * OPEN_ACL_UNSAFE :这是⼀个完全开放的ACL(常⽤)-->
		world:anyone
		 * CREATOR_ALL_ACL :此ACL授予创建者身份验证ID的所有权限
		 * createMode :创建节点的类型(4种类型)
		 * PERSISTENT:持久节点
		 * PERSISTENT_SEQUENTIAL:持久顺序节点
		 * EPHEMERAL:临时节点
		 * EPHEMERAL_SEQUENTIAL:临时顺序节点
		 String node = zookeeper.create(path,data,acl,createMode);
		 */
        String persistentNode = zooKeeper.create("/jerry", "jerry的持久性节点".getBytes("UTF8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        String persistentSequentialNode = zooKeeper.create("/jerry_sequncetial", "jerry的持久性顺序节点".getBytes("UTF8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        String ephemeralNode = zooKeeper.create("/jerry_ephemeral", "jerry的临时节点".getBytes("UTF8"), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        
        System.out.println("创建的持久性节点:" + persistentNode);
        System.out.println("创建的持久性顺序节点:" + persistentSequentialNode);
        System.out.println("创建的临时节点:" + ephemeralNode);

    }

}

获取节点数据

public class getNoteData implements Watcher {
    private static ZooKeeper zooKeeper = null;
    public static void main(String[] args) throws IOException, InterruptedException {
        zooKeeper = new ZooKeeper("8.129.124.193:2181", 5000, new getNoteData());
      //  countDownLatch.await();
        System.out.println("=========Client Connected to zookeeper==========");
        Thread.sleep(Integer.MAX_VALUE);
    }

    @Override
    public void process(WatchedEvent watchedEvent) {
        //当连接创建了,服务端发送给客户端SyncConnected事件
        if(watchedEvent.getState() == Event.KeeperState.SyncConnected){
            System.out.println("连接成功");
            try {
                getNoteData();
                getChildrens();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

        if(watchedEvent.getType() == Event.EventType.NodeChildrenChanged) {
            try {
                List<String> children = zooKeeper.getChildren(watchedEvent.getPath(), true);
                System.out.println(children);
            } catch (KeeperException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
    /*
        获取某个节点的内容
     */
    private void getNoteData() throws KeeperException, InterruptedException {

        /**
         * path    : 获取数据的路径
         * watc
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值