nacos启动后一直打印ClientWorker日志
现象
一直打印ClientWorker日志
2020-08-24 00:57:30.977 INFO [12932] --- [.cn_8848-public] c.a.n.client.config.impl.ClientWorker : [fixed-nacos.itlym.cn_8848-public] [data-received] dataId=common.yml, group=DEFAULT_GROUP, tenant=public, md5=8c191cace81179b01fb745b5d027c1c8, content=xxx
2020-08-24 00:57:30.989 INFO [12932] --- [.cn_8848-public] c.a.n.client.config.impl.ClientWorker : [fixed-nacos.itlym.cn_8848-public] [data-received] dataId=sms-center.yml, group=DEFAULT_GROUP, tenant=public, md5=f12bc945ba0c1d39f3dea2e0977db712, content=xxx
...
原因分析
根本原因
之前看过 nacos 源码,nacos 会每 10ms 检测配置项和服务端配置项是否一致,如果不一致,则从服务端拉取最新配置。
而判断条件是本地配置的md5值与服务器的md5值对比。
因此,如果nacos-client 和 nacos-server 的 md5 算法不同,则会导致误判,从而不停刷新,导致不停地打印ClientWorker日志。
直接原因
我的nacos服务端是1.3,客户端使用了 spring-cloud-alibaba.version
中的,点开发现 nacos 客户端版本是 1.2
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
这里吐槽以下,
spring-cloud-alibaba-dependencies
的官网还有仓库都好久没更新了,容易误导使用者,浪费大量的排查时间。
其他可能的原因
namespace 设置了 public
见 nacos-github
这时解决最好的方式就是不要设置 namespace,否则等 nacos 发布新版本,可能是1.4
解决方案
方案一:
将自己的 client 和 nacos server 版本改为一致,如下
client端:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
<exclusions>
<exclusion>
<artifactId>com.alibaba.nacos</artifactId>
<groupId>nacos-client</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>1.3.2</version>
</dependency>
方案二
由于 spring-cloud-alibaba-dependencies 留了properties指定版本这个口子,(默认<nacos.client.version>1.2.1</nacos.client.version>
)
故只需要在自己的pom.xml中加入
<properties>
<nacos.client.version>1.2.1</nacos.client.version>
</properties>
注:如果引入的是 spring-cloud-starter-nacos-config
则不能通过该方案规避,因为 ``spring-cloud-alibaba-dependencies 且有硬编码问题。引入时应主动指定版本。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>1.3.0</version>
</dependency>
方案三(适合已有系统的中间件升级方案)
自己下载 nacos-client 1.2.1 版本代码,修改其 Md5Util 的包路径为新的后,重新发布到本地或私有仓库。