java動(dòng)態(tài)修改nacos的yml配置方式
本文只介紹修改方案,沒(méi)有對(duì)方案的可靠性進(jìn)一步分析。如果涉及的nacos配置項(xiàng)很多,更建議采用數(shù)據(jù)庫(kù)表單獨(dú)存儲(chǔ),并對(duì)其進(jìn)行增刪改查。
1、需求
假設(shè)nacos上有一個(gè)test-dev.yml配置文件,其內(nèi)容如下:
# 快遞相關(guān)配置,accessToken每月需要更新一次 express: appKey: xxx appSecret: xxx accessToken: 123456789
現(xiàn)在需要把accessToken字段的值修改成1234。
2、實(shí)現(xiàn)方式一
第一種方式使用snakeyaml
<dependency> <groupId>org.yaml</groupId> <artifactId>snakeyaml</artifactId> <version>2.0</version> </dependency>
這種方式有個(gè)弊端就是會(huì)把配置的注釋行給忽略掉
@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時(shí)需要設(shè)置
properties.put("namespace", "test");
// 讀取nacos配置
// 推薦使用NacosConfigManager獲取當(dāng)前ConfigService
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(dataId, group, 5000);
Yaml yaml = new Yaml();
// 字符串轉(zhuǎn)換成map,這里會(huì)把注釋行丟棄
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í)行成功后,文件內(nèi)容被修改成
express: appKey: xxx appSecret: xxx accessToken: 1234
3、實(shí)現(xiàn)方式二
如果需要保留注釋?zhuān)瑒t可以用eo-yaml
<dependency>
<groupId>com.amihaiemil.web</groupId>
<artifactId>eo-yaml</artifactId>
<version>7.0.8</version>
</dependency>
詳細(xì)代碼
@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);
//修改對(duì)應(yīng)的配置
YamlMapping mapping = Yaml.createYamlInput(content).readYamlMapping();
// log.info("{}", mapping.toString());
YamlMapping express = mapping.value("express").asMapping();
String accessToken = express.string("accessToken");
// 如果兩個(gè)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-標(biāo)識(shí)覆蓋已有值,false則為追加新的字段
true
);
//更新nacos配置
return configService.publishConfig(dataId, group, edited.toString(), ConfigType.YAML.getType());
} catch (NacosException | IOException e) {
e.printStackTrace();
}
return Boolean.FALSE;
}
采用這種方式回寫(xiě)后的配置會(huì)給字符串加上雙引號(hào),并且空行會(huì)被移除。如:
# mybatis配置 mybatis: # 搜索指定包別名 typeAliasesPackage: com.text.mapper # 配置mapper的掃描,找到所有的mapper.xml映射文件 mapperLocations: classpath:mapper/**/*.xml # 快遞相關(guān)配置,accessToken每月需要更新一次 express: appKey: xxx appSecret: xxx accessToken: 123456789
以上配置會(huì)被修改成
# mybatis配置 mybatis: # 搜索指定包別名 typeAliasesPackage: com.text.mapper # 配置mapper的掃描,找到所有的mapper.xml映射文件 mapperLocations: "classpath:mapper/**/*.xml" # 快遞相關(guān)配置,accessToken每月需要更新一次 express: appKey: xxx appSecret: xxx accessToken: 1234
通常這些操作是不會(huì)受影響,但在實(shí)際應(yīng)用中還是要充分的評(píng)估和充足的測(cè)試,以保證萬(wàn)無(wú)一失。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- Java實(shí)現(xiàn)Consul/Nacos根據(jù)GPU型號(hào)、顯存余量執(zhí)行負(fù)載均衡的步驟詳解
- Java?Nacos與Gateway的使用操作筆記
- 解決nacos報(bào)錯(cuò)java.lang.ClassNotFoundException: com.netflix.config.DynamicPropertyFactory的問(wèn)題
- 解決Nacos集群?jiǎn)?dòng)失敗:java版本問(wèn)題
- 使用Java自制一個(gè)一個(gè)Nacos
- Java中基于Nacos實(shí)現(xiàn)Sentinel規(guī)則持久化詳解
相關(guān)文章
JAVA如何判斷上傳文件后綴名是否符合規(guī)范MultipartFile
這篇文章主要介紹了JAVA判斷上傳文件后綴名是否符合規(guī)范MultipartFile,文中通過(guò)實(shí)例代碼介紹了java實(shí)現(xiàn)對(duì)上傳文件做安全性檢查,需要的朋友可以參考下2023-11-11
Java中實(shí)現(xiàn)String.padLeft和String.padRight的示例
本篇文章主要介紹了Java中實(shí)現(xiàn)String.padLeft和String.padRight,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09
Spring框架花式創(chuàng)建Bean的n種方法(小結(jié))
這篇文章主要介紹了Spring框架花式創(chuàng)建Bean的n種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03
Jmeter訪問(wèn)需要登錄的接口如何處理問(wèn)題
這篇文章主要介紹了Jmeter訪問(wèn)需要登錄的接口如何處理問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-11-11
解讀nextLine().split(“[\\s]“)的意思
這篇文章主要介紹了解讀nextLine().split(“[\\s]“)的意思,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04
springboot后臺(tái)session的存儲(chǔ)與取出方式
這篇文章主要介紹了springboot后臺(tái)session的存儲(chǔ)與取出方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-06-06
mybatis批量update時(shí)報(bào)錯(cuò)multi-statement not allow的問(wèn)題
這篇文章主要介紹了mybatis批量update時(shí)報(bào)錯(cuò)multi-statement not allow的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10
Java實(shí)現(xiàn)上傳文件圖片到指定服務(wù)器目錄
本文通過(guò)實(shí)例代碼給大家介紹了java上傳文件圖片到指定服務(wù)器目錄的相關(guān)知識(shí),代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-06-06

