04、使用 Java API 操作 Zookeeper

使用 Java API 操作 Zookeeper

  • 1.创建 Znode
  • 1.1创建项目
  • 1.2修改 POM 文件添加依赖
  • 1.3创建 Znode 并添加数据
  • 2.获取 Znode 中的数据
  • 2.1获取指定节点中的数据
  • 2.2获取所有子节点中的数据
  • 3.设置 Znode 中的值
  • 4.删除 Znode

1.创建 Znode

1.1创建项目

创建一个新的 Maven 项目,并且将其配置为一个标准的 Java 应用。在您的IDE中创建一个新的 Maven 工程,
比如使用 IntelliJ IDEA,选择 File > New > Project,然后选择 Maven 项目类型,填写 GroupId 和 ArtifactId,完成项目创建。

 

1.2修改 POM 文件添加依赖

为了在我们的 Java 应用中使用 ZooKeeper 客户端,需要在 pom.xml 文件中添加如下依赖,这样我们就可以使用 ZooKeeper 提供的 API 来进行操作了。

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

1.3创建 Znode 并添加数据

下面的示例代码展示了如何使用 ZooKeeper 的 Java 客户端来创建一个新的 Znode 并向其添加数据。

package com.myapp.zookeeper;

import org.apache.zookeeper.*;

import java.io.IOException;

public class ZNodeCreator implements Watcher {

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        // 连接 ZooKeeper 服务器
        zooKeeper = new ZooKeeper("192.168.0.110:2181", 30000, new ZNodeCreator());

        // 创建持久化 Znode 节点
        String nodePath = "/myZnode"; // 节点路径
        byte[] nodeData = "Hello ZooKeeper!".getBytes(); // 节点数据
        String createdPath = zooKeeper.create(nodePath, nodeData, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("创建了新的 Znode, 路径为: " + createdPath);
    }

    @Override
    public void process(WatchedEvent event) {
        // 在这里处理事件回调
        System.out.println("触发了事件:" + event.getType());
    }
}

2.获取 Znode 中的数据

2.1获取指定节点中的数据

获取指定节点的数据十分简单,我们可以使用 getData 方法来实现。

public class ZNodeDataRetriever implements Watcher {

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        ZooKeeper zooKeeper = new ZooKeeper("192.168.0.110:2181", 30000, new ZNodeDataRetriever());

        // 获取节点数据
        String nodePath = "/myZnode"; // 节点路径
        byte[] data = zooKeeper.getData(nodePath, true, null); // true 表示设置监听事件
        System.out.println("节点 " + nodePath + " 的数据为: " + new String(data));
    }

    @Override
    public void process(WatchedEvent event) {
        System.out.println("触发了事件:" + event.getType());
    }
}

2.2获取所有子节点中的数据

如果我们想要获取某个节点下所有子节点的数据,可以使用 getChildren 方法来遍历所有子节点。

public class ZNodeChildrenRetriever implements Watcher {

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        ZooKeeper zooKeeper = new ZooKeeper("192.168.0.110:2181", 30000, new ZNodeChildrenRetriever());

        // 获取子节点列表
        String parentNodePath = "/myZnode"; // 父节点路径
        java.util.List<String> children = zooKeeper.getChildren(parentNodePath, true); // true 表示设置监听事件
        for (String child : children) {
            // 获取子节点的完整路径
            String childPath = parentNodePath + "/" + child;
            // 获取子节点数据
            byte[] childData = zooKeeper.getData(childPath, false, null);
            System.out.println("子节点 " + childPath + " 的数据为: " + new String(childData));
        }
    }

    @Override
    public void process(WatchedEvent event) {
        System.out.println("触发了事件:" + event.getType());
    }
}

3.设置 Znode 中的值

要更改一个 Znode 的数据,可以使用 setData 方法。

public class ZNodeDataSetter implements Watcher {

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        ZooKeeper zooKeeper = new ZooKeeper("192.168.0.110:2181", 30000, new ZNodeDataSetter());

        // 更新节点数据
        String nodePath = "/myZnode"; // 节点路径
        byte[] newData = "New Data".getBytes();
        zooKeeper.setData(nodePath, newData, -1); // -1 表示忽略版本检查
        System.out.println("节点 " + nodePath + " 的数据已更新。");
    }

    @Override
    public void process(WatchedEvent event) {
        System.out.println("触发了事件:" + event.getType());
    }
}

4.删除 Znode

最后,当我们不再需要一个 Znode 时,可以使用 delete 方法来移除它。

public class ZNodeDeleter implements Watcher {

    public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
        ZooKeeper zooKeeper = new ZooKeeper("192.168.0.110:2181", 30000, new ZNodeDeleter());

        // 删除节点
        String nodePath = "/myZnode"; // 节点路径
        zooKeeper.delete(nodePath, -1); // -1 表示忽略版本检查
        System.out.println("节点 " + nodePath + " 已被删除。");
    }

    @Override
    public void process(WatchedEvent event) {
        System.out.println("触发了事件:" + event.getType());
    }
}

以上就是使用 Java API 来操作 ZooKeeper 的基础教程。每部分代码展示了如何进行基本的 CRUD 操作,从创建节点到删除节点。