读写nacos的配置中心的参数及变动监听方式
nacos有配置中心的功能,那么spring应用如何下载nacos的配置参数?
最简单的方法
是借组sentinel的NacosDataSource完成这个操作,如下例子:

@Configuration
@Slf4j
@Getter
public class AuthenConfig {
@Value("${spring.cloud.nacos.discovery.server-addr}")
private String nacosAddrs;
private String groupId="my-seta-business";
private String dataId="my-seta-business:authen-Config";
private EasyShiroProperties properties;
@PostConstruct
public void init(){
ReadableDataSource<String, EasyShiroProperties> nacosDataSource = new NacosDataSource<>(nacosAddrs, groupId, dataId,
source -> JsonUtils.fromJson(source, new TypeReference<>() {
}));
synchronized (nacosDataSource.getProperty()) {
nacosDataSource.getProperty().addListener(new PropertyListener(){
private void updateLocal(Object value){
properties=(EasyShiroProperties)value;
}
@Override
public void configUpdate(Object value) { //nacos的配置更新时触发
log.info("configUpdate:"+value);
updateLocal(value);
}
@Override
public void configLoad(Object value) {//第一次下载nacos配置时触发
log.info("configLoad:"+value);
updateLocal(value);
}
});
}
}
}
监听器有两个事件
一个是首次下载触发的configLoad,一个是nacos配置更新触发的configUpload。
那么如何用代码更新nacos上的配置?用ConfigService的publishConfig,下面例子:
String groupId="my-seta-business";
String dataId="my-seta-business:authen-Config";
try {
ConfigService configService = NacosFactory.createConfigService("128.30.14.249:8848");
System.out.println(configService.publishConfig(dataId, groupId, "{\"sessionTimeOut\":3600,\"cacheEnabled\":true,\"sessionRegion\":\"my-seata-business-region\",\"sessionTokenName\":\"access-token\",\"jwtTokenName\":\"access-token\"}"));
} catch (NacosException e) {
e.printStackTrace();
}
值得注意的是
同一个服务里面即使用上述方法更新配置到nacos,也不会触发configUpdate事件,configUpdate必须是本服务以外的地方发生更新才会触发,可见作者比较严谨。
如果我没用sentinel,只想用ConfigService监听配置中心的数据异动又怎样做呢?ConfigService也有监听事件,代码如下 :
/**
* Created by rocklee on 2022/4/20 14:13
*/
@Slf4j
@Configuration
public class AccountConfig implements InitializingBean , DisposableBean {
@Value("${spring.application.name}")
private String app;
@Value("${spring.profiles.active:}")
private String profile;
@Value("${spring.cloud.nacos.config.file-extension}")
private String fileExtension;
@Value("${spring.cloud.nacos.config.server-addr}")
private String configServerAddr;
private ConfigService configService;
@PostConstruct
public void init(){
}
@Override
public void afterPropertiesSet() throws Exception {
String dataId=app+(StringUtils.isBlank(profile)?"": "-"+profile)+"."+fileExtension;
final String group="DEFAULT_GROUP";
Properties properties=new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, configServerAddr);
configService= NacosFactory.createConfigService(properties);
log.info("nacos config:"+configService.getConfig(dataId,group,1000));
try {
configService.addListener(dataId, group, new AbstractListener() {
@Override
public void receiveConfigInfo(String configInfo) {
System.out.println(configInfo);
}
});
} catch (NacosException e) {
e.printStackTrace();
}
}
@Override
public void destroy() throws Exception {
configService.shutDown();
}
}
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
java 使用URLDecoder和URLEncoder对中文进行处理
这篇文章主要介绍了java 使用URLDecoder和URLEncoder对中文进行处理的相关资料,需要的朋友可以参考下2017-02-02
浅谈@RequestBody和@RequestParam可以同时使用
这篇文章主要介绍了@RequestBody和@RequestParam可以同时使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03


最新评论