SpringBoot3集成Zookeeper

一、简介

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

二、环境搭建

1、修改配置文件

复制代码
# 1、拷贝一份样本配置文件
cp zookeeper-3.8.3/conf/zoo_sample.cfg zookeeper-3.8.3/conf/zoo.cfg

# 2、修改数据文件地址,注意这里用本地路径
dataDir=/local-path/zookeeper-3.8.3/data

# 3、添加一个配置,处理启动日志的提示:ZooKeeper audit is disabled.
audit.enable=true

2、服务启动

复制代码
# 1、启动服务端
zookeeper-3.8.3/bin/zkServer.sh start

# 2、停止服务端
zookeeper-3.8.3/bin/zkServer.sh stop

# 3、启动客户端
zookeeper-3.8.3/bin/zkCli.sh

3、客户端测几个增删查的命令

复制代码
[zk: localhost:2181(CONNECTED) 0] create /cicada smile1
Created /cicada
[zk: localhost:2181(CONNECTED) 1] get /cicada
smile1
[zk: localhost:2181(CONNECTED) 2] ls /
[cicada, zookeeper]
[zk: localhost:2181(CONNECTED) 3] delete /cicada

三、工程搭建

1、工程结构

2、依赖管理

Curator是一组Java库,它让ZooKeeper的使用变得更加容易,这里的依赖实际是查询匹配版本的时候走了个捷径,也可以参考integration-redis包,熟悉下Spring的封装策略。

复制代码
<!-- Zookeeper组件 -->
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>${zookeeper.version}</version>
</dependency>
<!-- 包含Curator组件 -->
<dependency>
    <groupId>org.springframework.integration</groupId>
    <artifactId>spring-integration-zookeeper</artifactId>
    <version>${spring-integration.version}</version>
</dependency>

3、配置文件

配置脚本

复制代码
zookeeper:
  #服务器地址
  connectString: 127.0.0.1:2181
  #会话超时时间
  sessionTimeoutMs: 3000
  #连接超时时间
  connectionTimeoutMs: 60000
  #最大重试次数
  maxRetries: 3
  #初始休眠时间
  baseSleepTimeMs: 1000

配置类

复制代码
@Configuration
public class ZookeeperConfig {

    @Value("${zookeeper.connectString}")
    private String connectString;
    
    @Value("${zookeeper.baseSleepTimeMs}")
    private int baseSleepTimeMs;

    @Value("${zookeeper.maxRetries}")
    private int maxRetries ;

    @Value("${zookeeper.connectionTimeoutMs}")
    int connectionTimeoutMs ;

    @Value("${zookeeper.sessionTimeoutMs}")
    int sessionTimeoutMs ;

    private static CuratorFramework client = null ;
    /**
     * 初始化
     */
    @PostConstruct
    public void init (){
        // 重试策略
        RetryPolicy policy = new ExponentialBackoffRetry(baseSleepTimeMs, maxRetries);
        // 创建Curator
        client = CuratorFrameworkFactory.builder()
                .connectString(connectString)
                .connectionTimeoutMs(connectionTimeoutMs)
                .sessionTimeoutMs(sessionTimeoutMs)
                .retryPolicy(policy).build();
        //开启连接
        client.start();
    }

    @Bean
    public CuratorFramework getClient (){
        return client ;
    }
}

四、ZooKeeper用法

测试几个API方法,节点创建和添加数据,以及判断和查询数据,还有就是基于ZooKeeper提供的读写锁能力。

复制代码
public class ConfigTest {

    @Autowired
    private CuratorFramework client ;

    @Test
    public void testCreate () throws Exception {
        // 创建一个持久化节点,断开连接时不会自动删除
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/path1");
    }

    @Test
    public void testExists () throws Exception {
        // 判断节点是否存在,path2不存在所以stat2是null
        Stat stat1 = client.checkExists().forPath("/path1");
        System.out.println(stat1);
        Stat stat2 = client.checkExists().forPath("/path2");
        System.out.println(stat2);
    }

    @Test
    public void testSetData () throws Exception {
        // 设置节点数据
        client.setData().forPath("/path1", "data1".getBytes(StandardCharsets.UTF_8));
    }

    @Test
    public void testCreateAndSet () throws Exception {
        // 创建一个持久化节点并设置节点数据
        client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)
                .forPath("/path3","data3".getBytes(StandardCharsets.UTF_8));
    }

    @Test
    public void testGetData () throws Exception {
        // 查询节点数据
        byte[] data = client.getData().forPath("/path3");
        System.out.println(new String(data,StandardCharsets.UTF_8));
    }

    @Test
    public void testDelete () throws Exception {
        // 删除节点
        client.delete().guaranteed().deletingChildrenIfNeeded().forPath("/path3");
    }

    @Test
    public void testReadLock () throws Exception {
        // 读写锁-读
        InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock-read");
        lock.readLock().acquire();
        System.out.println("获取-ReadLock");
        lock.readLock().release();
    }

    @Test
    public void testWriteLock () throws Exception {
        // 读写锁-写
        InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client,"/lock-write");
        lock.writeLock().acquire();
        System.out.println("获取-WriteLock");
        lock.writeLock().release();
    }
}
相关推荐
万联WANFLOW11 小时前
SD-WAN 控制平面高可用怎么做?SDWAN 控制器挂了,全网会发生什么
运维·网络·分布式·架构
月落归舟20 小时前
从单机到分布式:互联网系统架构演进全流程
分布式·系统架构
诚信定制83921 小时前
2025年CSDN年度技术趋势预测:AI、云原生与开发者工具的未来
人工智能·云原生
搬砖柯1 天前
系列12-接口压测怎么做成平台能力?自研 httpx 引擎、分布式 Worker 与 Locust 选型对照
分布式·测试工具·性能优化·开源·自动化·httpx
折哥的程序人生 · 物流技术专研1 天前
Java面试通关⑭:分布式理论与架构全集
分布式·微服务·校招·分布式事务·cap·java面试·最终一致性
Waay1 天前
面试口述版:个人对 Prometheus 完整理解
运维·学习·云原生·面试·职场和发展·kubernetes·prometheus
格子软件1 天前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
云烟成雨TD2 天前
Kubernetes 系列【4】基础概念
云原生·容器·kubernetes
云烟成雨TD2 天前
Kubernetes 系列【3】使用 kubeadm 创建 K8s 集群
云原生·容器·kubernetes
Evand J2 天前
【论文复现】MATLAB例程,存在测距误差的WSN无锚点分布式自定位,《WSN中存在测距误差的无锚点分布式自定位方法》
开发语言·分布式·matlab·定位·导航·wsn