spring-cloud-starter-alibaba-nacos-config低版本动态配置成功,但是后台CaCheData自动刷新失败问题

博客讲述了在使用nacos动态刷新配置时遇到的BUG,表现为后台CaCheData自动刷新失败。作者尝试升级到不同版本的spring-cloud-starter-alibaba-nacos-config及依赖,但问题依然存在。最终解决方案是整体升级spring boot、spring cloud、nacos client以及spring cloud alibaba nacos到官方推荐的Hoxton.SR6和2.2.1.RELEASE版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于nacos动态刷新配置的BUG

1.发现BUG的过程:

为提高新增的业务日志功能的灵活性,也是为了避免该功能隐藏的BUG造成内存溢出的风险,需要开关动态控制该功能的开启和关闭,我在配置文件增加了一个boolean值,动态修改该boolean 值后,可做到动态控制该功能的开启和关闭,但是后台也在不断报【

ERROR 4668 --- [f4-0e9f2e3a81ea] c.a.nacos.client.config.impl.CacheData : [fixed-127.0.0.1_8848-362ecf23-2a9d-4667-90f4-0e9f2e3a81ea] [notify-error] dataId=za-.yml, group=DEFAULT_GROUP, md5=2754ec7238aa2688390b07f8440e8ed7, listener=org.springframework.cloud.alibaba.nacos.refresh.NacosContextRefresher$1@a7a41da tx=null】这样的一个错误,也有人在官方的项目维护下提了issue,链接为

https://github.com/alibaba/nacos/issues/3157

2.尝试修复BUG的过程

我首先是尝试使用了 spring-cloud-starter-alibaba-nacos-(config/discovery) 的 1.5.1.RELEASE 版本替换我们的 0.9.0.RELEASE 进行修复,替换后发现,这个版本的nacos 不读取bootstrap.yml文件了,这样跟我们项目目前的配置冲突,我们项目是使用application.yml+bootstrap.yml+对应的微服务.yaml这样的形式配置的,经过查询别人的经验发现可以增加 spring-cloud-starter-bootstrap 解决不读取bootstrap.yml的问题,我增加后发现还是修复不了读取bootstrap.yml的问题,再查询时发现,spring-cloud-starter-bootstrap也不推荐使用了,也是过时的技术了,不深究这个了。

第二次尝试使用官方推荐的搭配,升级到spring-cloud-starter-alibaba-nacos-(config/discovery) 的2.1.2.RELEASE 的版本进行修复,升级后发现,目前项目的功能都正常,但是原来的报错还是报错,咨询了大量的同行朋友后,得出结论,该BUG反复出现在好几个版本是版本不兼容导致,建议是升级spring cloud 到H版本以上,再将对应的spring boot ,spring cloud nacos 都升级到官方建议的版本来解决此问题。

3.目前我们项目的技术版本如下:

spring boot 版本为 2.1.10.RELEASE

对应int-parent父项目的配置pom.xml中的artifactId为 spring-boot-starter-parent

spring cloud 的版本为 Greenwich.RELEASE

对应int-parent父项目的配置pom.xml中的artifactId为 spring-cloud-dependencies

nacos server 版本为2.0.3

Spring Cloud LoadBalancer 并不支持 Nacos 的通知机制来清除缓存,但可以通过监听 Nacos配置变更事件来手动触发缓存清除。具体实现步骤如下: 1. 在 `pom.xml` 文件中添加 Nacos 相关依赖: ```xml <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> ``` 2. 在 `application.properties` 或 `application.yml` 文件中配置 Nacos 相关属性: ```yaml spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=your-namespace spring.cloud.nacos.config.group=your-group spring.cloud.nacos.config.prefix=your-prefix spring.cloud.nacos.config.file-extension=properties spring.cloud.nacos.config.shared-dataids=your-dataid ``` 3. 创建一个监听 Nacos 配置变更的类,并在其中实现缓存清除逻辑: ```java @Component @RefreshScope public class NacosConfigListener { @Autowired private LoadBalancerCacheManager loadBalancerCacheManager; @NacosConfigListener(dataId = "${spring.cloud.nacos.config.shared-dataids}") public void onConfigChange(String config) { // 清除缓存 loadBalancerCacheManager.getCache("your-service-name").clear(); } } ``` 其中,`your-service-name` 是需要清除缓存的服务名称,`your-dataid` 是 Nacos 配置中心中对应的 DataID。需要注意的是,`@RefreshScope` 注解是必须的,它可以使 Spring Cloud LoadBalancer 在收到 Nacos 配置变更事件时,重新创建 `LoadBalancerCacheManager` 实例,从而清除缓存。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值