Zookeeper(55)如何使用Zookeeper的Java API?

89 阅读3分钟

使用 Zookeeper 的 Java API 可以方便地进行各种操作,如创建节点、获取节点数据、设置节点数据、删除节点等。以下是详细的步骤和代码示例,涵盖如何使用 Zookeeper 的 Java API。

1. 添加依赖

首先,需要在项目中添加 Zookeeper 的依赖。以下是 Maven 和 Gradle 的依赖配置:

Maven

pom.xml 中添加 Zookeeper 依赖:

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

Gradle

build.gradle 中添加 Zookeeper 依赖:

dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.7.0'
}

2. 创建 Zookeeper 客户端

通过 ZooKeeper 类来创建 Zookeeper 客户端并连接到 Zookeeper 服务器。

import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.WatchedEvent;

public class ZookeeperClient {
    private static final String ZK_ADDRESS = "localhost:2181";
    private static final int SESSION_TIMEOUT = 3000;
    private ZooKeeper zooKeeper;

    public void connect() throws Exception {
        zooKeeper = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("Received event: " + event);
            }
        });
    }

    public void close() throws InterruptedException {
        if (zooKeeper != null) {
            zooKeeper.close();
        }
    }

    public static void main(String[] args) {
        ZookeeperClient client = new ZookeeperClient();
        try {
            client.connect();
            // 在这里执行 Zookeeper 操作
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3. 基本操作示例

以下是一些常见的 Zookeeper 操作示例。

创建节点

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.data.Stat;

public void createNode(String path, String data) throws Exception {
    byte[] dataBytes = data.getBytes();
    String createdPath = zooKeeper.create(path, dataBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    System.out.println("Created node: " + createdPath);
}

获取节点数据

public String getNodeData(String path) throws Exception {
    byte[] dataBytes = zooKeeper.getData(path, false, null);
    return new String(dataBytes);
}

设置节点数据

public void setNodeData(String path, String data) throws Exception {
    byte[] dataBytes = data.getBytes();
    zooKeeper.setData(path, dataBytes, -1);
    System.out.println("Set data for node: " + path);
}

删除节点

public void deleteNode(String path) throws Exception {
    zooKeeper.delete(path, -1);
    System.out.println("Deleted node: " + path);
}

4. 监视节点变化

通过 Watcher 类可以监视节点的变化。当节点的数据或状态发生变化时,会触发相应的事件。

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

public void watchNode(String path) throws Exception {
    zooKeeper.exists(path, new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            System.out.println("Node changed: " + event.getPath());
            // 重新设置监视器
            try {
                watchNode(event.getPath());
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });
}

5. 示例代码

以下是一个完整的示例代码,展示了如何使用 Zookeeper 的 Java API 进行基本操作和监视节点变化。

import org.apache.zookeeper.*;

public class ZookeeperClient {
    private static final String ZK_ADDRESS = "localhost:2181";
    private static final int SESSION_TIMEOUT = 3000;
    private ZooKeeper zooKeeper;

    public void connect() throws Exception {
        zooKeeper = new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("Received event: " + event);
            }
        });
    }

    public void close() throws InterruptedException {
        if (zooKeeper != null) {
            zooKeeper.close();
        }
    }

    public void createNode(String path, String data) throws Exception {
        byte[] dataBytes = data.getBytes();
        String createdPath = zooKeeper.create(path, dataBytes, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("Created node: " + createdPath);
    }

    public String getNodeData(String path) throws Exception {
        byte[] dataBytes = zooKeeper.getData(path, false, null);
        return new String(dataBytes);
    }

    public void setNodeData(String path, String data) throws Exception {
        byte[] dataBytes = data.getBytes();
        zooKeeper.setData(path, dataBytes, -1);
        System.out.println("Set data for node: " + path);
    }

    public void deleteNode(String path) throws Exception {
        zooKeeper.delete(path, -1);
        System.out.println("Deleted node: " + path);
    }

    public void watchNode(String path) throws Exception {
        zooKeeper.exists(path, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("Node changed: " + event.getPath());
                // 重新设置监视器
                try {
                    watchNode(event.getPath());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static void main(String[] args) {
        ZookeeperClient client = new ZookeeperClient();
        try {
            client.connect();

            // 创建节点
            client.createNode("/example_node", "example_data");

            // 获取节点数据
            String data = client.getNodeData("/example_node");
            System.out.println("Node data: " + data);

            // 设置节点数据
            client.setNodeData("/example_node", "new_example_data");

            // 获取节点数据
            data = client.getNodeData("/example_node");
            System.out.println("Node data: " + data);

            // 监视节点变化
            client.watchNode("/example_node");

            // 模拟等待节点变化
            Thread.sleep(10000);

            // 删除节点
            client.deleteNode("/example_node");

            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

总结

  1. 添加依赖:在项目中添加 Zookeeper 的依赖。
  2. 创建客户端:通过 ZooKeeper 类创建 Zookeeper 客户端并连接到服务器。
  3. 基本操作:创建节点、获取节点数据、设置节点数据、删除节点。
  4. 监视节点变化:使用 Watcher 类监视节点的变化。
  5. 示例代码:通过完整的示例代码展示如何使用 Zookeeper 的 Java API 进行操作。

通过以上方法,可以熟练使用 Zookeeper 的 Java API 进行各种操作,确保其高效稳定地运行。根据实际情况和需求,选择适合你的操作方法并进行实施。