锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. 用Java代码从Nacos配置中心读取Spring boot程序的 yaml 格式配置文件内容

用Java代码从Nacos配置中心读取Spring boot程序的 yaml 格式配置文件内容

0
  • JAVA
  • 发布于 2024-08-14
  • 0 次阅读
黄健
黄健

本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net

Spring Cloud Alibaba (https://gitee.com/mirrors/Spring-Cloud-Alibaba)示例代码 spring-cloud-alibaba-examples 的 Integerated-example 项目中,integrated-praise-consumer 模块中,在 YamlConfigParser 类中,实现了从 Nacos 配置中心读取 Spring boot 程序的 yaml 格式配置文件内容的功能。

这个类的代码如下:

public class YamlConfigParser {
    @Autowired
    private NacosConfigManager nacosConfigManager;
 
    private Integer pullInterval = 4000;
    private Integer pullBatchSize = 4;
 
    private Integer minThread = 2; // 设置最小消费线程数
    private Integer maxThread = 32; // 设置最大消费线程数
    private String consumerGroup; // 消费者组
    private String  nameSrvAddr; // 命名服务器地址和端口号
    private String topic; // 消息主题
 
    public YamlConfigParser() {
    }
 
    public void getConfig(){
        String cfg = "";
        try {
            ConfigService configService = nacosConfigManager.getConfigService();
            cfg = configService.getConfig("integrated-consumer.yaml", "integrated-example", 2000);
            System.out.println("获取到配置信息--------------");
            System.out.println(cfg);
        }catch (NacosException e){
            e.printStackTrace();
        }
        if(cfg.length() == 0)
            return ;
 
        // 将字符串转换为字节数组
        byte[] bytes = cfg.getBytes(StandardCharsets.UTF_8);
        Yaml yaml = new Yaml();
        try (InputStream in = new ByteArrayInputStream(bytes)) {
            Map<String, Object> config = yaml.load(in);
 
            // 需要按照配置文件逐层解析并访问配置信息
            Map<String, Object> springConfig = (Map<String, Object>) config.get("spring");
            Map<String, Object> cloudConfig = (Map<String, Object>) springConfig.get("cloud");
            Map<String, Object> streamConfig = (Map<String, Object>) cloudConfig.get("stream");
            Map<String, Object> bindingsConfig = (Map<String, Object>) streamConfig.get("bindings");
            Map<String, Object> inputConfig = (Map<String, Object>) bindingsConfig.get("praise-input");
 
            // topic = (String) config.get("spring.cloud.stream.bindings.praise-input.destination"); // 不支持这种用法,取不到值
            topic = (String) inputConfig.get("destination");
            consumerGroup = (String) inputConfig.get("group");
 
            Map<String, Object> rocketmqConfig = (Map<String, Object>) streamConfig.get("rocketmq");
            Map<String, Object> binderConfig = (Map<String, Object>) rocketmqConfig.get("binder");
            nameSrvAddr = (String)binderConfig.get("name-server");
 
            Map<String, Object> mqbindingsConfig = (Map<String, Object>) rocketmqConfig.get("bindings");
            Map<String, Object> mqpraiseinputConfig = (Map<String, Object>) mqbindingsConfig.get("praise-input");
            Map<String, Object> consumerinputConfig = (Map<String, Object>) mqpraiseinputConfig.get("consumer");
 
            pullInterval = (Integer)consumerinputConfig.get("pullInterval");
            pullBatchSize = (Integer)consumerinputConfig.get("pullBatchSize");
 
            // 输出配置信息
            System.out.println("nameSrvAddr: " + nameSrvAddr);
            System.out.println("consumerGroup: " + consumerGroup);
            System.out.println("topic: " + topic);
            System.out.println("pullInterval: " + pullInterval);
            System.out.println("pullBatchSize: " + pullBatchSize);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    public Integer getPullInterval() {
        return pullInterval;
    }
    public void setPullInterval(Integer pullInterval) {
        this.pullInterval = pullInterval;
    }
    public Integer getPullBatchSize() {
        return pullBatchSize;
    }
    public void setPullBatchSize(Integer pullBatchSize) {
        this.pullBatchSize = pullBatchSize;
    }
    public Integer getMinThread() {
        return minThread;
    }
    public void setMinThread(Integer minThread) {
        this.minThread = minThread;
    }
    public Integer getMaxThread() {
        return maxThread;
    }
    public void setMaxThread(Integer maxThread) {
        this.maxThread = maxThread;
    }
    public String getConsumerGroup() {
        return consumerGroup;
    }
    public void setConsumerGroup(String consumerGroup) {
        this.consumerGroup = consumerGroup;
    }
    public String getNameSrvAddr() {
        return nameSrvAddr;
    }
    public void setNameSrvAddr(String nameSrvAddr) {
        this.nameSrvAddr = nameSrvAddr;
    }
    public String getTopic() {
        return topic;
    }
    public void setTopic(String topic) {
        this.topic = topic;
    }
}

读取的 integrated-consumer.yaml 文件内容如下:

spring:
  datasource:
    url: jdbc:mysql://integrated-mysql:3306/integrated_praise?useSSL=false&characterEncoding=utf8
  cloud:
    stream:
      bindings:
        praise-input:
          destination: PRAISE-TOPIC-01
          content-type: application/json
          group: praise-consumer-group-PRAISE-TOPIC-01
      rocketmq:
        binder:
          name-server: rocketmq:9876
        bindings:
          praise-input:
            consumer:
              pullInterval: 4000
              pullBatchSize: 4

代码中 getConfig() 方法功能是从 Nacos 配置中心获取名为integrated-consumer.yaml的配置文件,并将其内容解析为 Java 对象,然后从这些对象中提取特定的配置信息。以下是该代码的主要步骤和功能:

  1. 获取配置:使用ConfigService从 Nacos 配置中心获取名为integrated-consumer.yaml的配置,配置文件的命名空间(namespace)是integrated-example,并设置超时时间为 2000 毫秒。
ConfigService configService = nacosConfigManager.getConfigService();
cfg = configService.getConfig("integrated-consumer.yaml", "integrated-example", 2000);

2. 配置解析:将获取到的字符串配置cfg转换为字节数组,然后使用Yaml库将其解析为Map<String, Object>对象。

byte[] bytes = cfg.getBytes(StandardCharsets.UTF_8);
Yaml yaml = new Yaml();
try (InputStream in = new ByteArrayInputStream(bytes)) {
Map<String, Object> config = yaml.load(in);
}

3. 逐层解析配置:通过逐层访问Map对象,提取特定的配置信息,如topic、consumerGroup和nameSrvAddr等。

Map<String, Object> springConfig = (Map<String, Object>) config.get("spring");
Map<String, Object> cloudConfig = (Map<String, Object>) springConfig.get("cloud");
// ... 更多的逐层解析 ...
topic = (String) inputConfig.get("destination");
consumerGroup = (String) inputConfig.get("group");
nameSrvAddr = (String)binderConfig.get("name-server");

需要注意的是,这段代码假设 YAML 配置文件的结构是已知的,并且能够通过链式调用get方法访问到相应的配置信息。如果配置文件的结构发生变化,或者某个键不存在,这段代码将会抛出NullPointerException。

此外,这段代码还展示了如何从一个复杂的嵌套结构中提取特定的配置值,这在处理复杂的配置文件时是非常常见的。

代码中

// 不支持这种用法,取不到值
 
topic = (String) config.get("spring.cloud.stream.bindings.praise-input.destination");

这是尝试通过直接拼接键名来获取配置值的方式,证明是不可行的,必须逐层解析配置对象来获取值。

标签: #软件开发 1171 #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.