zookeeper之java API使用

本文深入探讨了ZooKeeper中节点的同步与异步创建、获取子节点及节点数据的操作方法,包括代码示例与运行结果分析,是理解ZooKeeper节点管理机制的实用指南。

节点创建

package com.zookeeper;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;

public class CreateNodeSync {

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) {
        try {
            zooKeeper = new ZooKeeper("192.168.40.135:2181", 5000, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {

                        doSomeThing();
                    }
                }
            });
            System.out.println("state:{}" + zooKeeper.getState());
            Thread.sleep(Integer.MAX_VALUE);
        }
        catch (IOException e) {
            System.out.println("connect zk failed");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }


    }

    private static void doSomeThing() {
        String path = null;
        try {
            path = zooKeeper.create("/node_4", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }
        catch (KeeperException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("path:" + path);
    }
}

 

同步异步创建:

package com.zookeeper;

import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;

import java.io.IOException;

public class CreateNodeASync {

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) {
        try {
            zooKeeper = new ZooKeeper("192.168.40.135:2181", 5000, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                        doSomeThing();
                    }
                }
            });
            System.out.println("state:{}" + zooKeeper.getState());
            Thread.sleep(Integer.MAX_VALUE);
        }
        catch (IOException e) {
            System.out.println("connect zk failed");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }

    }

    private static void doSomeThing() {
        zooKeeper.create("/node_5", "123".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new IStringClassback(), "异步创建");
    }

    //异步调用,需要 一个回调函数
    static class IStringClassback implements AsyncCallback.StringCallback {

        /**
         * @param rc 返回码,如果异步创建成功,返回0
         * @param path  创建节点的完整路径
         * @param ctx  异步调用的上下文,。。也就是上面传下来的“创建”字符串
         * @param name  服务端返回的已经创建节点的真实路径,如果是顺序节点,那么和path不一致
         */
        public void processResult(int rc, String path, Object ctx, String name) {

            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("rc=" + rc).append("\n");
            stringBuilder.append("path=" + path).append("\n");
            stringBuilder.append("ctx=" + ctx).append("\n");
            stringBuilder.append("name=" + name).append("\n");
            System.out.println(stringBuilder.toString());

        }
    }
}

运行结果:

同步获取:

package com.zookeeper;

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

import java.io.IOException;
import java.util.List;

