开发者社区 > 云原生 > 正文

使用Nacos时遇到自动刷新功能(@NacosValue的autoRefreshed)无法工作的问题

使用Nacos时遇到自动刷新功能(@NacosValue的autoRefreshed)无法工作的问题:运行环境使用的是nacos-spring-context-1.1.1.jar版本,问题在1.1.2版本中依然存在。配置变动后,有些配置不能自动刷新,尤其是含特殊字符'$'的配置项。而且这个问题只在首次变动时出现,之后的变动会误判为已成功刷新,影响了部分配置项的自动刷新功能。
问题复现步骤如下:
设置并监听Nacos的配置项。
变更配置值后调用特定接口来刷新。
检查发现有些配置项并没有刷新成功。

展开
收起
真的很搞笑 2024-01-04 15:46:40 757 0
2 条回答
写回答
取消 提交回答
  • 面对过去,不要迷离;面对未来,不必彷徨;活在今天,你只要把自己完全展示给别人看。

    根据您的描述,问题可能出在占位符替换时校验$后面字符的规则上。您可以尝试修改这个规则,以允许$后面是{或者数字1~9的情况。具体操作如下:

    1. 找到nacos-spring-context-1.1.2.jar中的NacosConfigListener类。
    2. 打开NacosConfigListener类的代码文件。
    3. 找到handleRefresh方法,该方法负责处理配置刷新事件。
    4. 在handleRefresh方法中,找到以下代码段:
    if (!key.endsWith("${") && !key.endsWith("#{")) {
        continue;
    }
    
    1. 将这段代码修改为:
    if (!key.endsWith("${") && !key.endsWith("#{") && !key.endsWith("[0-9]")) {
        continue;
    }
    
    1. 保存并重新编译nacos-spring-context-1.1.2.jar。
    2. 重启应用,测试配置是否能够正常刷新。

    这样修改后,当$后面是{或者数字1~9时,配置条目应该可以正常刷新了。希望这对您有所帮助!

    2024-01-05 11:23:48
    赞同 1 展开评论 打赏
  • 这个问题看起来像是Nacos的一个已知问题,可能是由于Nacos在处理带有特殊字符(如$)的配置值时的解析错误导致的。这个问题已经在Nacos的GitHub仓库中被报告,并且已经有人提出了修复方案。

    你可以查看这个issue:https://github.com/alibaba/nacos/issues/1025

    在这个issue中,有人提供了一个临时的解决方案,那就是在配置值中使用双引号代替单引号。例如,将配置值从 demoConfigItem1={"password":"(.password):|=(?!ENC[(][a-zA-Z0-9]+[)])(?![$][{].+[}])(.+)"} 改为 demoConfigItem1={"password":"(.password):|=(?!ENC[(][a-zA-Z0-9]+[)])(?![$][{].+[}])(.+)"}

    然而,这只是一个临时的解决方案,你仍然需要等待Nacos团队修复这个问题。你可以关注这个issue,以便在问题解决后得到通知。

    2024-01-05 11:09:30
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
Nacos架构&原理 立即下载
workshop专场-微服务专场-开发者动手实践营-微服务-使用Nacos进行服务的动态发现和流量调度 立即下载
Nacos 启航,发布第一个版本, 云原生时代助力用户微服务平台建设 立即下载