SpringCloudAlibaba中Nacos注册中心对yml文件和properties文件处理方式


1. 前置条件

在 SpringBoot 项目中,配置文件有不同的写法,主要分为application.propertiesapplication.ymlbootstrap.yml三种方式,在 Nacos 中对这三种文件的加载方式有所不同,这也是在集成 Nacos 注册中心、配置中心可能存在的问题和坑。针对 Nacos 配置中心对这application.ymlbootstrap.yml两种文件格式的加载顺序作详细的说明和记录。

2. application.yml

当应用项目中使用application.yml配置文件的时候,在 yml 文件中配置如下:

  • application.yml 文件
spring:
	profiles:
		active: local
	application:
		name: demo-service
  • application-local.yml 文件
spring:
	cloud:
		nacos:
			server-addr: 127.0.0.1:8848
			username: demo
			password: demo@1234
			discovery:
				namespace: 3ad4514f-c78f-47e3-9ec2-984119540c6c
				group: DEMO_TEST_GROUP
				file-extension: yml
				shared-configs:
					- bootstrap-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
			config:
				namespace: 3ad4514f-c78f-47e3-9ec2-984119540c6c
				group: DEMO_TEST_GROUP
  • 在 Nacos 注册中心的配置文件

|namespace|dataId|group|
:—-:—-:—-:
|3ad4514f-c78f-47e3-9ec2-984119540c6c|demo-service-local.yml|DEMO_TEST_GROUP|

在理想的状态下,启动项目的时候,项目会到 Nacos 配置中心的指定 namespace 下找对应的 dataId 和对应的 Group,最终找到demo-service-local.yml配置文件,并获取对应的配置信息。但是实际上并非如此。这里存在一个坑,也就是项目中配置文件的加载顺序问题。(最后总结中说)
问题描述:从日志上看,项目启动时会依次去找 dataId 为 demo-service、demo-service.properties、demo-service-local.properties 文件,然后就出现在 Nacos 配置中心找不到配置文件问题。但是在项目配置了文件的后缀为 yml,为什么还是去找 properties 后缀的文件呢?配置的后缀没有生效?还是写的不规范?

3. bootstrap.yml

将上面的application.ymlapplication-local.yml配置文件的名称分别修改成bootstrap.ymlbootstrap-local.yml。发现上面存在的问题就解决了。项目启动时会依次去找 dataId 为demo-servicedemo-service.ymldemo-service-local.yml文件。当找到demo-service-local.yml文件的时候,就会命中并加载。这又是为什么呢?

4. 总结

我们进入到 Nacos 的源码,找到com.alibaba.cloud.nacos.NacosConfigProperties类和com.alibaba.cloud.nacos.client.NacosPropertySourceBuilder类。
NacosConfigProperties中找到setFileExtension方法,在方法内打一个断点,然后在NacosPropertySourceBuilder中找到loadNacosData方法打个断点。

  • setFileExtension:这个方法是将项目中配置的后缀读取出来。
  • loadNacosData:这个方法是依次去找上面提到的三个文件,并拉取加载。

现在分别使用上面的两种情况来启动项目。你会发现,当使用application.yml命名项目配置文件的时候,是先执行loadNacosData方法,再执行setFileExtension。当使用bootstrap.yml命名项目配置文件的时候,是先执行setFileExtension方法,再执行loadNacosData

从上面断点的信息中分析如下:

  • 当使用application.yml命名项目配置文件的时候,在没有加载配置中心信息的前就会去 Nacos 配置中心拉取数据,这个时候采用的是默认后缀.properties,而不是项目配置文件中指定的yml后缀。要想成功的拉取并加载 Nacos 中的配置文件,在 Nacos 中的配置文件就要使用.properties结尾的 dataId,并且配置格式选择 properties。否则会出现找不到文件的问题,导致配置中心不能正常使用。

  • 当使用bootstrap.yml命名项目配置文件的时候,是先加载配置中心信息后再去 Nacos 配置中心拉取数据。这个时候 Nacos 中的配置文件使用什么结尾的 dataId,配置格式选择什么,取决于项目中配置的信息。

总结:在 ChatGPT 上或者其他博主的博客上都有说到使用bootstrap.yml取代application.yml,其实也是这种考虑。存在加载顺序的问题,容易踩坑。(被坑的才知道!都是泪!)


文章作者: 程序猿洞晓
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 程序猿洞晓 !
评论
 本篇
SpringCloudAlibaba中Nacos注册中心对yml文件和properties文件处理方式 SpringCloudAlibaba中Nacos注册中心对yml文件和properties文件处理方式
微服务应用很广,之前使用Spring Cloud组件,因为其内的很多组件几年前都已经停止更新,Spring Cloud Alibaba应运而出,提供了很好的解决方案,现在基本涉及微服务都避不开Spring Cloud Alibaba,而Nacos就是其中的重要组件之一。
2024-04-26
下一篇 
Centos 7、凝思系统环境下离线安装PostgreSQL11+Postgis2.5.2 Centos 7、凝思系统环境下离线安装PostgreSQL11+Postgis2.5.2
数据迁移,需要将原来CentOS系统上的应用迁入到凝思系统,一个国产系统,基于Debian系统研发的,直接使用RPM安装不了,只能使用二进制安装,虽然是针对凝思系统安装,但也同样支持在CentOS中安装,安装操作都是在离线状态下进行,无法联网。
2023-11-09
  目录