当我们把nacos服务端启动起来,项目中也集成好之后,兴高采烈的启动项目准备试一下,发现在nacos中修改配置之后发现项目中的配置竟然没有刷新,然后开始怀疑是不是自己那里配置的不对、那个注解没有写、nacos版本是不是和springboot不兼容,然后一通修改,最后发现还是不行,最后开始怀疑人生。
下面两个场景可能会帮到你

1.没有开启nacos的自动刷新

springboot集成nacos的时候,需要在项目的配置文件里加入如下配置

nacos:config:bootstrap:enable: true# nacos服务ip和端口server-addr: 127.0.0.1:8848data-id: testgroup: localusername: nacospassword: nacostype: yaml# 开启nacos自动刷新,如果这个配置没有或者为false会导致配置不能自动刷新auto-refresh: true# 允许nacos服务端向本地同步配置enable-remote-sync-config: true

并且在配置属性上使用@NacosValue注解并且配置注解的autoRefreshed的值为true(默认为false,不会自动刷新),两个配置缺一不可;如果你使用的是spring的@Value注解,只能获取到配置,但不能自动刷新配置。
到这里借本就可以解决99%的问题了,剩下的1%的问题接着往下看

2.项目中集成了ulisesbocchio或者类似的插件,对配置进行加密

如果不想看细节,只想解决问题,可以直接把项目中ulisesbocchio或者类似的插件移除掉,然后把加密的配置变成明文放到nacos中就好了。
------------------------下面进行问题定位------------------------
在nacos中修改配置后,会自动通知给客户端,客户端在收到通知变更的请求后,经过一系列的前戏会执行到
com.alibaba.nacos.client.config.impl.CacheData#safeNotifyListener这个方法里,源码如下我们在这个方法的第一行打一个断点追踪一下执行链路;

    <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>${jasypt-spring-boot-starter.version}</version></dependency>
