java连接zookeeper

这篇具有很好参考价值的文章主要介绍了java连接zookeeper。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

API

ZooKeeper官方提供了Java API,可以通过Java代码来连接zookeeper服务进行操作。可以连接、创建节点、获取节点数据、监听节点变化等操作,具体有以下几个重要的类:

  1. ZooKeeper:ZooKeeper类是Java API的核心类,用于与ZooKeeper服务器建立连接,并提供了一系列方法来操作ZooKeeper的节点。
  2. Watcher:Watcher是ZooKeeper的一个回调接口,当节点发生变化时会调用相应的方法进行通知。
  3. CreateMode:CreateMode枚举类定义了节点的类型,包括永久节点、临时节点、顺序节点和临时顺序节点。
  4. Stat:Stat类表示节点的元数据信息,比如修改版本、数据长度、子节点数量等。

添加依赖

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

操作例子

String host = "localhost:2181";
//建立连接
zooKeeper = new ZooKeeper(host, 2000, null);
String path = "/test";
Watcher watcher = new Watcher() {
  @Override
  public void process(WatchedEvent watchedEvent) {
    System.out.println("Node changed: " + watchedEvent.getPath());
    System.out.println(watchedEvent);
  }
};
//获取节点状态 如果不存在返回null
Stat stat = zooKeeper.exists(path, false);
if(null != stat){
	System.out.println(stat.getCzxid()+"-"+stat.getAversion());
}

