Zookeeper的Java API操作(一)

Zookeeper的Java API操作(一)环境搭建 创建一个普通的Maven项目 导入log4j.properties日志文件到项目的根目录或者resource文件下。 在pom.xml中添加Zookeeper的相关依赖: <depen

Zookeeper的Java API操作(一)

环境搭建

  1. 创建一个普通的Maven项目
  2. 导入log4j.properties日志文件到项目的根目录或者resource文件下。
  3. 在pom.xml中
    添加Zookeeper的相关依赖

    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.5.7</version>
    </dependency>
    <!--junit单元测试-->
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.1</version>
        <scope>runtime</scope>
    </dependency>

  4. 除了maven的项目依赖,还可以通过导入Zookeeper相关jar包部署Zookeeper环境。Zookeeper所需要的的jar包如下:
  • ZOOKEEPER_HOME目录:

    zookeeper-3.5.7.jar

  • ZOOKEEPER_HOME/lib目录:

    jline-0.9.94.jar、

    log4j-1.2.16.jar、

    netty-3.10.5.Final.jar、

    slf4j-api-1.6.1.jar、

    slf4j-log4j12-1.6.1.jar

    将上述jar包拷贝到工程的lib目录。并build一下,导入工程。

API操作Zookeeper

环境搭建完成之后,就可以使用Java代码来操作Zookeeper啦!第一步当然是连接Zookeeper了。

连接Zookeeper

前言

Java API连接Zookeeper只需要一步:即创建Zookeeper对象

首先进入到Zookeeper类中可以看到:

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) throws IOException {
    this(connectString, sessionTimeout, watcher, false);
}

创建Zookeeper对象需要传入三个参数:

  • connectString:连接的地址,包括主机名和端口号。
  • sessionTimeout:表示Zookeeper等待客户端通信的最长时间,客户端如果超过这个时间没有和服务端进行通信,那么就认为该客户端已终止,一般设置值5~10s。单位是毫秒。
  • watcher:监听器。用于接收会话事件的接口,需要自己定义,实现process()方法。

有了上述基础之后,就可以连接Zookeeper了!

连接Zookeeper

Zookeeper zkClient = "";
String connectStr = "node1:2181,node2:2181,node3:2181";
zkClient = new ZooKeeper(connectStr, 2000, new Watcher() {
    @Override
    public void process(WatchedEvent watchedEvent) { }
});

连接成功:

Zookeeper的Java API操作(一)

【注意】

  1. 字符串中,两段千万不能加空格,否则就会报错
  2. 如果在Windows上也想使用node1,node2,node3主机名来代替输入主机ip,那么我们必须在Windows本地配置主机ip映射。Windows配置主机映射目录C:WindowsSystem32driversetchosts。只需要在该文件下添加 “ip 主机名“字段即可。

    Zookeeper的Java API操作(一)

    此时在Windows命令行就可以实现直接ping主机名了。

    Zookeeper的Java API操作(一)

创建节点

前言

创建节点所需要的方法是create()。此处需要传入四个参数:

public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode) throws KeeperException, InterruptedException {}

其中四个参数代表的含义是:

  • String path:节点路径
  • byte[] data,:节点数据—字节数组
  • List<ACL> acl:节点权限
  • CreateMode createMode:节点类型

其中,设置文件权限的基本参数解读如下:

(1) OPEN_ACL_UNSAFE :完全开放。 事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了 OPEN_ACL_UNSAFE 时,是对所有的连接开放。

(2) CREATOR_ALL_ACL :给创建该znode连接所有权限。 事实上这里是采用了auth验证模式,使用sessionID做验证。所以设置了 CREATOR_ALL_ACL 时,创建该znode的连接可以对该znode做任何修改。

(3) READ_ACL_UNSAFE :所有的客户端都可读。 事实上这里是采用了world验证模式,由于每个zk连接都有world验证模式,所以znode在设置了READ_ACL_UNSAFE时,所有的连接都可以读该znode。

Zookeeper的Java API操作(一)

设置文件类型的基本参数解读如下:

观察CreateMode源码可以发现CreateMode是一个枚举类。 创建Node的类型有:持久节点、持久有序号的节点、短暂节点、短暂有序号的节点

Zookeeper的Java API操作(一)

