Zookeeper 操作练习

2021-12-22 16:15:25 浏览数 (1)

ZooKeeper API的基础知识

与ZooKeeper集合进行交互的应用程序称为 ZooKeeper客户端或简称客户端。 Znode是ZooKeeper集合的核心组件,ZooKeeper API提供了一小组方法使用ZooKeeper集合来操纵znode的所有细节。

客户端应该遵循以步骤,与ZooKeeper集合进行清晰和干净的交互。
  • 连接到ZooKeeper集合。ZooKeeper集合为客户端分配会话ID
  • 定期向服务器发送心跳。否则,ZooKeeper集合将过期会话ID,客户端需要重新连接。
  • 只要会话ID处于活动状态,就可以获取/设置znode。
  • 所有任务完成后,断开与ZooKeeper集合的连接。如果客户端长时间不活动,则ZooKeeper集合将自动断开客户端。
ZooKeeper API的核心部分ZooKeeper类

本章中最重要的一组ZooKeeper API。ZooKeeper API的核心部分是ZooKeeper类。它提供了在其构造函数中连接ZooKeeper集合的选项,并具有以下方法:

  • connect - 连接到ZooKeeper集合
  • create- 创建znode
  • exists- 检查znode是否存在及其信息
  • getData - 从特定的znode获取数据
  • setData - 在特定的znode中设置数据
  • getChildren - 获取特定znode中的所有子节点
  • delete - 删除特定的znode及其所有子项
  • close - 关闭连接
maven引一下
代码语言:javascript复制
 <dependencies>
        <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <type>pom</type>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
        <!--<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.2.0</version>
        </dependency>
-->
  
    </dependencies>
1.构造创发建立连接

ZooKeeper类通过其多种构造函数提供connect功能。如下 : ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)

  • connectionString - ZooKeeper集合主机,多个主机之间以逗号进行分割eg:"ip1:2181,ip2:2181,ip3:2181"。
  • sessionTimeout - 会话超时(以毫秒为单位)。
  • watcher - 实现“监视器”界面的对象。ZooKeeper集合通过监视器对象返回连接状态。

这里用watcher结合countDownLatch做了一个计数,阻塞主线程直至连接上并减计数器countDownLatch,当连接建立成功后才进行打印当前连接状态.

代码语言:javascript复制
private static void getZkConection() {
        CountDownLatch countDownLatch=new CountDownLatch(1);
        String connection="ip:port";
        try {
           zooKeeper=new ZooKeeper(connection, 4000, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState()==Event.KeeperState.SyncConnected){
                        countDownLatch.countDown();
                    }
                }
            });

        } catch (IOException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public static void closeZkConnection(){
        try {
            zooKeeper.close();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Zookeeper的增删改查

1.create--创建Znode

ZooKeeper类提供了在ZooKeeper集合中创建一个新的znode的create方法。 create 方法的签名如下: create(String path, byte[] data, List<ACL> acl, CreateMode createMode)

  • path - Znode路径。例如,/myapp1,/myapp2,/myapp1/mydata1
  • data - 要存储在指定znode路径中的数据
  • acl - 要创建的节点的访问控制列表。ZooKeeper API提供了一个静态接口 ZooDefs.Ids 来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE返回打开znode的acl列表。
  • createMode - 节点的类型,即临时,顺序,持久等。这是一个枚举。
代码语言:javascript复制
private static void createZkMode() {
        try {
            zooKeeper.create("/test2", "JavaApiTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

结果

2 . Exists-- 检查Znode的存在返回一个结点信息stat

ZooKeeper类提供了 exists 方法来检查znode的存在。如果指定的znode存在,则返回一个znode的元数据。exists方法的签名如下: exists(String path, boolean watcher)

  • path- Znode路径
  • exists(String path, boolean watcher) watcher - 布尔值,用于指定是否监视指定的znode
代码语言:javascript复制
  private static void checkZnode(String s) {
        try {
            Stat stat = zooKeeper.exists(s, true);
            if (stat==null){
                System.out.println("结点为空");
            }else {
                System.out.println("结点存在,且当前结点的版本为:" stat.getVersion() "创建时间为:" stat.getCtime());
            }
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

结果

3 . getData方法--获取数据值以及结点信息stat

ooKeeper类提供 getData 方法来获取附加在指定znode中的数据及其状态。 getData 方法的签名如下: getData(String path, Watcher watcher, Stat stat)

  • path - Znode路径。
  • watcher - 监视器类型的回调函数。当指定的znode的数据改变时,ZooKeeper集合将通过监视器回调进行通知。这是一次性通知。[可Null]
  • stat - 返回znode的元数据。[可Null]
代码语言:javascript复制
 private static void getZnodeData(String path) {
        try {
            byte[] data = zooKeeper.getData(path, null, null);
            System.out.print("该结点值为" new String(data));
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
setData-- 更改结点值

ZooKeeper类提供 setData 方法来修改指定znode中附加的数据,并且也可以返回一个修改后的stat值。 setData 方法的签名如下: setData(String path, byte[] data, int version)

  • path- Znode路径
  • data - 要存储在指定znode路径中的数据。
  • version- znode的当前版本。每当数据更改时,ZooKeeper会更新znode的版本号。
代码语言:javascript复制
private static void setZnode(String path) {
        try {
            Stat stat = zooKeeper.exists(path, false);
            if (stat==null){
                System.out.println("Znode does not exist");
            }else {
                System.out.println("老版本为" stat.getVersion());
                Stat newStat = zooKeeper.setData(path, "newValue".getBytes(), stat.getVersion());
                System.out.println("新版本为" newStat.getVersion());
                getZnodeData(path);
            }
        } catch (KeeperException e) {
            e.printStackTrace();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
delete -- 删除Znode

delete(String path, int version)

  • path - Znode路径。
  • version - znode的当前版本
代码语言:javascript复制
private static void deleteZnode(String path)
    {
        try {
        Stat stat = zooKeeper.exists(path, false);
        if (stat==null){
            System.out.println("Znode does not exist");
        }else {
            zooKeeper.delete(path,stat.getVersion());
        }
    } catch (KeeperException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    }

传的path为"test2,已经没了"

getChildren 获取特定znode的所有子节点

ZooKeeper类提供 getChildren 方法来获取特定znode的所有子节点。 getChildren 方法的签名如下: getChildren(String path, Watcher watcher)

  • path - Znode路径。
  • watcher - 监视器类型的回调函数。当指定的znode被删除或znode下的子节点被创建/删除时,ZooKeeper集合将进行通知。这是一次性通知。[可null]
代码语言:javascript复制
 private static void getZnodeChild(String path) throws KeeperException, InterruptedException {
        Stat stat = zooKeeper.exists(path, null);
        if (stat==null){
            System.out.println("Znode does not exist");
        }else {
        List<String> list = zooKeeper.getChildren(path, null);
            for(int i=0;i<list.size();i  ){
                System.out.println(list.get(i));
            }
        }

    }

0 人点赞