//创建节点 包含版本、时间、数据长度等信息
zooKeeper.create(path,"123".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
//添加watcher
zooKeeper.addWatch(path, watcher, AddWatchMode.PERSISTENT);

//获取节点数据
byte[] data = zooKeeper.getData(path, false, null);
System.out.println(new String(data));

zooKeeper.create(path+"/1","child1".getBytes(),ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
//获取子节点
List<String> children = zooKeeper.getChildren(path, false);
System.out.println("childs size:"+children.size());
//删除子节点
zooKeeper.delete(path+"/1",-1);
zooKeeper.close();
zkClient

zkClient封装了zookeeper的官方api,简化了一些繁琐的操作,并提供了一些额外的功能,提高了开发效.

添加依赖

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.11</version>
</dependency>

zkclient对节点数据的操作进行了序列化, 这里先准备一个string类型的序列化类。需要实现ZkSerializer接口

public class ZkStringSerializer implements ZkSerializer {
    @Override
    public byte[] serialize(Object o) throws ZkMarshallingError {
        return String.valueOf(o).getBytes();
    }

    @Override
    public Object deserialize(byte[] bytes) throws ZkMarshallingError {
        return new String(bytes);
    }
}

基本操作

ZkClient zkClient = new ZkClient("localhost:2181");
//自定义序列化 否则报错
zkClient.setZkSerializer(new ZkStringSerializer());
String path = "/test";
//判断节点是否存在
boolean exist = zkClient.exists(path);
System.out.println(exist);
if(!exist){//创建节点
    zkClient.create(path,"123", CreateMode.PERSISTENT);
}
//读取节点数据
System.out.println((String) zkClient.readData(path));
zkClient.writeData(path,"456");//设置节点数据
System.out.println((String) zkClient.readData(path));
zkClient.delete(path);//删除节点

zkClient.close();

节点变化事件

String path = "/test";
/**
 * 节点变化事件
 * 只监听节点增减,不监听数据变化事件
 */
zkClient.subscribeChildChanges(path, new IZkChildListener() {
    @Override
    public void handleChildChange(String parentPath, List<String> children) throws Exception {
        System.out.println("节点"+parentPath+"发生变化");
        System.out.println(children);
    }
});
//节点操作,观察handleChildChange接收到对应事件
Thread.sleep(2000);
zkClient.createPersistent(path);
Thread.sleep(2000);
zkClient.createPersistent(path+"/child1");
Thread.sleep(2000);
zkClient.writeData(path+"/child1","123");
Thread.sleep(2000);
zkClient.delete(path+"/child1");
Thread.sleep(2000);
zkClient.delete(path);
Thread.sleep(100000);

节点数据变化事件

    String path = "/test";
    /**
     * 节点变化事件,只检测当前节点,感知不到其子节点
     * 节点被删除或节点数据变化
     */
    zkClient.subscribeDataChanges(path, new IZkDataListener() {
        @Override
        public void handleDataChange(String s, Object o) throws Exception {
            System.out.println("节点:"+s+"数据变为:"+o);
        }

        @Override
        public void handleDataDeleted(String s) throws Exception {
            System.out.println("节点:"+s+"删除");
        }
    });

    Thread.sleep(2000);
    zkClient.createPersistent(path);
    Thread.sleep(2000);
    zkClient.createPersistent(path+"/child1");
    Thread.sleep(2000);
    zkClient.delete(path+"/child1");
    Thread.sleep(2000);
    zkClient.writeData(path,"123");
    Thread.sleep(2000);
    zkClient.delete(path);
    Thread.sleep(100000);
}

Curator

curator是另一个java连接zookeeper类库。功能更加强大。提供了连接重试、分布式锁、选举、队列等多种实际场景的用例。这里先简单搞个使用例子。

添加依赖

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>5.1.0</version>
</dependency>

curator-framework是基础的依赖,一些特定的使用方式需要添加不同的依赖,有curator-recipes、curator-x-discovery、curator-x-async等。

基本操作

//创建连接
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
String path = "/test";
client.checkExists().forPath(path);//判断是否存在
client.create().forPath(path, "123".getBytes());//创建节点
byte[] data = client.getData().forPath(path);//获取数据
System.out.println(new String(data));
client.setData().forPath(path, "456".getBytes());//设置数据
client.delete().forPath(path);//删除节点

client.close();

节点监听

CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
String path = "/test";
NodeCache  nodeCache = new NodeCache(client,path);
//添加监听
nodeCache.getListenable().addListener(new NodeCacheListener() {
    @Override
    public void nodeChanged() throws Exception {
        ChildData data = nodeCache.getCurrentData();
        if (data != null) {
            System.out.println("Node changed: " + data.getPath() + ", value: " + new String(data.getData()));
        } else {
            System.out.println("Node deleted: " + nodeCache.getPath());
        }
    }
});
nodeCache.start();
client.create().forPath(path);
client.setData().forPath(path, "123".getBytes());
client.delete().forPath(path);
client.close();

这里NodeCache被标识@Deprecated,也不知道被什么方式代替了,后面再研究。先简单使用。文章来源地址https://www.toymoban.com/news/detail-744995.html

到了这里,关于java连接zookeeper的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 大数据平台迁移后yarn连接zookeeper 异常分析

    XX保险HDP大数据平台机房迁移异常分析。 异常现象: 机房迁移后大部分组件都能正常启动 Yarn 启动后8088 8042等端口无法访问 Hive spark 作业提交到yarn会出现卡死。 【备注】虽然迁移,但IP不变。 问题分析: yarn 6000毫秒内无法活动连接到活跃的zookeeper服务 hdfs hive kafka等组件正常

    2024年02月09日
    浏览(35)
  • 记一次docker安装kafka,zookeeper拒绝连接的问题

    第一次玩kafka,在使用docker安装kafka时,出现了如下问题 kafka的启动参数KAFKA_ZOOKEEPER_CONNECT不能是localhost:2181,因为不是在一个容器中,localhost改为ip地址就可以了 nc 命令连接到 localhost:2181,确保ZooKeeper 服务器正在监听该地址,并且可以通过网络进行访问 定位的过程中还遇到了

    2024年02月10日
    浏览(60)
  • 使用 curator 连接 zookeeper 集群 Invalid config event received

    dubbo整合zookeeper 如图,错误日志 由日志得知 org.apache.curator.framework.imps.EnsembleTracker.processConfigData(EnsembleTracker.java:214) 是 curator 组件的 EnsembleTracker 的 214 行日志错误 顺藤摸瓜 得知,是日志级别的问题,不是异常 搜索引擎搜一下,看是否有人遇到过类似的问题 https://github.com

    2024年02月02日
    浏览(43)
  • Kafka错误解决:kafka.zookeeper.ZooKeeperClientTimeoutException:连接超时等待解决方案

    在使用Kafka时,有时候会遇到\\\"kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection\\\"这样的错误。本文将介绍如何解决这个问题,并提供相应的源代码示例。 Kafka是一个分布式流处理平台,它使用ZooKeeper来管理集群的元数据和协调器。当连接到ZooKeeper服务器超时时,就

    2024年02月06日
    浏览(43)
  • Java操作Zookeeper节点

    引入jar包: zookeeper的权限: ZooKeeper提供了如下几种验证模式(scheme): • digest:Client端由用户名和密码验证,譬如user:password,digest的密码生成方式是Sha1摘要的base64形式 • auth:不使用任何id,代表任何已确认用户。 • ip:Client端由IP地址验证,譬如172.2.0.0/24 • world:固定

    2024年02月10日
    浏览(40)
  • java操作zookeeper

    创建一个maven项目在pom文件里引入如下依赖: 创建一个测试类进行相关操作的测试 连接客户端 关闭客户端 创建节点 获取节点数据 查询子节点 查询节点状态信息 更新节点数据 更新节点数据,带版本号 删除节点 删除节点,必须成功 删除节点,回调函数 监听节点的创建、修

    2024年02月16日
    浏览(39)
  • Java中的ZooKeeper是什么?

    Java中的ZooKeeper是一个开源的分布式协调服务,它可以帮助我们管理分布式系统中的数据和配置信息。ZooKeeper是由Facebook开发的一个开源项目,它被广泛用于Facebook的分布式系统。 ZooKeeper的名称来源于动物园管理员(Zookeeper),它可以帮助我们管理动物园中的动物,比如猴子、

    2024年02月14日
    浏览(36)
  • Java——《面试题——Zookeeper篇》

    全文章节 Java——《面试题——基础篇》 Java——《面试题——JVM篇》 Java——《面试题——多线程并发篇》 Java——《面试题——Spring篇》 Java——《面试题——SpringBoot篇》 Java——《面试题——MySQL篇》​​​​​​ Java——《面试题——SpringCloud》 Java——《面试题——Dob

    2024年02月11日
    浏览(40)
  • 六、ZooKeeper Java API操作

    目录 1、引入maven坐标 2、节点的操作 这里操作Zookeeper的JavaAPI使用的是一套zookeeper客户端框架 Curator ,解决了很多Zookeeper客户端非常底层的细节开发工作 。 Curator包含了几个包:

    2024年02月04日
    浏览(32)
  • windows下 java使用zookeeper案例

    countDownLatch.await(); System.out.println(“zookeeper connection success”); } /** * 创建节点 * @param path * @param data * @throws Exception */ public String createNode(String path, String data) throws Exception { return this.zookeeper.create(path, data.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); } /** * 获取路径下所有子节点 *

    2024年04月28日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包