java动态修改nacos的yml配置

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

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

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

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

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

<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>2.0</version>
</dependency>

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

@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;
}

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

express:
  appKey: xxx
  appSecret: xxx
  accessToken: 1234

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

<dependency>
    <groupId>com.amihaiemil.web</groupId>
    <artifactId>eo-yaml</artifactId>
    <version>7.0.8</version>
</dependency>

详细代码

@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;
}

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

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

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

以上配置会被修改成

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

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

相关文章
|
10天前
|
存储 网络协议 Nacos
高效搭建Nacos:实现微服务的服务注册与配置中心
Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款动态服务发现、配置管理和服务管理平台。它旨在帮助开发者更轻松地构建、部署和管理分布式系统,特别是在微服务架构中。
179 81
高效搭建Nacos:实现微服务的服务注册与配置中心
|
27天前
|
JSON Java Nacos
SpringCloud 应用 Nacos 配置中心注解
在 Spring Cloud 应用中可以非常低成本地集成 Nacos 实现配置动态刷新,在应用程序代码中通过 Spring 官方的注解 @Value 和 @ConfigurationProperties,引用 Spring enviroment 上下文中的属性值,这种用法的最大优点是无代码层面侵入性,但也存在诸多限制,为了解决问题,提升应用接入 Nacos 配置中心的易用性,Spring Cloud Alibaba 发布一套全新的 Nacos 配置中心的注解。
157 11
|
2月前
|
负载均衡 应用服务中间件 Nacos
Nacos配置中心
Nacos配置中心
131 1
Nacos配置中心
|
2月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评
Nacos作为流行的微服务注册与配置中心,其稳定性与易用性广受好评。然而,“客户端不发送心跳检测”是使用中常见的问题之一。本文详细探讨了该问题的原因及解决方法,包括检查客户端配置、网络连接、日志、版本兼容性、心跳检测策略、服务实例注册状态、重启应用及环境变量等步骤,旨在帮助开发者快速定位并解决问题,确保服务正常运行。
53 5
|
2月前
|
监控 Java 测试技术
Nacos 配置中心变更利器:自定义标签灰度
本文是对 MSE Nacos 应用自定义标签灰度的功能介绍,欢迎大家升级版本进行试用。
|
2月前
|
网络安全 Nacos 开发者
Nacos作为流行的微服务注册与配置中心,“节点提示暂时不可用”是常见的问题之一
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,“节点提示暂时不可用”是常见的问题之一。本文将探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务的正常运行。通过检查服务实例状态、网络连接、Nacos配置、调整健康检查策略等步骤,可以有效解决这一问题。
42 4
|
2月前
|
Java 网络安全 Nacos
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。
Nacos作为流行的微服务注册与配置中心,其稳定性和易用性备受青睐。然而,实际使用中常遇到“客户端不发送心跳检测”的问题。本文深入探讨该问题的原因及解决方案,帮助开发者快速定位并解决问题,确保服务正常运行。通过检查客户端配置、网络连接、日志、版本兼容性、心跳策略、注册状态、重启应用和环境变量等步骤,系统地排查和解决这一问题。
58 3
|
2月前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
79 3
|
2月前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
61 2
|
2月前
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
108 0