public class GetChildSync {

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) {
        try {
            zooKeeper = new ZooKeeper("192.168.40.135:2181", 5000, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {

                        doSomeThing();
                    }
                }
            });
            System.out.println("state:{}" + zooKeeper.getState());
            Thread.sleep(Integer.MAX_VALUE);
        }
        catch (IOException e) {
            System.out.println("connect zk failed");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static void doSomeThing() {
        List<String> children = null;
        try {
            //false表示不需要需要关注子节点的变化
            children = zooKeeper.getChildren("/", false);
        }
        catch (KeeperException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("children:" + children);
    }
}

运行结果:

如果需要关注子节点的变化:

package com.zookeeper;

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

import java.io.IOException;
import java.util.List;

public class GetChildSync {

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) {
        try {
            zooKeeper = new ZooKeeper("192.168.40.135:2181", 5000, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                        if (watchedEvent.getType() == Event.EventType.None && null == watchedEvent.getPath()) {
                            doSomeThing();
                        } else {
                            if (watchedEvent.getType() == Event.EventType.NodeChildrenChanged) {
                                try {
                                    System.out.println(zooKeeper.getChildren(watchedEvent.getPath(), true));
                                }
                                catch (KeeperException e) {
                                    e.printStackTrace();
                                }
                                catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }

                    }
                }
            });
            System.out.println("state:{}" + zooKeeper.getState());
            Thread.sleep(Integer.MAX_VALUE);
        }
        catch (IOException e) {
            System.out.println("connect zk failed");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static void doSomeThing() {
        List<String> children = null;
        try {
            //false表示不需要需要关注子节点的变化
            children = zooKeeper.getChildren("/", true);
        }
        catch (KeeperException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("children:" + children);
    }
}

运行结果:

通过服务端给根节点添加一个子节点,就会打印出来:

异步获取:

package com.zookeeper;

import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;
import java.util.List;

public class GetChildASync {

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) {
        try {
            zooKeeper = new ZooKeeper("192.168.40.135:2181", 5000, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                        if (watchedEvent.getType() == Event.EventType.None && null == watchedEvent.getPath()) {
                            doSomeThing();
                        } else {
                            if (watchedEvent.getType() == Event.EventType.NodeChildrenChanged) {
                                zooKeeper.getChildren(watchedEvent.getPath(), true, new ChildrenClallBack(), "异步获取");
                            }
                        }

                    }
                }
            });
            System.out.println("state:{}" + zooKeeper.getState());
            Thread.sleep(Integer.MAX_VALUE);
        }
        catch (IOException e) {
            System.out.println("connect zk failed");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    static class ChildrenClallBack implements AsyncCallback.Children2Callback {
        /**
         *
         * @param rc  返回码,如果异步创建成功,返回0
         * @param path  创建节点的完整路径
         * @param ctx  异步调用的上下文,。。也就是上面传下来的“异步获取”字符串
         * @param children
         * @param stat
         */
        public void processResult(int rc, String path, Object ctx, List<String> children, Stat stat) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("rc=" + rc).append("\n");
            stringBuilder.append("path=" + path).append("\n");
            stringBuilder.append("ctx=" + ctx).append("\n");
            stringBuilder.append("children=" + children).append("\n");
            stringBuilder.append("stat=" + stat).append("\n");
            System.out.println(stringBuilder.toString());
        }
    }
    private static void doSomeThing() {
        //false表示不需要需要关注子节点的变化
        zooKeeper.getChildren("/", true, new ChildrenClallBack(), "异步获取");
    }
}

运行结果:

同步获取节点数据:

package com.zookeeper;

import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;

public class GetDataSync {

    private static ZooKeeper zooKeeper;
    private static Stat stat = new Stat();

