一、引言
前两篇写了一些概念性的和在服务器上操作的信息,那么这一篇我们来学习如何用Spring来对Zookeeper做一个整合。首先需要先简单介绍一些Curator这个客户端。
Curator
Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括基础操作、连接与重连、反复注册Watcher、分布式锁等等。
二、干货代码搞起来~
POM
<!--引入Zookeeper依赖和curator客户端【有梦想的肥宅】--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.0.0</version> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.8</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.1.0</version> </dependency>
Zookeeper客户端工具类
我这里把初始化zk客户端的代码抽成了一个工具类来使用,减少重复代码:
/** * Zookeeper客户端工具类 * * @author zhanghao * @date 2021/8/18 */ public class ZookeeperClientUtil { /** * 获取Curator客户端 【有梦想的肥宅】 */ public static CuratorFramework getCuratorFramework() { //1、配置重试策略 5000:重试间隔 5:重试次数 ExponentialBackoffRetry policy = new ExponentialBackoffRetry(5 * 1000, 5); //2、构造Curator客户端 CuratorFramework client = CuratorFrameworkFactory.builder().connectString("这里填写自己zk的ip地址:2181") .connectionTimeoutMs(60 * 1000) .sessionTimeoutMs(60 * 1000) .retryPolicy(policy).build(); //3、启动客户端 client.start(); //4、输出信息 System.out.println("zookeeper启动成功,获取到客户端链接"); return client; } }
基础操作测试类
当前类用于测试一些基础的zk操作,都是自己手打测试过的,直接拿走~
/** * 基础操作测试类 * * @author 有梦想的肥宅 * @date 2021/8/18 */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = CuratorBaseControlDemo.class) public class CuratorBaseControlDemo { //创建节点【有梦想的肥宅】 @Test public void testCreate() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); curatorFramework.create().withMode(CreateMode.PERSISTENT).forPath("/nodeForJava", "this is value!".getBytes()); System.out.println("=========【有梦想的肥宅】节点创建成功========"); } //获取节点值【有梦想的肥宅】 @Test public void testGetData() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); byte[] bytes = curatorFramework.getData().forPath("/nodeForJava"); System.out.println("=========【有梦想的肥宅】获取到的节点值:" + new String(bytes) + "========"); } //更新节点值【有梦想的肥宅】 @Test public void testSetData() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); curatorFramework.setData().forPath("/nodeForJava", "changed!".getBytes()); byte[] bytes = curatorFramework.getData().forPath("/nodeForJava"); System.out.println("=========【有梦想的肥宅】更新后节点的值:" + new String(bytes) + "========"); } //删除节点【有梦想的肥宅】 //PS:guaranteed() 强制删除 //PS:deletingChildrenIfNeeded() 删除一个节点,并且递归删除其所有的子节点 @Test public void testDelete() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); String pathWithParent = "/nodeForJava"; curatorFramework.delete().guaranteed().deletingChildrenIfNeeded().forPath(pathWithParent); System.out.println("=========【有梦想的肥宅】已成功删除节点:" + pathWithParent + "========"); } }