为了以后工程迁移到nacos 上, 今天建了一个nacos+spring cloud 测试案例工程。

先说一下为什么使用spring cloud 而不是使用spring boot ,因为是要和feignClient 做集成,如果使用spring boot ,feignclient对服务的负责均衡和注入就要自己实现了。为了偷懒就直接那spring cloud.

首先服务引用了关于nacos的jar包:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2.2.5.RELEASE</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.5.RELEASE</version> 
</dependency>

nacos服务器上简单配置了一个简单的配置文件之后,服务就起来
起起来没问题,但是:

springcloud 关闭Sentinel springcloud in action_服务器

如图所示,200ms每次,疯狂刷新,循环拉取nacos配置文件,这个太不正常了,

然后在网上看了关于这个clientWorker打印的问题,几乎都是说是服务器的版本和客户端的版本不一致导致,我查了一下,我使用的都是1.4.1最新版本,没有问题,然后是不是配置的问题,不知道,在nacos官网上也找不到答案,那就只能自己查了。

然后查看debug + 源码,发现了了问题:

springcloud 关闭Sentinel springcloud in action_spring_02

如图所示,cacheMap缓存了两个配置信息,但是我确实只配置了一个,就是providor一个配置文件,然后每次通过http调用回来的结果也证实了一点,如下图:

springcloud 关闭Sentinel springcloud in action_spring_03

确实只有一个providor 文件,但是为什么会缓存了两个呢,导致每次都不一样,然后就会陷入死循环,一直在拿文件。
继续查找源码,最后在 spring-cloud-starter-alibaba-nacos-config-2.2.5.RELEASE.jar 包中
找到了com.alibaba.cloud.nacos.client.NacosPropertySourceLocator 这个类

springcloud 关闭Sentinel springcloud in action_spring_04

在这个方法中,就根据dataIdPrefix 缓存了两个文件,区别就是一个带着文件扩展名,一个没有带扩展名。
然后我无论如何也不能把这个去掉了,这样就比较尴尬了。
既然这是个bug,我觉的,nacos 的config 不再采用与spring cloud 做集成了,换成spring boot好了,然后配置一下,改为:

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.7</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.5.RELEASE</version>
    <exclusions>
        <exclusion>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-common</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-client</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>

然后启动,正常。使用feignClient,也正常
最后结果如图:

springcloud 关闭Sentinel springcloud in action_spring_05

每隔30s长轮询一下服务器。

最后说明一下,长轮询是使用spring boot 中的nacos-client的版本,版本我采最新的1.2.0  ,而去除了spring cloud中的nacos-client的1.4.1版本

原因就是,最新的nacos-config-spring-boot-starter0.2.7版本竟然与nacos-client 1.4.1版本不兼容,1.2.0中有个com.alibaba.nacos.client.utils.StringUtils类去掉了, 去掉了··········

木办法,希望nacos-config-spring-boot-starter 赶快更新版本,把nacos-client升级一下。

再说明一下,在nacos-client 1.4.1 版本中,这个打印作了一个判断,如果是空的话就不打印了。

我暂时只能查到现在这一步了