目录
  • Springboot整合zookeeper教程
  • 1.环境准备
  • 2.代码编写
    • 2.1.在pom.xml文件中增加zookeeper依赖(记得跟自己的zookeeper版本对应)
    • 2.2.API测试
  • 3.全部代码

    Springboot整合zookeeper教程

    1.环境准备

    • zookeeper集群环境
    • 一个简单的springboot项目环境

    不懂如何搭建zookeeper集群的小伙伴可以移步到我的另一篇文章喔,里面有详细的zookeeper集群搭建教程~

    zookeeper集群搭建步骤(超详细)

    https://www.jb51.net/article/252826.htm

    2.代码编写

    2.1.在pom.xml文件中增加zookeeper依赖(记得跟自己的zookeeper版本对应)

    除此之外,我们也引入junitlog4j方便我们后面的测试

       <!--引入对应的zookeeper -->
            <dependency>
                <groupId>org.apache.zookeeper</groupId>
                <artifactId>zookeeper</artifactId>
                <version>3.7.1</version>
            </dependency>
     
       <!--引入日志-->
            <dependency>
                <groupId>org.apache.logging.log4j</groupId>
                <artifactId>log4j-to-slf4j</artifactId>
                <version>2.17.2</version>
            </dependency>
     
       <!--引入junit测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>RELEASE</version>
            </dependency>

    2.2.API测试

    我们创建zkClient类用于实现对zookeeper中节点的操作:

     1.客户端初始化

    package com.canrioyuan.zookeepertest;
     
    import org.apache.zookeeper.*;
    import org.apache.zookeeper.data.Stat;
    import org.junit.Before;
    import org.junit.Test;
     
    import java.io.IOException;
    import java.util.List;
     
    //创建对应的zookeeper客户端
    public class ZkClient {
     
        //对应的zookeeper客户端连接,连接之间不能存在空格
        private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
        //即超时时间,我们设置成2s
        private int sessionTimeout = 2000;
        //声明zookeeper客户端
        private ZooKeeper zkClient;
    
        //初始化
        @Test
        public void init() throws IOException {
            zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
     
                }
            });
        }
     
    }

    运行测试,成功后如会出现下图所示结果:

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

    2.创建节点

        //创建节点
        @Test
        public void create() throws InterruptedException, KeeperException {
            //public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
            //上图中从左到右的参数分别对应着:你所要创建的节点的名字,节点的值,节点的权限,节点的类型(持久有序,持久无序,临时有序,临时无序)
            zkClient.create("/class", "LiHua".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }

    运行测试,你会发现,程序报了这样的错误;

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

     这是因为我们测试方法是互相独立的,此时运行测试,客户端处于未初始化的状态。因此,我们在客户端类的init方法中将@Test注解改成@Before注解,表示在每个测试执行之前都必须执行初始化方法。

      //初始化
        @Before
    //    @Test
        public void init() throws IOException {
            zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
     
                }
            });
        }

    这时候我们再运行,会提示运行成功

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

     我们来到任意一台zookeeper客户端中查看节点,会发现已经创建成功

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

    3.监听节点的状态

    一次监听只能生效一次,而为了能够持续监听,我们对初始化方法再做出调整,保证每次初始化都有一次监听生效。

     @Before
        public void init() throws IOException {
            zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
                @Override   //process中即为监听后做出的处理
                public void process(WatchedEvent watchedEvent) {
                    List<String> children = null;
                    try {
                        children = zkClient.getChildren("/", true);
                    } catch (KeeperException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("-------------------------");
                    for (String child : children) {
                        System.out.println(child);
                    }
                    System.out.println("-------------------------");
     
                }
            });
        }

    然后在监听节点代码中进行延时操作

     //监听节点
        @Test
        public void getChildren() throws InterruptedException, KeeperException {
     
            //正常一次监听只会生效一次,因此我们设置延时监听,确保能够持续监听节点的变化。
            Thread.sleep(Long.MAX_VALUE);
        }

    此时我们可以看到控制台输出了zookeeper中的节点:

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

     我们进入zookeeper客户端对节点进行操作

    增加一个节点school

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

     返回控制台,此时已经监听到了节点的变化: 

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

     我们再对school这个节点进行删除操作

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

    此时控制台同样监听到了节点的变化:

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

     4.判断节点是否存在

     //判断节点是否存在
        @Test
        public void status() throws InterruptedException, KeeperException {
            Stat status = zkClient.exists("/class", false);
            System.out.println(status == null ? "no exist" : "exist");
        }

    此时zookeeper中的节点;

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

     测试结果:

    Springboot整合zookeeper实现对节点的创建、监听与判断的案例详解

    3.全部代码

    package com.canrioyuan.zookeepertest;
     
    import org.apache.zookeeper.*;
    import org.apache.zookeeper.data.Stat;
    import org.junit.Before;
    import org.junit.Test;
     
    import java.io.IOException;
    import java.util.List;
     
    //创建对应的zookeeper客户端
    public class ZkClient {
     
        //对应的zookeeper客户端连接,连接之间不能存在空格
        private String connectString = "192.168.154.133:2181,192.168.154.134:2181,192.168.154.135:2181";
        //即超时时间,我们设置成2s
        private int sessionTimeout = 2000;
        //声明zookeeper客户端
        private ZooKeeper zkClient;
    
        //初始化
    //    @Test
        @Before
        public void init() throws IOException {
            zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
                @Override   //process中即为监听后做出的处理
                public void process(WatchedEvent watchedEvent) {
                    List<String> children = null;
                    try {
                        children = zkClient.getChildren("/", true);
                    } catch (KeeperException e) {
                        e.printStackTrace();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println("-------------------------");
                    for (String child : children) {
                        System.out.println(child);
                    }
                    System.out.println("-------------------------");
     
                }
            });
        }
     
        //创建节点
        @Test
        public void create() throws InterruptedException, KeeperException {
            //public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
            //上图中从左到右的参数分别对应着:你所要创建的节点的名字,节点的值,节点的权限,节点的类型(持久有序,持久无序,临时有序,临时无序)
            zkClient.create("/class", "LiHua".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        }
     
        //监听节点
        @Test
        public void getChildren() throws InterruptedException, KeeperException {
     
            //正常一次监听只会生效一次,因此我们设置延时监听,确保能够持续监听节点的变化。
            Thread.sleep(Long.MAX_VALUE);
        }
     
        //判断节点是否存在
        @Test
        public void status() throws InterruptedException, KeeperException {
            Stat status = zkClient.exists("/class", false);
            System.out.println(status == null ? "no exist" : "exist");
        }
    }

    至此,我们基于Springboot整合zookeeper实现对节点的创建、监听与判断教程就结束啦~

    声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。