SpringBoot3集成Zookeeper

盛世宏图  金牌会员 | 2024-4-14 16:24:06 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 896|帖子 896|积分 2688

标签:Zookeeper3.8 ,Curator5.5;
一、简介

ZooKeeper是一个集中的服务,用于维护配置信息、命名、提供分布式同步、提供组服务。分布式应用程序以某种形式使用所有这些类型的服务。
二、环境搭建

1、修改配置文件
  1. # 1、拷贝一份样本配置文件
  2. cp zookeeper-3.8.3/conf/zoo_sample.cfg zookeeper-3.8.3/conf/zoo.cfg
  3. # 2、修改数据文件地址,注意这里用本地路径
  4. dataDir=/local-path/zookeeper-3.8.3/data
  5. # 3、添加一个配置,处理启动日志的提示:ZooKeeper audit is disabled.
  6. audit.enable=true
复制代码
2、服务启动
  1. # 1、启动服务端
  2. zookeeper-3.8.3/bin/zkServer.sh start
  3. # 2、停止服务端
  4. zookeeper-3.8.3/bin/zkServer.sh stop
  5. # 3、启动客户端
  6. zookeeper-3.8.3/bin/zkCli.sh
复制代码
3、客户端测几个增删查的命令
  1. [zk: localhost:2181(CONNECTED) 0] create /cicada smile1
  2. Created /cicada
  3. [zk: localhost:2181(CONNECTED) 1] get /cicada
  4. smile1
  5. [zk: localhost:2181(CONNECTED) 2] ls /
  6. [cicada, zookeeper]
  7. [zk: localhost:2181(CONNECTED) 3] delete /cicada
复制代码
三、工程搭建

1、工程结构


2、依赖管理

Curator是一组Java库,它让ZooKeeper的使用变得更加容易,这里的依赖实际是查询匹配版本的时候走了个捷径,也可以参考integration-redis包,熟悉下Spring的封装策略。
  1. <dependency>
  2.     <groupId>org.apache.zookeeper</groupId>
  3.     <artifactId>zookeeper</artifactId>
  4.     <version>${zookeeper.version}</version>
  5. </dependency>
  6. <dependency>
  7.     <groupId>org.springframework.integration</groupId>
  8.     <artifactId>spring-integration-zookeeper</artifactId>
  9.     <version>${spring-integration.version}</version>
  10. </dependency>
复制代码
3、配置文件

配置脚本
  1. zookeeper:
  2.   #服务器地址
  3.   connectString: 127.0.0.1:2181
  4.   #会话超时时间
  5.   sessionTimeoutMs: 3000
  6.   #连接超时时间
  7.   connectionTimeoutMs: 60000
  8.   #最大重试次数
  9.   maxRetries: 3
  10.   #初始休眠时间
  11.   baseSleepTimeMs: 1000
复制代码
配置类
  1. @Configuration
  2. public class ZookeeperConfig {
  3.     @Value("${zookeeper.connectString}")
  4.     private String connectString;
  5.    
  6.     @Value("${zookeeper.baseSleepTimeMs}")
  7.     private int baseSleepTimeMs;
  8.     @Value("${zookeeper.maxRetries}")
  9.     private int maxRetries ;
  10.     @Value("${zookeeper.connectionTimeoutMs}")
  11.     int connectionTimeoutMs ;
  12.     @Value("${zookeeper.sessionTimeoutMs}")
  13.     int sessionTimeoutMs ;
  14.     private static CuratorFramework client = null ;
  15.     /**
  16.      * 初始化
  17.      */
  18.     @PostConstruct
  19.     public void init (){
  20.         // 重试策略
  21.         RetryPolicy policy = new ExponentialBackoffRetry(baseSleepTimeMs, maxRetries);
  22.         // 创建Curator
  23.         client = CuratorFrameworkFactory.builder()
  24.                 .connectString(connectString)
  25.                 .connectionTimeoutMs(connectionTimeoutMs)
  26.                 .sessionTimeoutMs(sessionTimeoutMs)
  27.                 .retryPolicy(policy).build();
  28.         //开启连接
  29.         client.start();
  30.     }
  31.     @Bean
  32.     public CuratorFramework getClient (){
  33.         return client ;
  34.     }
  35. }
复制代码
四、ZooKeeper用法

测试几个API方法,节点创建和添加数据,以及判断和查询数据,还有就是基于ZooKeeper提供的读写锁能力。
  1. public class ConfigTest {
  2.     @Autowired
  3.     private CuratorFramework client ;
  4.     @Test
  5.     public void testCreate () throws Exception {
  6.         // 创建一个持久化节点,断开连接时不会自动删除
  7.         client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/path1");
  8.     }
  9.     @Test
  10.     public void testExists () throws Exception {
  11.         // 判断节点是否存在,path2不存在所以stat2是null
  12.         Stat stat1 = client.checkExists().forPath("/path1");
  13.         System.out.println(stat1);
  14.         Stat stat2 = client.checkExists().forPath("/path2");
  15.         System.out.println(stat2);
  16.     }
  17.     @Test
  18.     public void testSetData () throws Exception {
  19.         // 设置节点数据
  20.         client.setData().forPath("/path1", "data1".getBytes(StandardCharsets.UTF_8));
  21.     }
  22.     @Test
  23.     public void testCreateAndSet () throws Exception {
  24.         // 创建一个持久化节点并设置节点数据
  25.         client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
  26.                 .forPath("/path3","data3".getBytes(StandardCharsets.UTF_8));
  27.     }
  28.     @Test
  29.     public void testGetData () throws Exception {
  30.         // 查询节点数据
  31.         byte[] data = client.getData().forPath("/path3");
  32.         System.out.println(new String(data,StandardCharsets.UTF_8));
  33.     }
  34.     @Test
  35.     public void testDelete () throws Exception {
  36.         // 删除节点
  37.         client.delete().guaranteed().deletingChildrenIfNeeded().forPath("/path3");
  38.     }
  39.     @Test
  40.     public void testReadLock () throws Exception {
  41.         // 读写锁-读
  42.         InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock-read");
  43.         lock.readLock().acquire();
  44.         System.out.println("获取-ReadLock");
  45.         lock.readLock().release();
  46.     }
  47.     @Test
  48.     public void testWriteLock () throws Exception {
  49.         // 读写锁-写
  50.         InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock-write");
  51.         lock.writeLock().acquire();
  52.         System.out.println("获取-WriteLock");
  53.         lock.writeLock().release();
  54.     }
  55. }
复制代码
五、参考源码
  1. 文档仓库:
  2. https://gitee.com/cicadasmile/butte-java-note
  3. 源码仓库:
  4. https://gitee.com/cicadasmile/butte-spring-parent
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

盛世宏图

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表