Springboot整合zookeeper实现节点监听
啊陈晓 人气:0Springboot整合zookeeper教程
1.环境准备
- zookeeper集群环境
- 一个简单的springboot项目环境
不懂如何搭建zookeeper集群的小伙伴可以移步到我的另一篇文章喔,里面有详细的zookeeper集群搭建教程~
zookeeper集群搭建步骤(超详细)
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) { } }); } }
运行测试,成功后如会出现下图所示结果:
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实现对节点的创建、监听与判断教程就结束啦~
加载全部内容