zoukankan      html  css  js  c++  java
  • 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) { }
    });

    连接成功:

    【注意】

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

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

    创建节点

    前言

    创建节点所需要的方法是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。

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

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

    创建节点

    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);
      }

      持久化节点创建成功:

    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);
      } 

      创建成功:

    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);
      } 

      创建成功:

      注意】创建成功后在主机查看却发现没有/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);
      } 

    4. 创建短暂带序号节点

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

    删除节点

    前言

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

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

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

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

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

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

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

    删除节点

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

    删除成功:

  • 相关阅读:
    Radmin View3.5
    delphi安装fastreport6
    大华监控设备配置文件导入生成工具
    大华监控和天地伟业监控免输密码登录助手
    锐捷交换机常用配置命令【加精】
    锐捷交换机的配置命令大全
    H3C常用配置命令
    锐捷交换机配置命令
    Delphi 随手笔记,使用了DEV控件组件
    读取软件的版本信息 GetFileVersionInfo
  • 原文地址:https://www.cnblogs.com/zyd-994264926326/p/15165844.html
Copyright © 2011-2022 走看看