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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java详细讲解依赖注入的方式

    Java详细讲解依赖注入的方式

    Idea中使用@Autowire注解会出现提示黄线,强迫症患者看着很难受,使用构造器注入或者setter方法注入后可解决,下面我们一起来看看
    2022-06-06
  • Spring Boot整合SSE实时通信的问题小结

    Spring Boot整合SSE实时通信的问题小结

    本文介绍了服务器发送事件(Server-Sent Events,SSE)技术,其主要特点包括单向数据流、自动重连、自定义事件类型等,SSE适用于实时更新场景,如新闻推送、评论系统等,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Springboot注入成员变量HttpServletRequest的原理分析

    Springboot注入成员变量HttpServletRequest的原理分析

    这篇文章主要介绍了Springboot注入成员变量HttpServletRequest的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 深入解析Java的包(package)

    深入解析Java的包(package)

    这篇文章主要介绍了深入解析Java的包(package),是Java入门学习中的基础知识,需要的朋友可以参考下
    2015-09-09
  • Java线程池ThreadPoolExecutor的使用及其原理详细解读

    Java线程池ThreadPoolExecutor的使用及其原理详细解读

    这篇文章主要介绍了Java线程池ThreadPoolExecutor的使用及其原理详细解读,线程池是一种多线程处理形式,处理过程中将任务添加到队列,然后在创建线程后自动启动这些任务,线程池线程都是后台线程,需要的朋友可以参考下
    2023-12-12
  • Spring源码解析之编程式事务

    Spring源码解析之编程式事务

    今天给大家带来的是关于Java Spring的相关知识,文章围绕着Spring编程式事务展开,文中有非常详细的介绍,需要的朋友可以参考下
    2021-06-06
  • java web中使用cookie记住用户的账号和密码

    java web中使用cookie记住用户的账号和密码

    这篇文章主要介绍了java web中使用cookie记住用户的账号和密码的相关资料,需要的朋友可以参考下
    2017-01-01
  • springboot aop切到service层,不生效问题

    springboot aop切到service层,不生效问题

    这篇文章主要介绍了springboot aop切到service层,不生效问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • 使用java -Dloader.path=./lib -jar启动应用的完整实践指南

    使用java -Dloader.path=./lib -jar启动应用的完整实践指南

    java -Dloader.path="lib/" -jar XXXX.jar是一个用于启动Java 应用程序的命令,这篇文章主要介绍了使用java -Dloader.path=./lib -jar启动应用的完整实践指南,文中给出了详细代码示例,需要的朋友可以参考下
    2025-10-10
  • idea搭建mybatis环境配置全过程

    idea搭建mybatis环境配置全过程

    本文介绍了如何以IDEA搭建MyBatis环境配置的方法,包括步骤和注意事项,通过本文的介绍,可以轻松地以IDEA搭建MyBatis环境配置,提高开发效率
    2023-10-10

最新评论