    public static void main(String[] args) {
        try {
            zooKeeper = new ZooKeeper("192.168.40.135:2181", 5000, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                        if (watchedEvent.getType() == Event.EventType.None && null == watchedEvent.getPath()) {
                            doSomeThing();
                        } else {
                            if (watchedEvent.getType() == Event.EventType.NodeDataChanged) {
                                try {
                                    System.out.println(new String(zooKeeper.getData(watchedEvent.getPath(), true, stat)));
                                }
                                catch (KeeperException e) {
                                    e.printStackTrace();
                                }
                                catch (InterruptedException e) {
                                    e.printStackTrace();
                                }
                            }
                        }

                    }
                }
            });
            System.out.println("state:{}" + zooKeeper.getState());
            Thread.sleep(Integer.MAX_VALUE);
        }
        catch (IOException e) {
            System.out.println("connect zk failed");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    private static void doSomeThing() {
        byte[] data = null;
        try {
            //false表示不需要需要关注子节点的变化
            data = zooKeeper.getData("/node_5", true, stat);
        }
        catch (KeeperException e) {
            e.printStackTrace();
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("data:" + new String(data));
        System.out.println("stat:" + stat);
    }
}

运行结果:

异步获取节点数据:

package com.zookeeper;

import org.apache.zookeeper.AsyncCallback;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;

public class GetDataASync {

    private static ZooKeeper zooKeeper;

    public static void main(String[] args) {
        try {
            zooKeeper = new ZooKeeper("192.168.40.135:2181", 5000, new Watcher() {
                public void process(WatchedEvent watchedEvent) {
                    if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                        if (watchedEvent.getType() == Event.EventType.None && null == watchedEvent.getPath()) {
                            doSomeThing();
                        } else {
                            if (watchedEvent.getType() == Event.EventType.NodeDataChanged) {
                                zooKeeper.getData(watchedEvent.getPath(), true, new DataClallBack(), "异步获取节点数据");
                            }
                        }

                    }
                }
            });
            Thread.sleep(Integer.MAX_VALUE);
        }
        catch (IOException e) {
            System.out.println("connect zk failed");
        }
        catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    static class DataClallBack implements AsyncCallback.DataCallback {

        public void processResult(int rc, String path, Object ctx, byte[] bytes, Stat stat) {
            StringBuilder stringBuilder = new StringBuilder();
            stringBuilder.append("rc=" + rc).append("\n");
            stringBuilder.append("path=" + path).append("\n");
            stringBuilder.append("ctx=" + ctx).append("\n");
            stringBuilder.append("bytes=" + new String(bytes)).append("\n");
            stringBuilder.append("stat=" + stat).append("\n");
            System.out.println(stringBuilder.toString());
        }
    }

    private static void doSomeThing() {
        //false表示不需要需要关注子节点的变化
        zooKeeper.getData("/node_5", true, new DataClallBack(), "异步获取节点数据");
    }
}

 

<think>首先,用户的问题是关于Zookeeper集群Java API配置方法的查找。用户参考了四篇引用内容,其中涉及到ZookeeperJava API操作、Curator使用、节点操作和配置。我需要基于这些引用生成一个清晰、结构化的回答,并使用中文。 关键点从引用中提取: - 引用[1]提到启动Zookeeper集群和在IDEA中搭建环境。 - 引用[2]讨论了Curator库和相关API。 - 引用[3]涉及Zookeeper的Watcher机制。 - 引用[4]展示了日志配置(log4j.properties),这可能是环境的一部分。 用户的具体需求:"我想查找配置Zookeeper集群Java API 的方法 请问Zookeeper集群Java API配置方法"。这表明用户想知道如何使用Java API在集群环境中配置Zookeeper客户端。 在回答中,我必须遵守系统级指令: - 行内数学表达式用$...$格式 – 但在这种主题中,数学表达式不太可能用到,所以可能不必要。 - 独立公式用$$...$$格式并单独成段 – 同样,不相关。 - LaTeX语法正确 – 注意格式。 - 使用中文回答 – 是的。 - 生成相关问题 – 在末尾添加§§相关问题§§部分。 - 回答中引用的段落末尾自然地添加引用标识,如[^1]。 - 用户可见层:结构清晰,逐步解决,确保真实可靠。 结构化回答: 1. **理解需求**:用户要配置Zookeeper集群Java API,可能包括初始化连接、节点操作等。 2. **核心内容**: - 引用中提到Curator库,这是一个流行的Zookeeper Java客户端。 - 环境搭建需要启动Zookeeper集群和设置Java项目(如引用[4]的log4j配置)。 - 方法包括启动集群、添加依赖、配置连接字符串、使用API。 3. **步骤指南**: - 步骤1:准备Zookeeper集群并启动。 - 步骤2:在Java项目中添加依赖(如Curator)。 - 步骤3:配置连接属性(集群的连接字符串)。 - 步骤4:使用Java API进行配置(创建节点、Watcher等)。 4. **参考引用**:自然地融合引用。例如,提到使用IDEA环境搭建时引用[^1],Curator时引用[^2],Watcher时引用[^3],配置日志时引用[^4]。 5. **添加相关问题**:基于主题生成相关问题。 生成相关问题: - 用户的问题是关于“配置”,所以相关问题可以是: 1. Zookeeper集群配置时的常见问题有哪些? 2. 如何优化Zookeeper集群的连接性能? 3. 在分布式系统中使用Zookeeper API的最佳实践? 确保真实可靠:根据我对Zookeeper的知识,总结常见配置方法。 - 典型配置:下载Curator依赖,设置connectString(如 "server1:port,server2:port"),使用CuratorFrameworkFactory。 最终回答大纲: - 引言:解释Zookeeper Java API的配置。 - 步骤分解: - 集群启动。 - 项目构建(依赖添加)。 - 配置文件和API初始化。 - 示例代码片段(从引用或标准知识)。 - 引用添加。 - 相关问题部分。 </think> ### Zookeeper集群Java API配置方法 以下是配置Zookeeper集群Java API的逐步指南,基于通用最佳实践和参考信息。主要使用Curator库(一个广泛应用的ZooKeeper客户端框架)来简化操作,确保高可用性和容错性。配置过程需要先启动Zookeeper集群,然后在Java项目中集成并初始化API。以下是详细步骤,附带代码示例和关键说明。 #### 步骤1: 启动Zookeeper集群 在配置Java API前,必须先部署并启动Zookeeper集群: - 确保每个集群节点(例如3节点)已安装Zookeeper,并配置好 `zoo.cfg` 文件(包括server列表、端口等)。 - 依次启动所有节点(如通过 `./bin/zkServer.sh start`)。 - 验证集群状态(如使用 `zkServer.sh status` 确认主从角色)[^1][^2]。 #### 步骤2: Java项目环境搭建 在IDEA或Eclipse中创建Java项目: - 添加Curator和Zookeeper依赖(使用Maven或Gradle)。例如,在 `pom.xml` 中添加以下依赖: ```xml <dependencies> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.2.0</version> <!-- 使用最新稳定版本 --> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.2.0</version> </dependency> </dependencies> ``` 这将自动包含Zookeeper核心客户端库[^2][^3]。 - 配置日志输出(可选但推荐),在Java资源目录下添加 `log4j.properties` 文件,内容参考: ```properties log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n ``` 这有助于调试API操作和事件监听[^4]。 #### 步骤3: 配置API连接集群 通过CuratorFactory创建连接实例,关键点包括集群连接字符串和重试策略: - 使用集群所有节点的地址(如 `"server1:2181,server2:2181,server3:2181"`)。 - 实现代码示例(Java): ```java import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; public class ZkClusterConfig { public static void main(String[] args) throws Exception { // 配置连接字符串和重试策略(避免集群网络抖动) String connectString = "server1:2181,server2:2181,server3:2181"; // 替换为实际集群地址 ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3); // 初始重试间隔1s, 最多重试3次 // 创建Curator客户端实例 CuratorFramework client = CuratorFrameworkFactory .builder() .connectString(connectString) .retryPolicy(retryPolicy) .namespace("myapp") // 可选:指定命名空间隔离数据 .build(); // 启动连接 client.start(); // 示例:检查连接状态 System.out.println("集群连接状态: " + client.getState()); } } ``` 重要说明: - `connectString` 必须包含所有集群节点地址,确保高可用性。 - 重试策略(如 `ExponentialBackoffRetry`)处理临时网络故障。 - `client.start()` 初始化连接;结束时应调用 `client.close()` 释放资源[^2][^3]。 #### 步骤4: 基本API操作与事件监听 配置成功后,可使用API进行节点管理和Watcher事件监听: - 创建节点(带Watcher监听变更): ```java // 在步骤3的基础上追加 String path = "/my_node"; byte[] data = "Hello ZooKeeper".getBytes(); // 创建节点 if (client.checkExists().forPath(path) == null) { client.create() .creatingParentsIfNeeded() // 如果需要则创建父节点 .forPath(path, data); } // 注册Watcher监听节点变化 client.getData().watched().forPath(path); // 当节点数据变化时触发事件 ``` Watcher流程:事件触发后,服务端通知客户端回调用注册的Watcher[^3][^2]。 - 验证节点是否存在: ```java // 判断znode状态 Stat stat = client.checkExists().forPath(path); // 返回Stat对象或null System.out.println("节点存在: " + (stat != null)); ``` #### 注意事项 - **集群参数调优**:设置合理的超时和重试参数(例如通过 `connectionTimeoutMs` 和 `sessionTimeoutMs`),避免超时错误。 - **安全问题**:在生产环境中,启用ACL(Access Control Lists)保护节点。 - **错误处理**:使用try-catch包裹API调用,处理 `KeeperException` 和 `InterruptedException`。 如需更多分布式锁或高级特性,Curator提供了 `InterProcessMutex` 等实用工具[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值