创建节点

  1. 创建
    持久不带序号节点

    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISENT);
        System.out.println(node);
    }

    持久化节点创建成功:

    Zookeeper的Java API操作(一)

    Zookeeper的Java API操作(一)

  2. 创建
    持久带序号的节点:
    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient1", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISENT_SEQUENTIAL);
        System.out.println(node);
    } 

    创建成功:

    Zookeeper的Java API操作(一)

    Zookeeper的Java API操作(一)

  3. 创建
    短暂不带序号节点:
    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient2", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println(node);
    } 

    创建成功:

    Zookeeper的Java API操作(一)

    注意】创建成功后在主机查看却发现没有/javaClient2这个节点。因为在Java运行结束之后,客户端服务就关闭了,此时临时节点已经删除,再去查看的时候已经没有了。此时可以通过设置一个线程睡眠时间,就可以在睡眠时间内另一台客户端看到文件。

    @Test
    public void createNode() throws InterruptedException, KeeperException {
        String node = zkClient.create("/javaClient3", "javaTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        System.out.println(node);
        Thread.sleep(10000);
    } 

    Zookeeper的Java API操作(一)

  4. 创建
    短暂带序号节点

    创建短暂带序号节点就可以参照创建持久带序号节点完成了,只需要将CreateMode的值设为 “EPHEMERAL_SEQUENTIAL“即可

删除节点

前言

删除节点可以使用Zookeeper中的delete()方法

public void delete(String path, int version) throws InterruptedException, KeeperException {}

两个参数:第一个是删除的节点路径,第二个是要删除节点的版本号版本号可以通过ls -s path查看节点详情信息,cversion即是对应的版本值

Zookeeper的Java API操作(一)

如果写的版本不正确,将会报如下错误:

Zookeeper的Java API操作(一)

注意】delete方法是用来删除单个节点的,不能进行迭代删除。

由于此处的/test节点下还有一个子节点

Zookeeper的Java API操作(一)

如果使用delete去删除,还会报如下错误:

Zookeeper的Java API操作(一)

删除节点

public void deleteNode() throws InterruptedException, KeeperException {
    zkClient.delete("/test20000000006", 0);
}

删除成功:

Zookeeper的Java API操作(一)

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5932.html

(0)
上一篇 2023-04-20
下一篇 2023-04-20

相关推荐

  • 理解Python中的ndarray

    理解Python中的ndarray随着数据分析和机器学习的普及,Python的numpy模块中的ndarray逐渐成为Python中最常用的数据结构之一。Python的ndarray是一种多维数组对象,可以在Python中实现大规模数据和矩阵计算。

    2024-05-04
    64
  • Oracle学习(八) — SQL优化「建议收藏」

    Oracle学习(八) — SQL优化「建议收藏」1、前置工具:执行计划 Explain Plan 1.1、概念 一条查询语句在 ORACLE 中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。 执行计划:用于记…

    2023-03-09
    176
  • oracle启动过程和需要的文件_简述计算机的启动过程

    oracle启动过程和需要的文件_简述计算机的启动过程1、数据库启动: a、先找到初始化文件(spfile或者pfile),此时数据库处在nomount状态; b、根据初始文件找到控制文件(Control File),此时数据库处于mount状态;mo…

    2023-02-27
    162
  • 【黄啊码】MySQL入门—5、数据库小技巧:单个列group by就会,多个列呢?「建议收藏」

    【黄啊码】MySQL入门—5、数据库小技巧:单个列group by就会,多个列呢?「建议收藏」大家好!我是黄啊码,上节课留的作业大家都做了吗?没做的话回去做完再来听课。 好了,先来解答上节课留下的问题: 我们在数据库表中新增一列user_height表示身高,然后拿到所有数据: 我们如果单单用

    2023-05-27
    137
  • Pycharm启动失败问题解决方法

    Pycharm启动失败问题解决方法a href=”https://www.python100.com/a/sm.html”font color=”red”免责声明/font/a a href=”https://beian.miit.gov.cn/”苏ICP备2023018380号-1/a Copyright www.python100.com .Some Rights Reserved.

    2024-09-10
    24
  • 使用Python创建新的目录

    使用Python创建新的目录在日常工作和生活中,创建新的目录是一件非常常见的事情,经常需要手动新建一些文件夹,但是当需要新建的目录较多时,手动创建将变得非常耗时,效率也很低。因此,我们需要寻找一种简单高效的方法来创建新的目录,而使用Python可以帮助我们快速地实现这一目标。

    2024-03-04
    81
  • PyCharm中的整体缩进设置

    PyCharm中的整体缩进设置在使用PyCharm进行代码编写时,我们经常会遇到代码缩进问题。相信有不少人在处理代码格式时,曾被不统一的缩进而困扰过。为了解决这个问题,PyCharm提供了一些实用的设置。

    2024-05-12
    73
  • Python中的Deque用法和实例

    Python中的Deque用法和实例Deque,即“double-ended queue”的缩写,是一种具有队列和栈的性质的数据结构。而Python中的deque则是一个双向队列,其可以在队列的两端进行数据的插入与删除操作。deque是多线程安全的,同时可以避免一个线程在访问deque的时候,另一个线程的干扰。

    2023-12-05
    117

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注