欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java動態(tài)修改nacos的yml配置方式

 更新時間:2025年08月06日 16:46:05   作者:左邊的天堂  
文章介紹修改Nacos配置文件的兩種方式:snakeyaml忽略注釋但修改直接,eo-yaml保留注釋但格式變化,建議配置項多時用數(shù)據(jù)庫存儲,強調實際應用需充分評估和測試以確保可靠性

本文只介紹修改方案,沒有對方案的可靠性進一步分析。如果涉及的nacos配置項很多,更建議采用數(shù)據(jù)庫表單獨存儲,并對其進行增刪改查。

1、需求

假設nacos上有一個test-dev.yml配置文件,其內容如下:

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

現(xiàn)在需要把accessToken字段的值修改成1234。

2、實現(xiàn)方式一

第一種方式使用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;
}

執(zhí)行成功后,文件內容被修改成

express:
  appKey: xxx
  appSecret: xxx
  accessToken: 1234

3、實現(xiàn)方式二

如果需要保留注釋,則可以用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

通常這些操作是不會受影響,但在實際應用中還是要充分的評估和充足的測試,以保證萬無一失。

總結

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關文章

  • Java設計模式之代理模式原理及實現(xiàn)代碼分享

    Java設計模式之代理模式原理及實現(xiàn)代碼分享

    這篇文章主要介紹了Java設計模式之代理模式原理及實現(xiàn)代碼分享,設計代理模式的定義,靜態(tài)代理,動態(tài)代理,jdk動態(tài)代理實現(xiàn)步驟,原理及源碼等相關內容,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • 解析JavaSe的抽象類和接口

    解析JavaSe的抽象類和接口

    這篇文章主要為大家詳細介紹了JavaSe的抽象類和接口,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • JAVA遞歸與非遞歸實現(xiàn)斐波那契數(shù)列

    JAVA遞歸與非遞歸實現(xiàn)斐波那契數(shù)列

    這篇文章主要為大家詳細介紹了JAVA遞歸與非遞歸實現(xiàn)斐波那契數(shù)列,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • springboot中如何引入AOP切面編程

    springboot中如何引入AOP切面編程

    這篇文章主要介紹了springboot中如何引入AOP切面編程問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • Spring循環(huán)依賴之問題復現(xiàn)詳解

    Spring循環(huán)依賴之問題復現(xiàn)詳解

    這篇文章主要為大家詳細介紹了Spring的循環(huán)依賴什么時候會出現(xiàn)以及如何解決循環(huán)依賴,文中的示例代碼講解詳細,感興趣的可以學習一下
    2022-07-07
  • Java分布式學習之Kafka消息隊列

    Java分布式學習之Kafka消息隊列

    Kafka是由Apache軟件基金會開發(fā)的一個開源流處理平臺,由Scala和Java編寫。Kafka是一種高吞吐量的分布式發(fā)布訂閱消息系統(tǒng),它可以處理消費者在網(wǎng)站中的所有動作流數(shù)據(jù)
    2022-07-07
  • Kotlin 基礎教程之數(shù)組容器

    Kotlin 基礎教程之數(shù)組容器

    這篇文章主要介紹了Kotlin 基礎教程之數(shù)組容器的相關資料,需要的朋友可以參考下
    2017-06-06
  • spring?security?自定義Provider?如何實現(xiàn)多種認證

    spring?security?自定義Provider?如何實現(xiàn)多種認證

    這篇文章主要介紹了spring?security?自定義Provider實現(xiàn)多種認證方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • Java 實現(xiàn)棧的三種方式

    Java 實現(xiàn)棧的三種方式

    這篇文章主要介紹了棧:LIFO(后進先出),自己實現(xiàn)一個棧,要求這個棧具有push()、pop()(返回棧頂元素并出棧)、peek() (返回棧頂元素不出棧)、isEmpty()這些基本的方法,需要的朋友可以參考下
    2020-12-12
  • 約定優(yōu)于配置_動力節(jié)點Java學院整理

    約定優(yōu)于配置_動力節(jié)點Java學院整理

    以前做項目,總是寫Ant配置文件,滿足于自己更靈活的配置,而沒有去思考,這么做到底值不值得
    2017-08-08

最新評論