最近使用spring-boot集成Nacos,根据官网文档的提示走,properties配置读取,更新正常。配置yaml就读取不到,最后才发现问题。
-
前置环境:没用最新的springboot版本,其他的web依赖就不贴了,贴主要的。Nacos 为2.0.3的服务
<groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.3.RELEASE</version> <!-- nacos 配置依赖 --> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-starter</artifactId> <version>0.2.1</version> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-config-spring-boot-actuator</artifactId> <version>0.2.1</version> </dependency> <!-- 注册服务依赖--> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>nacos-discovery-spring-boot-starter</artifactId> <version>0.2.1</version> </dependency>
-
使用以上依赖,进行集成,最后出现了配置中心配置不能读取的问题。下图在配置中心配置的yaml,程序中,name这些只有一个节点的配置可读取到,读取spring.redis.host多节点配置读取不到。
-
怎么解决?
以下代码是请求Nacos服务,获取配置文件的open api,同时也是Nacos集成到项目后,启动加载配置文件的调用接口,点进去打个断点debug启动。
追踪到AbstractNacosPropertySourceBuilder.class 类中的doBuild method,NacosPropertySource nacosPropertySource = new NacosPropertySource(dataId, groupId, name, nacosConfig, type);
这里是返回资源初始化的方法,查看nacosPropertySource 对象,你会发现spring.redis.host这种多节点,被拆分成<spring,””><redis,””><host,“value”>这种形式进行返回,因此{spring.redis.host}在取值时取不到,当然,直接{host}能取到,但没鸟用。
只有当以以下图片2中的形式进行返回的时候才能被读取<spring.redis.host ,value>// 访问nacos ConfigService configService = NacosFactory.createConfigService("127.0.0.1:8848"); // 通过DataId和Group获取配置文件内容 String contentInfo = configService.getConfig("test.yaml","DEFAULT_GROUP",1000L);
yml被解析成这样的时候,唉
-
发现问题了,怎么解决?
(人家的jar包)我也解决不了,狗头保命,当然强悍的小伙伴可以下载源码,改了自己引用(开源项目)。
解决不了,就只能跳过啊,Nacos的依赖包全部改成0.2.6版本。不知道是不是最新的包改了这个bug,还是因为其他版本包不兼容导致的。
<!-- nacos 配置依赖 -->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-starter</artifactId>
<version>0.2.6</version>
</dependency>
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-config-spring-boot-actuator</artifactId>
<version>0.2.6</version>
</dependency>
<!-- 注册服务依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>0.2.6</version>
</dependency>