private void safeNotifyListener(final String dataId, final String group, final String content, final String type,final String md5, final String encryptedDataKey, final ManagerListenerWrap listenerWrap) {final Listener listener = listenerWrap.listener;if (listenerWrap.inNotifying) {LOGGER.warn("[{}] [notify-currentSkip] dataId={}, group={}, md5={}, listener={}, listener is not finish yet,will try next time.",name, dataId, group, md5, listener);return;}//这里创建了一个线程,异步的修改配置,保证保证本次配置变更请求能够快速响应Runnable job = new Runnable() {@Overridepublic void run() {long start = System.currentTimeMillis();ClassLoader myClassLoader = Thread.currentThread().getContextClassLoader();ClassLoader appClassLoader = listener.getClass().getClassLoader();try {if (listener instanceof AbstractSharedListener) {AbstractSharedListener adapter = (AbstractSharedListener) listener;adapter.fillContext(dataId, group);LOGGER.info("[{}] [notify-context] dataId={}, group={}, md5={}", name, dataId, group, md5);}// Before executing the callback, set the thread classloader to the classloader of// the specific webapp to avoid exceptions or misuses when calling the spi interface in// the callback method (this problem occurs only in multi-application deployment).Thread.currentThread().setContextClassLoader(appClassLoader);ConfigResponse cr = new ConfigResponse();cr.setDataId(dataId);cr.setGroup(group);cr.setContent(content);cr.setEncryptedDataKey(encryptedDataKey);configFilterChainManager.doFilter(null, cr);String contentTmp = cr.getContent();listenerWrap.inNotifying = true;// contentTmp这个变量里存储了最新的全量配置,也是我们这次源码追踪的重点,看看是如何自动刷新配置的listener.receiveConfigInfo(contentTmp);// compare lastContent and contentif (listener instanceof AbstractConfigChangeListener) {Map data = ConfigChangeHandler.getInstance().parseChangeData(listenerWrap.lastContent, content, type);ConfigChangeEvent event = new ConfigChangeEvent(data);((AbstractConfigChangeListener) listener).receiveConfigChange(event);listenerWrap.lastContent = content;}listenerWrap.lastCallMd5 = md5;LOGGER.info("[{}] [notify-ok] dataId={}, group={}, md5={}, listener={} ,cost={} millis.", name,dataId, group, md5, listener, (System.currentTimeMillis() - start));} catch (NacosException ex) {LOGGER.error("[{}] [notify-error] dataId={}, group={}, md5={}, listener={} errCode={} errMsg={}",name, dataId, group, md5, listener, ex.getErrCode(), ex.getErrMsg());} catch (Throwable t) {LOGGER.error("[{}] [notify-error] dataId={}, group={}, md5={}, listener={} tx={}", name, dataId,group, md5, listener, t.getCause());} finally {listenerWrap.inNotifying = false;Thread.currentThread().setContextClassLoader(myClassLoader);}}};final long startNotify = System.currentTimeMillis();try {if (null != listener.getExecutor()) {//将上面创建的线程放到线程池里执行listener.getExecutor().execute(job);} else {try {INTERNAL_NOTIFIER.submit(job);} catch (RejectedExecutionException rejectedExecutionException) {LOGGER.warn("[{}] [notify-blocked] dataId={}, group={}, md5={}, listener={}, no available internal notifier,will sync notifier ",name, dataId, group, md5, listener);job.run();} catch (Throwable throwable) {LOGGER.error("[{}] [notify-blocked] dataId={}, group={}, md5={}, listener={}, submit internal async task fail,throwable= ",name, dataId, group, md5, listener, throwable);job.run();}}} catch (Throwable t) {LOGGER.error("[{}] [notify-error] dataId={}, group={}, md5={}, listener={} throwable={}", name, dataId,group, md5, listener, t.getCause());}final long finishNotify = System.currentTimeMillis();LOGGER.info("[{}] [notify-listener] time cost={}ms in ClientWorker, dataId={}, group={}, md5={}, listener={} ",name, (finishNotify - startNotify), dataId, group, md5, listener);}

由于篇幅问题,后面的我用图片展示,大家根据图片可以自行追踪

代码调试完成后,问题的根源也就找到了,接下来就是删除配置加密组件,修改为明文配置,启动项目,搞定收工。

nacos配置不自动刷新相关推荐

  1. springcloud系列30——Spring Cloud Config配置属性自动刷新

    前言 在前面一节中,我们通过执行/refresh端点来手动刷新配置,但是如果微服务的数量太多,一个一个刷新就很麻烦也很慢.本节介绍使用Spring Cloud Bus实现批量刷新和自动刷新. 使用Sp ...

  2. webpack2配置浏览器自动刷新

    前言 老项目用的webpack2,有浏览器刷新开发起来方便多了 解决 单页面的 entry: [// 给webpack-dev-server启动一个本地服务,并连接到8080端口'webpack-de ...

  3. nacos配置自动刷新

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 nacos自动刷新配置 一.简单实现 二.工具类自动刷新 1.使用PostConstruct注解 2.Application ...

  4. Spring Boot缓存实战 Redis 设置有效时间和自动刷新缓存,时间支持在配置文件中配置

    问题描述 Spring Cache提供的@Cacheable注解不支持配置过期时间,还有缓存的自动刷新. 我们可以通过配置CacheManneg来配置默认的过期时间和针对每个缓存容器(value)单独 ...

  5. 结合 live-reload 实现自动刷新

    结合 live-reload 实现自动刷新 前端工程师日常开发最频繁(实际上最浪费时间)的操作是什么?可能你已经想到了,就是刷新页面,要让变更生效,需要重新加载,刷新页面的操作就变成了重复低效的操作. ...

  6. nacos如何做配置中心?自带自动刷新配置功能?这一篇文章让你明明白白!

    目录 nacos做配置中心 pom加上: bootstrap.yml(优先级高于application.yml) application.yml 主启动类 controller: 配置yml和naco ...

  7. Nacos服务的注册,服务的调用,修改配置文件自动刷新和命名空间

    一.nacos配置中心的配置 使用nacos作为配置中心,不需要再到远端仓库拉取配置文件. 详细的nacos控制台配置参见官方链接 二.服务的注册 创建项目并引入依赖 <!--引入nacos c ...

  8. Chapter2 消息总线 ConfigClient配置自动刷新

    Chapter2 消息总线ConfigClient配置自动刷新 Spring Cloud Bus: Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitM ...

  9. iframe的src动态修改并刷新_微服务中配置中心Config+消息总线Bus,实现分布式自动刷新配置

    技术/杨33 一.分布式配置中心Config 一套集中的.动态的配置管理,实现统一配置微服务中的每个子服务. Spring Cloud Config为微服务架构提供了集中化的外部配置支持,配置服务器为 ...

最新文章

  1. 什么?程序员还要了解经济学?!
  2. vs 设置调试路径为exe所在的路径
  3. 前端进阶之路:初涉Less
  4. SpringData核心数据访问接口--CrudRepository示例
  5. php数组中删除元素
  6. asp.net在线发送邮件,以前没做过,调试好了。
  7. 利用循环神经网络生成唐诗_PyTorch实现用于文本生成的循环神经网络
  8. myeclipse2019左侧工程目录字体的大小调整
  9. mysql 改表面_CSS表面(outline)是什么【html5教程】,CSS
  10. Android animation动画
  11. httpclient架构原理介绍 连接池详解
  12. paip.提升用户体验----置顶菜单
  13. python科学计算-python科学计算
  14. Paxos算法和Raft算法
  15. web(蜘蛛网和网)
  16. BSCI社会责任验厂对员工考勤和工资的标准和要求
  17. LinuxC编程中常见的段错误(非法操作内存)情形
  18. android shell打包报错
  19. mysql中db的名词解释_数据库常用名词解释大全
  20. 用python绘制玫瑰花的代码_Python 玫瑰花绘制

热门文章

  1. golang net包tcp超时设置并判断是否超时
  2. 开发使用air还是pro_说不过去|第四代 iPad Air 评测:性能向 Pro 看齐,续航比 Pro 更强,为啥有人说不香?...
  3. 自动化运维工具——SaltStack(上)
  4. element一次上传多个文件,并将文件名展示出来;使用文件流进行下载
  5. Linux手动安装Anaconda3与whl安装包
  6. Java的reactor模式_Reactor模式详解+源码实现
  7. 一文带你搞懂什么是测试开发!
  8. Xavier (2)——刷机
  9. JavaScript打印三角形
  10. 今天是周二,100天以后是周几?