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

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

Springboot整合zookeeper教程

1.环境准备

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

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

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

https://blog.csdn.net/weixin_47025166/article/details/125415538?spm=1001.2014.3001.5502

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) {

            }
        });
    }

}

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

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

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

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

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

            }
        });
    }

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

 我们来到任意一台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中的节点:

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

增加一个节点school

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

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

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

 4.判断节点是否存在

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

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

到此这篇关于基于Springboot整合zookeeper实现对节点的创建、监听与判断的文章就介绍到这了,更多相关Springboot整合zookeeper实现节点监听内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 2020最新IDEA SpringBoot整合Dubbo的实现(zookeeper版)

    首先,要在电脑上安装配置好zookeeper哦~ 这是我云服务器上的zookeeper状态 接下来,开始整合 1. 准备一个dubbo-api的SpringBoot项目 用来存储Entity类和Server接口的项目,配置文件无须改动. entity – User // Lombok注解 相当于Setter Getter toString() @Data public class User implements Serializable { // 序列化很重要!!! private static

  • Springboot 整合 Dubbo/ZooKeeper 实现 SOA 案例解析

    一.为啥整合 Dubbo 实现 SOA Dubbo 不单单只是高性能的 RPC 调用框架,更是 SOA 服务治理的一种方案. 核心: 远程通信,向本地调用一样调用远程方法. 集群容错 服务自动发现和注册,可平滑添加或者删除服务提供者. 我们常常使用 Springboot 暴露 HTTP 服务,并走 JSON 模式.但慢慢量大了,一种 SOA 的治理方案.这样可以暴露出 Dubbo 服务接口,提供给 Dubbo 消费者进行 RPC 调用.下面我们详解下如何集成 Dubbo. 二.运行 spring

  • zookeeper+Springboot实现服务器动态上下线监听教程详解

    目录 zookeeper+Springboot实现服务器动态上下线监听教程 一.什么是服务器动态上下线监听 二.为什么要实现对服务器上下线的监听 三.编码实现 四.测试 1.启动客户端,开启监听 2.按照下面的流程启动服务器端 zookeeper+Springboot实现服务器动态上下线监听教程 一.什么是服务器动态上下线监听 客户端能够实时洞察到服务器上下线的变化,现在我们看看下面三个变化给集群.服务器.客户端三者的变化 初始情况 服务器3启动 服务器2下线 从上面的图我们可以知道,在集群中,

  • IDEA整合Dubbo+Zookeeper+SpringBoot实现

    本文主要介绍了IDEA整合Dubbo+Zookeeper+SpringBoot实现,分享给大家,具体如下: 放上一张Dubbo的架构图 刚刚学过SpringCloud,Dubbo虽然没有Spring家族那么强悍,但始终不能违背Dubbo是一款高性能优秀的RPC框架. click官网地址了解更多 自己也是初学者,想自己动手做一个简单的demo,于是上网查资料,发现针对那种入门的案例,网上主要有两个比较经典的,一个是尚硅谷雷神版,还有一个是官网推荐的入门 案例. 雷神的Dubbo视频教程大神讲解 视

  • SpringBoot整合Dubbo zookeeper过程解析

    这篇文章主要介绍了SpringBoot整合Dubbo zookeeper过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 docker pull zookeeper docker run --name zk01 -p 2181:2181 --restart always -d 2e30cac00aca 表明zookeeper已成功启动 Zookeeper和Dubbo• ZooKeeperZooKeeper 是一个分布式的,开放源码的分布式

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

    目录 Springboot整合zookeeper教程 1.环境准备 2.代码编写 2.1.在pom.xml文件中增加zookeeper依赖(记得跟自己的zookeeper版本对应) 2.2.API测试 3.全部代码 Springboot整合zookeeper教程 1.环境准备 zookeeper集群环境 一个简单的springboot项目环境 不懂如何搭建zookeeper集群的小伙伴可以移步到我的另一篇文章喔,里面有详细的zookeeper集群搭建教程~ zookeeper集群搭建步骤(超详细

  • SpringBoot整合Mybatis实现高德地图定位并将数据存入数据库的步骤详解

    第一步配置yml文件 server: port: 8080 spring: datasource: username: root password: 123456 url: jdbc:mysql://localhost:3306/spring?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=UTC driver-class-name: com.mysql.cj.jdbc.Driver thymel

  • springBoot整合redis使用案例详解

    一.创建springboot项目(采用骨架方式) 创建完成: 我们分析下pom文件中内容: 所使用到的关键依赖: <!--springBoot集成redis--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.5.4<

  • Java Apollo环境搭建以及集成SpringBoot案例详解

    环境搭建 下载Quick Start安装包 从Github下载:checkout或下载apollo-build-scripts项目 手动打包Quick Start安装包 修改apollo-configservice, apollo-adminservice和apollo-portal的pom.xml,注释掉spring-boot-maven-plugin和maven-assembly-plugin 在根目录下执行mvn clean package -pl apollo-assembly -am

  • SpringBoot工程搭建打包、启动jar包和war包的教程图文详解

    工程搭建 1.File->new->project: 2.选择"Spring Initializr",点击next:(jdk1.8默认即可) 3.完善项目信息,组名可不做修改,项目名可做修改:最终建的项目名为:test,src->main->java下包名会是:com->example->test:点击next: 4.Web下勾选Spring Web Start,(网上创建springboot项目多是勾选Web选项,而较高版本的Springboot没

  • SpringBoot + WebSocket 实现答题对战匹配机制案例详解

    概要设计 类似竞技问答游戏:用户随机匹配一名对手,双方同时开始答题,直到双方都完成答题,对局结束.基本的逻辑就是这样,如果有其他需求,可以在其基础上进行扩展 明确了这一点,下面介绍开发思路.为每个用户拟定四种在线状态,分别是:待匹配.匹配中.游戏中.游戏结束.下面是流程图,用户的流程是被规则约束的,状态也随流程而变化 对流程再补充如下: 用户进入匹配大厅(具体效果如何由客户端体现),将用户的状态设置为待匹配 用户开始匹配,将用户的状态设置为匹配中,系统搜索其他同样处于匹配中的用户,在这个过程中,

  • Java Springboot websocket使用案例详解

    什么是WebSocket WebSocket是一种在单个TCP连接上进行全双工通信的协议 - 为什么要实现握手监控管理 如果说,连接随意创建,不管的话,会存在错误,broken pipe 表面看单纯报错,并没什么功能缺陷等,但实际,请求数增加,容易导致系统奔溃.这边画重点. 出现原因有很多种,目前我这边出现的原因,是因为客户端已关闭连接,服务端还持续推送导致. 如何使用 下面将使用springboot集成的webSocket 导入Maven 首先SpringBoot版本 <parent> &l

  • SpringBoot实战之高效使用枚举参数(原理篇)案例详解

    找入口 对 Spring 有一定基础的同学一定知道,请求入口是DispatcherServlet,所有的请求最终都会落到doDispatch方法中的ha.handle(processedRequest, response, mappedHandler.getHandler())逻辑.我们从这里出发,一层一层向里扒. 跟着代码深入,我们会找到org.springframework.web.method.support.InvocableHandlerMethod#invokeForRequest的

  • SpringBoot之通过BeanPostProcessor动态注入ID生成器案例详解

    在分布式系统中,我们会需要 ID 生成器的组件,这个组件可以实现帮助我们生成顺序的或者带业务含义的 ID. 目前有很多经典的 ID 生成方式,比如数据库自增列(自增主键或序列).Snowflake 算法.美团 Leaf 算法等等,所以,会有一些公司级或者业务级的 ID 生成器组件的诞生.本文就是通过 BeanPostProcessor 实现动态注入 ID 生成器的实战. 在 Spring 中,实现注入的方式很多,比如 springboot 的 starter,在自定义的 Configuratio

  • Java SpringBoot在RequestBody中高效的使用枚举参数原理案例详解

    在优雅的使用枚举参数(原理篇)中我们聊过,Spring对于不同的参数形式,会采用不同的处理类处理参数,这种形式,有些类似于策略模式.将针对不同参数形式的处理逻辑,拆分到不同处理类中,减少耦合和各种if-else逻辑.本文就来扒一扒,RequestBody参数中使用枚举参数的原理. 找入口 对 Spring 有一定基础的同学一定知道,请求入口是DispatcherServlet,所有的请求最终都会落到doDispatch方法中的ha.handle(processedRequest, respons

随机推荐