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

总结

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

相关文章

  • Java 坐标系相互转换方式

    Java 坐标系相互转换方式

    这篇文章主要介绍了Java中的坐标系相互转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • spring 事务实现的示例

    spring 事务实现的示例

    本文主要介绍了spring 事务实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-02-02
  • 通过Spring AOP实现异常捕捉机制

    通过Spring AOP实现异常捕捉机制

    在开发过程中,异常处理是一个不可忽视的重要环节,合理、优雅地处理异常不仅能提高代码的鲁棒性,还能提升系统的用户体验,本文将介绍如何通过Spring AOP实现一个高效的异常捕捉机制,使得异常处理变得更加优雅和统一,需要的朋友可以参考下
    2024-08-08
  • 在SpringBoot项目中实现读写分离的流程步骤

    在SpringBoot项目中实现读写分离的流程步骤

    SpringBoot作为一种快速开发框架,广泛应用于Java项目中,在一些大型应用中,数据库的读写分离是提升性能和扩展性的一种重要手段,本文将介绍如何在SpringBoot项目中优雅地实现读写分离,并通过适当的代码插入,详细展开实现步骤,同时进行拓展和分析
    2023-11-11
  • MyBatisPlus项目的创建和使用

    MyBatisPlus项目的创建和使用

    本文介绍了MyBatis-Plus的基本使用方法,包括项目的创建和配置、增删查改操作、日志打印以及条件构造器的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-11-11
  • java  使用URLDecoder和URLEncoder对中文进行处理

    java 使用URLDecoder和URLEncoder对中文进行处理

    这篇文章主要介绍了java 使用URLDecoder和URLEncoder对中文进行处理的相关资料,需要的朋友可以参考下
    2017-02-02
  • 通过String.intern()方法浅谈堆中常量池

    通过String.intern()方法浅谈堆中常量池

    这篇文章主要介绍了通过String.intern()方法浅谈堆中常量池,在JDK7之前,字符串常量是存在永久带Perm 区的,JDK7开始在将常量池迁移到堆中,这个变化也导致了String的新特性,下面我们慢慢进行介绍。,需要的朋友可以参考下
    2019-06-06
  • 深度解析Java中的JSONObject从基础到高级应用

    深度解析Java中的JSONObject从基础到高级应用

    在当今前后端分离的架构中,JSONObject已成为Java开发者处理JSON数据的瑞士军刀,本文将深入解析JSONObject的核心机制与实战技巧,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • 浅谈@RequestBody和@RequestParam可以同时使用

    浅谈@RequestBody和@RequestParam可以同时使用

    这篇文章主要介绍了@RequestBody和@RequestParam可以同时使用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java开发工具IntelliJ IDEA安装图解

    Java开发工具IntelliJ IDEA安装图解

    这篇文章主要介绍了Java开发工具IntelliJ IDEA安装图解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11

最新评论