目录

  1. 准备工作
  2. 添加 ZooKeeper 依赖
  3. 基本 Java 客户端示例
  4. 带Watcher的客户端示例
  5. 参考资料

准备工作

在开始之前,确保以下条件:

  • ZooKeeper 服务:已运行(例如单机 localhost:2181 或集群 192.168.1.101:2181,192.168.1.102:2181,192.168.1.103:2181)。
  • Java 环境:JDK 8 或更高版本已安装。
  • 开发工具:推荐使用 Maven 或 Gradle 管理依赖(本教程以 Maven 为例)。

检查 Java

java -version

Are you sure you would like to proceed? If not, you can cancel this operation by closing your browser tab or window now.

---

### 添加 ZooKeeper 依赖
在 Java 项目中添加 ZooKeeper 的客户端库依赖。

#### Maven 配置
编辑 `pom.xml`,添加以下依赖:

xml
org.apache.zookeeper zookeeper 3.8.4

运行 `mvn install` 下载依赖。

---

### 基本 Java 客户端示例
以下是一个简单的 Java 客户端示例,展示如何连接 ZooKeeper 并执行基本操作(创建、读取、更新、删除节点)。

#### 示例代码

java
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;

public class ZooKeeperClient {
private static final String CONNECT_STRING = “localhost:2181”; // 替换为你的 ZooKeeper 地址
private static final int SESSION_TIMEOUT = 30000; // 会话超时时间(毫秒)
private static ZooKeeper zk;

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
    // 连接 ZooKeeper
    zk = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, event -> {
        System.out.println("事件类型: " + event.getType() + ", 路径: " + event.getPath());
    });

    // 创建节点
    String path = "/myNode";
    String data = "Hello ZooKeeper";
    zk.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    System.out.println("创建节点: " + path);

    // 读取数据
    byte[] nodeData = zk.getData(path, false, null);
    System.out.println("读取数据: " + new String(nodeData));

    // 更新数据
    String newData = "Updated Data";
    zk.setData(path, newData.getBytes(), -1); // -1 表示忽略版本检查
    System.out.println("更新数据: " + new String(zk.getData(path, false, null)));

    // 删除节点
    zk.delete(path, -1);
    System.out.println("节点已删除: " + path);

    // 关闭连接
    zk.close();
}

}

- **解释**:
  - `ZooKeeper`:创建 ZooKeeper 连接实例。
  - `create`:创建持久节点(`CreateMode.PERSISTENT`)。
  - `getData`:读取节点数据。
  - `setData`:更新节点数据。
  - `delete`:删除节点。

#### 运行
1. 确保 ZooKeeper 服务运行。
2. 在 IDE 中运行 `ZooKeeperClient.java` 或编译运行:

bash
javac -cp “path/to/zookeeper-3.8.4.jar” ZooKeeperClient.java
java -cp “path/to/zookeeper-3.8.4.jar:.” ZooKeeperClient

---

### 带 Watcher 的客户端示例
ZooKeeper 支持 Watcher 机制,用于监听节点变化事件。

#### 示例代码

java
import org.apache.zookeeper.*;
import java.io.IOException;

public class ZooKeeperWatcher {
private static final String CONNECT_STRING = “localhost:2181”;
private static final int SESSION_TIMEOUT = 30000;
private static ZooKeeper zk;

public static void main(String[] args) throws IOException, KeeperException, InterruptedException {
    // 连接 ZooKeeper
    zk = new ZooKeeper(CONNECT_STRING, SESSION_TIMEOUT, event -> {
        System.out.println("事件类型: " + event.getType() + ", 路径: " + event.getPath());
        if (event.getType() == Watcher.Event.EventType.NodeDataChanged) {
            try {
                System.out.println("数据变更: " + new String(zk.getData(event.getPath(), true, null)));
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    });

    // 创建节点
    String path = "/watchNode";
    zk.create(path, "Initial Data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

    // 设置 Watcher
    zk.getData(path, true, null);

    // 模拟数据变更
    Thread.sleep(1000);
    zk.setData(path, "Changed Data".getBytes(), -1);

    // 等待事件触发
    Thread.sleep(5000);

    // 清理
    zk.delete(path, -1);
    zk.close();
}

}
“`

  • 解释
  • Watcher:通过 Lambda 表达式定义事件监听器。
  • getData(path, true, null):设置 Watcher,true 表示监听变化。
  • 当数据变更时,Watcher 会被触发并打印新数据。

运行

同上,确保 ZooKeeper 服务运行后执行代码。


参考资料


这是 ZooKeeper Java 客户端的搭建教程,涵盖基本操作和事件监听。如果您需要更复杂的示例(例如分布式锁或领导者选举),请告诉我!