基于Springboot整合zookeeper实现对节点的创建、监听与判断

本文阅读 5 分钟
首页 代码,Java 正文

文章目录

Springboot整合zookeeper教程

1.环境准备

2.代码编写

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

2.2.API测试

3.全部代码

Springboot整合zookeeper教程

1.环境准备

不懂如何搭建zookeeper集群的小伙伴可以移步到我的另一篇文章喔,里面有详细的zookeeper集群搭建教程~ zookeeper集群搭建步骤(超详细)https://blog.csdn.net/weixin_47025166/article/details/125415538?spm=1001.2014.3001.5502

2.代码编写

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

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

<!--引入对应的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) {

            }
        });
    }

}

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

img

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

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

img

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

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

            }
        });
    }

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

img

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

img

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中的节点:

img

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

增加一个节点school

img

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

img

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

img

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

img

 4.判断节点是否存在

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

此时zookeeper中的节点;

img

 测试结果:

img

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实现对节点的创建、监听与判断教程就结束啦~

感谢您的阅读,希望我的文章能给你带来帮助!!!

img

本文为互联网自动采集或经作者授权后发布,本文观点不代表立场,若侵权下架请联系我们删帖处理!文章出自:https://blog.csdn.net/weixin_47025166/article/details/125425882
-- 展开阅读全文 --
安全面试之XSS(跨站脚本攻击)
« 上一篇 07-24

发表评论

成为第一个评论的人

热门文章

标签TAG

最近回复