Skip to content
<

使用nacos-server-1.2.1版本客户端不断重复拉取服务端配置的问题

一、项目环境

项目主依赖使用Spring Cloud,其次整合了Spring Cloud Alibaba生态圈中的部分依赖组件:nacos、seata ,项目的核心组件依赖版本兼容如下方,提供给大家参考:

组件版本号
nacos.version1.2.1
spring cloud.versionGreenwich.SR2
spring cloud alibaba.version2.1.2.RELEASE
spring boot.version2.1.6.RELEASE
jdk.version1.8

二、问题描述

项目进入测试阶段时,修改了某个服务的application.yml文件依赖属性,在nacos-server端提供的控制台上修改配置文件点击提交后,后端的控制台日志显示Nacos客户端(每个后台服务就是一个Nacos客户端)不断从Nacos-Server服务端拉取配置。

日志示例如下:

java
2020-10-30 16:03:53.666 INFO   [com.alibaba.nacos.client.Worker.longPolling.fixed-198.10.49.162_8848] c.a.n.c.c.i.ClientWorker - [fixed-198.10.49.162_8848] [polling-resp] config changed. dataId=product-service.yaml, group=DEFAULT_GROUP

百度了一番,网上有少量相关方面的文章,其中有些作者作出的解释如下:

Nacos客户端判断Nacos服务端的配置文件发生了变化(config changed),所以Nacos客户端才会从Nacos服务端拉取配置,但是Nacos服务端上的配置并没有改变。

在Nacos控制台上打开该配置文件的详情,会发现该配置文件的MD5值与后台服务日志中打印的MD5值不一致,Nacos控制台上显示的MD5值前面少了0。

虽然客户端的MD5值并没有前面少个0,但可以精确的确定是由于客户端会通过计算该配置文件得到MD5值,然后与服务端的MD5值进行比对,发现MD5值存在不一致的情况,因此开始了一个疯狂的从Nacos-Server服务端拉取配置操作,这也就是大家遇到的为什么控制台日志显示Nacos客户端(每个后台服务就是一个Nacos客户端)不断从Nacos-Server服务端拉取配置。

猜测一下两端的MD5计算方式这一块应该存在一些问题,打开nacos官方源码,查看Issue: https://github.com/alibaba/nacos/issues/2722 发现确实存在这种情况,有不少网友提出问题,期待官方能够在下一个版本中修复关于MD5 的问题。
在这里插入图片描述

三、问题产生原因

因为使用的Nacos 1.2.1版本有一个已知的MD5问题,对同一个配置文件,Nacos客户端和Nacos服务端计算出的MD5值(校验和)不一致,会导致Nacos客户端认为该配置在Nacos服务端有更新,导致Nacos客户端不断从Nacos服务端拉取配置。

四、解决方式

1. 临时解决:修改并重启nacos-server

这种方式是根据issues的回答参考来的,可临时解决问题: https://github.com/alibaba/nacos/issues/2722 ,另外也可以尝试重启nacos-server的服务,我就是重启之后临时的解决了这个问题。
在这里插入图片描述
或者临时解决方法
在Nacos控制台上,修改配置文件(比如加一些不会影响格式的空格),再保存。这时Nacos客户端会重新拉取配置,并计算MD5值,只要计算出的MD5值不以0开头,就不会触发Nacos的MD5 bug。

2. 永久解决:升级nacos-server版本

Nacos客户端(每个后台服务就是一个Nacos客户端)不断从Nacos-Server服务端拉取配置这个问题存在于naco-server-1.2.1版本中,在Nacos GitHub上已经将1.2.1版本标注为“Not Suggest Have MD5 Problem“,因此可以将Nacos升级到高版本来解决。

nacos-server下载地址: https://github.com/alibaba/nacos/releases

另外nacos-server-1.3.0作为为nacos-server-12.1之后的一个正式版本被发布版了出来,从修复的日志列表中可以知道,在nacos-server-12.1版本中存在的MD5值计算的问题已经被修复了,而且nacos-server-1.3.0高版本是完全向下兼容低版本的nacos-server,我们的做法就是直接升级到nacos-server-1.3.0或者更高一点的版本即可。
在这里插入图片描述

五、总结

从项目中遇到的问题,到我们把问题解决掉这个过程中可以看出,既然吃技术这碗饭,必然要有一颗迎接新技术的激情,在我们使用任何一种新的框架时,不管遇到什么问题,都应该抱着一颗探索的心态去尝试这解决它,百度可成为你的助手,官方源码可成为你的提问点,在发现问题时可提问给官方,官方看到会解决,更有能力者可调试并且修改源码重新发布版本即可解决问题,虽然国内开源框架的文档较为缺乏,但是只要你去挖掘,一定能够解决你的问题。

六、参考文档

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

seatahttps://github.com/seata/seata/issues

Sentinel: https://github.com/alibaba/Sentinel/issues