java动态修改nacos的yml配置

简介: 本文只介绍修改方案,没有对方案的可靠性进一步分析。如果涉及的nacos配置项很多,更建议采用数据库表单独存储,并对其进行增删改查。

1、需求
假设nacos上有一个test-dev.yml配置文件,其内容如下:

# 快递相关配置,accessToken每月需要更新一次
express:
  appKey: xxx
  appSecret: xxx
  accessToken: 123456789
AI 代码解读

现在需要把accessToken字段的值修改成1234

2、实现方式一
第一种方式使用snakeyaml

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>2.0</version>
</dependency>
AI 代码解读

这种方式有个弊端就是会把配置的注释行给忽略掉

@Value("${spring.profiles.active}")
private String profile;
@Value("${spring.cloud.nacos.config.server-addr}")
private String serverAddr;
private final String group = "DEFAULT_GROUP";

/**
 * 更新Nacos配置
 *
 * @param newAccessToken 
 * @return
 */
private Boolean updateCofig(String newAccessToken) {
   
   try {
   
       String dataId = String.format("test-%s.yml", profile);
       Properties properties = new Properties();
       properties.put("serverAddr", serverAddr);
       // 非public时需要设置
       properties.put("namespace", "test");
       // 读取nacos配置
       // 推荐使用NacosConfigManager获取当前ConfigService
       ConfigService configService = NacosFactory.createConfigService(properties);
       String content = configService.getConfig(dataId, group, 5000);

       Yaml yaml = new Yaml();
       // 字符串转换成map,这里会把注释行丢弃
       Map<String, Object> data = yaml.load(content);
       // 字段覆盖
       Map<String, Object> express = (Map<String, Object>) data.get("express");
       express.put("accessToken", newAccessToken);
       String yamlStr = yaml.dumpAsMap(data);
       //更新nacos配置
       return configService.publishConfig(dataId, group, yamlStr, ConfigType.YAML.getType());
   } catch (NacosException e) {
   
       e.printStackTrace();
   }
   return Boolean.FLASE;
}
AI 代码解读

执行成功后,文件内容被修改成

express:
  appKey: xxx
  appSecret: xxx
  accessToken: 1234
AI 代码解读

3、实现方式二
如果需要保留注释,则可以用eo-yaml

<dependency>
    <groupId>com.amihaiemil.web</groupId>
    <artifactId>eo-yaml</artifactId>
    <version>7.0.8</version>
</dependency>
AI 代码解读

详细代码

@Autowired
private NacosConfigManager nacosConfigManager;
@Value("${spring.profiles.active}")
private String profile;
private final String group = "DEFAULT_GROUP";

/**
 * 更新Nacos配置
 *
 * @param newAccessToken
 * @return
 */
private Boolean updateConfig(String newAccessToken) {
   
    try {
   
        String dataId = String.format("test-%s.yml", profile);
        //读取nacos配置
        ConfigService configService = nacosConfigManager.getConfigService();
        String content = configService.getConfig(dataId, group, 5000);
        //修改对应的配置
        YamlMapping mapping = Yaml.createYamlInput(content).readYamlMapping();
        // log.info("{}", mapping.toString());
        YamlMapping express = mapping.value("express").asMapping();
        String accessToken = express.string("accessToken");
        // 如果两个token一样则忽略修改
        if(newAccessToken.equals(accessToken)){
   
            log.warn("token未变化,忽略");
            return true;
        }
        YamlMapping edited = new MergedYamlMapping(
                // 原有配置
                mapping,
                // 需要更新的字段
                () -> Yaml.createYamlMappingBuilder()
                        .add("express", Yaml.createYamlMappingBuilder()
                                .add("accessToken", newAccessToken)
                                .build()
                        ).build(),
                // true-标识覆盖已有值,false则为追加新的字段
                true
        );
        //更新nacos配置
        return configService.publishConfig(dataId, group, edited.toString(), ConfigType.YAML.getType());
    } catch (NacosException | IOException e) {
   
       e.printStackTrace();
    }
    return Boolean.FALSE;
}
AI 代码解读

采用这种方式回写后的配置会给字符串加上双引号,并且空行会被移除。如:

# mybatis配置
mybatis:
  # 搜索指定包别名
  typeAliasesPackage: com.text.mapper
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath:mapper/**/*.xml

# 快递相关配置,accessToken每月需要更新一次
express:
  appKey: xxx
  appSecret: xxx
  accessToken: 123456789
AI 代码解读

以上配置会被修改成

# mybatis配置
mybatis:
  # 搜索指定包别名
  typeAliasesPackage: com.text.mapper
  # 配置mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: "classpath:mapper/**/*.xml"
# 快递相关配置,accessToken每月需要更新一次
express:
  appKey: xxx
  appSecret: xxx
  accessToken: 1234
AI 代码解读

通常这些操作是不会受影响,但在实际应用中还是要充分的评估和充足的测试,以保证万无一失。

目录
打赏
0
0
0
0
108
分享
相关文章
高效搭建Nacos:实现微服务的服务注册与配置中心
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统,特别是在微服务架构中。
905 81
高效搭建Nacos:实现微服务的服务注册与配置中心
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
【YashanDB知识库】调用外部UDF未能识别Java环境配置
springcloud/springboot集成NACOS 做注册和配置中心以及nacos源码分析
通过本文,我们详细介绍了如何在 Spring Cloud 和 Spring Boot 中集成 Nacos 进行服务注册和配置管理,并对 Nacos 的源码进行了初步分析。Nacos 作为一个强大的服务注册和配置管理平台,为微服务架构提供
399 14
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
543 61
Nacos 配置中心变更利器:自定义标签灰度
本文是对 MSE Nacos 应用自定义标签灰度的功能介绍,欢迎大家升级版本进行试用。
843 122
如何配置 Java 环境变量:设置 JAVA_HOME 和 PATH
本文详细介绍如何在Windows和Linux/macOS系统上配置Java环境变量。
2731 12
|
3月前
|
CentOS7.8配置Adoptium-Java17运行环境
本指南介绍如何设置清华镜像源并安装 Temurin-17-JRE 运行环境。首先,编辑 `/etc/yum.repos.d/adoptium.repo` 文件,配置清华镜像源。接着,使用 `yum install -y temurin-17-jre` 命令安装 Temurin-17-JRE,并通过 `java --version` 验证安装成功。相关配置和操作界面截图附后。
89 8
【Java若依框架】RuoYi-Vue的前端和后端配置步骤和启动步骤
本文介绍了如何配置和启动基于Java的若依(RuoYi)项目,涵盖后端和前端的详细步骤。首先,准备Redis、MySQL以及IDE(如Idea和VS)。接着,通过GitHub获取代码并导入到IDE中,执行必要的SQL文件和配置数据库密码。然后,启动Redis并进行相关配置。最后,按照前端配置步骤克隆前端代码库,打开终端执行命令完成前端配置。整个过程详细记录了每一步的操作,帮助开发者顺利部署若依项目。 如果你觉得有帮助,请点赞、关注和收藏,这将是我持续分享的动力!
1073 2
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
84 0
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
99 5
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等