SpringBoot读取ZooKeeper(ZK)属性的方法实现

 更新时间:2025年06月09日 11:23:41   作者:weixin_43833540  
本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperties实现类型安全和自动刷新,对比传统方式优缺点,感兴趣的可以了解一下

1. 在配置文件中定义 ZK 属性

在 application.properties 或 application.yml 中添加 ZK 相关配置:

application.properties

# 单源配置示例
zookeeper.source.default.rootnode=/democonfig
zookeeper.source.default.servers=192.168.124.1:2181,192.168.124.2:2181
zookeeper.source.default.acls=root:iiot!@#zk$

# 多源配置示例(可选)
zookeeper.source.backup.rootnode=/backup-config
zookeeper.source.backup.servers=192.168.124.3:2181

application.yml

zookeeper:
  source:
    default:
      rootnode: /democonfig
      servers: 192.168.124.1:2181,192.168.124.2:2181
      acls: root:iiot!@#zk$
    backup:
      rootnode: /backup-config
      servers: 192.168.124.3:2181

2. 创建配置类绑定属性

使用 @ConfigurationProperties 绑定 ZK 配置:

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Map;

@Component
@ConfigurationProperties(prefix = "zookeeper")
@Getter
@Setter
public class ZookeeperConfig {
    private Map<String, SourceProperties> source = new HashMap<>();

    @Getter
    @Setter
    public static class SourceProperties {
        private String rootnode;
        private String servers;
        private String acls;
    }
}

3. 初始化 ZK 客户端

在 Spring 容器中初始化 ZK 客户端,确保配置已注入:

import org.apache.zookeeper.ZooKeeper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;

@Component
public class ZookeeperClient {
    private static final int SESSION_TIMEOUT = 5000;
    private final ZooKeeper zooKeeper;

    @Autowired
    public ZookeeperClient(ZookeeperConfig zookeeperConfig) {
        try {
            // 获取默认源配置
            ZookeeperConfig.SourceProperties source = zookeeperConfig.getSource().get("default");
            if (source == null) {
                throw new IllegalArgumentException("ZooKeeper source 'default' not configured");
            }
            this.zooKeeper = new ZooKeeper(
                source.getServers(),
                SESSION_TIMEOUT,
                null
            );
        } catch (IOException e) {
            throw new RuntimeException("Failed to connect to ZooKeeper", e);
        }
    }

    public ZooKeeper getZooKeeper() {
        return zooKeeper;
    }
}

4. 使用配置属性

在任意 Spring Bean 中注入 ZookeeperConfig 或 ZookeeperClient,并读取属性:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {
    @Autowired
    private ZookeeperConfig zookeeperConfig;

    @Autowired
    private ZookeeperClient zookeeperClient;

    public void printZkConfig() {
        // 直接读取配置
        ZookeeperConfig.SourceProperties source = zookeeperConfig.getSource().get("default");
        System.out.println("ZK Root Node: " + source.getRootnode());
        System.out.println("ZK Servers: " + source.getServers());

        // 通过客户端使用 ZK 连接
        ZooKeeper zk = zookeeperClient.getZooKeeper();
        System.out.println("ZK Session ID: " + zk.getSessionId());
    }
}

5. 多源配置支持

如果需要切换不同的 ZK 源(如 default 和 backup),可扩展 ZookeeperClient

@Component
public class ZookeeperClient {
    private final Map<String, ZooKeeper> clients = new HashMap<>();

    @Autowired
    public ZookeeperClient(ZookeeperConfig zookeeperConfig) {
        zookeeperConfig.getSource().forEach((name, config) -> {
            try {
                clients.put(name, new ZooKeeper(
                    config.getServers(),
                    SESSION_TIMEOUT,
                    null
                ));
            } catch (IOException e) {
                throw new RuntimeException("Failed to connect to ZooKeeper source: " + name, e);
            }
        });
    }

    public ZooKeeper getClient(String sourceName) {
        return clients.getOrDefault(sourceName, clients.get("default"));
    }
}

