读写nacos的配置中心的参数及变动监听方式

 更新时间:2026年02月11日 17:16:19   作者:OK_boom  
Spring应用可以通过NacosDataSource下载配置参数,使用ConfigService的publishConfig方法更新Nacos上的配置,但同一服务内部更新配置不会触发configUpdate事件,ConfigService也提供了监听事件功能

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();
  }
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Mybatis mapper接口动态代理开发步骤解析

    Mybatis mapper接口动态代理开发步骤解析

    这篇文章主要介绍了Mybatis mapper接口动态代理开发步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Swagger在java中的运用及常见问题解决

    Swagger在java中的运用及常见问题解决

    Swagger插件是一款深受Java开发者喜爱的工具,它在前后端分离的开发模式下发挥着重要作用,这篇文章主要介绍了Swagger在java中的运用及常见问题的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-06-06
  • hibernate 常用方法介绍

    hibernate 常用方法介绍

    这篇文章介绍了hibernate的常用方法,有需要的朋友可以参考一下
    2013-09-09
  • Springboot集成CSRF防攻击过程

    Springboot集成CSRF防攻击过程

    本文介绍了Springboot集成CSRF防攻击的方法,通过设置域名或路径白名单来过滤未知链接,从而达到防护目的,主要涉及两个类:CSRFFilterConfigUtils防护配置工具类和CsrfFilter防护过滤类
    2025-11-11
  • Spring解决泛型擦除的思路详解

    Spring解决泛型擦除的思路详解

    这篇文章主要介绍了Spring解决泛型擦除的思路,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • java实现客户端向服务器发送文件

    java实现客户端向服务器发送文件

    这篇文章主要为大家详细介绍了java实现客户端向服务器发送文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • 详解高性能缓存Caffeine原理及实战

    详解高性能缓存Caffeine原理及实战

    Caffeine是基于Java 8开发的,提供了近乎最佳命中率的高性能本地缓存组件,Spring5开始不再支持Guava Cache,改为使用Caffeine。Caffeine提供的内存缓存使用参考Google guava的API
    2021-06-06
  • Java 单链表数据结构的增删改查教程

    Java 单链表数据结构的增删改查教程

    这篇文章主要介绍了Java 单链表数据结构的增删改查教程,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • Java实现多个数组间的排列组合

    Java实现多个数组间的排列组合

    这篇文章主要为大家详细介绍了Java实现多个数组间的排列组合,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-02-02
  • JAVA验证码工具实例代码

    JAVA验证码工具实例代码

    这篇文章主要介绍了JAVA验证码工具实例代码,需要的朋友可以参考下
    2018-03-03

最新评论