6. 注意事项

  • 配置文件路径:确保 application.properties 或 application.yml 在类路径下(src/main/resources)。
  • 属性键命名规则:
    • 使用 kebab-case(如 zookeeper.source.default.servers)。
    • 绑定到 @ConfigurationProperties 时,自动转换为驼峰命名(如 source.default.servers → source.get("default").getServers())。
  • 优先级:
    • 系统属性(-D 参数) > 配置文件 > 代码默认值。
  • 异常处理:在 ZK 客户端初始化时捕获 IOException,并提供友好的错误提示。
  • 单例与依赖注入:避免在 Spring 容器初始化前手动创建 ZookeeperClient(如在 main 方法中),应通过 @Autowired 注入。

对比:传统属性读取 vs Spring Boot 原生方式

方式优点缺点
传统 PropertyConfig简单直接,无需 Spring 依赖不支持自动刷新、类型安全、配置校验
Spring Boot @ConfigurationProperties类型安全、支持校验、自动刷新(需配置)需要定义配置类,学习成本略高

通过以上步骤,你可以在 Spring Boot 中优雅地读取和管理 ZooKeeper 的配置属性。

到此这篇关于SpringBoot读取ZooKeeper(ZK)属性的方法实现的文章就介绍到这了,更多相关SpringBoot读取ZooKeeper内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring之InitializingBean接口和DisposableBean接口的使用

    Spring之InitializingBean接口和DisposableBean接口的使用

    这篇文章主要介绍了Spring之InitializingBean接口和DisposableBean接口的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-01-01
  • java实现验证码类生成中文验证码

    java实现验证码类生成中文验证码

    java实现的汉字输入验证码,主要包含两个类,一个是生成验证码,一个是判断验证码输入是否正确,实现原理非常简单,将汉字和干扰线生成图片并将汉字保存到session,前台获取每次生成验证码图片并用文本框值和session值比较,功能就怎么简单
    2014-01-01
  • mybatis插入数据后如何返回新增数据的id值

    mybatis插入数据后如何返回新增数据的id值

    当往mysql数据库插入一条数据时,有时候需要知道刚插入的信息,下面这篇文章主要给大家介绍了关于mybatis插入数据后如何返回新增数据id值的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • java实现ATM取款项目

    java实现ATM取款项目

    这篇文章主要为大家详细介绍了java实现ATM取款项目的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06
  • java枚举enum和Enum类的使用

    java枚举enum和Enum类的使用

    本文主要介绍了java枚举enum和Enum类的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • SpringBoot 编程式事务使用及两种实现方式

    SpringBoot 编程式事务使用及两种实现方式

    编程式事务管理是通过编写代码来管理事务,相对于声明式事务(@Transactional注解),它提供了更细粒度的事务控制,这篇文章主要介绍了SpringBoot 编程式事务使用及两种实现方式,需要的朋友可以参考下
    2024-12-12
  • springboot max-http-header-size最大长度的那些事及JVM调优方式

    springboot max-http-header-size最大长度的那些事及JVM调优方式

    这篇文章主要介绍了springboot max-http-header-size最大长度的那些事及JVM调优方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • Mybatis返回Map数据方式示例

    Mybatis返回Map数据方式示例

    这篇文章主要为大家介绍了Mybatis返回Map数据方式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • Java中的可重入锁ReentrantLock简析

    Java中的可重入锁ReentrantLock简析

    这篇文章主要介绍了Java中的可重入锁ReentrantLock简析,可重入是指同一个线程如果首次获得了这把锁,那么因为它是这把锁的拥有者,因此有权利再次获取这把锁如果是不可重入锁,那么第二次获得锁时,自己也会被锁挡住,需要的朋友可以参考下
    2023-12-12
  • Java Socket编程(五) 简单的WEB服务器

    Java Socket编程(五) 简单的WEB服务器

    Java Socket编程(五) 简单的WEB服务器...
    2006-12-12

最新评论