1. 前置条件
在 SpringBoot 项目中,配置文件有不同的写法,主要分为application.properties
、application.yml
、bootstrap.yml
三种方式,在 Nacos 中对这三种文件的加载方式有所不同,这也是在集成 Nacos 注册中心、配置中心可能存在的问题和坑。针对 Nacos 配置中心对这application.yml
、bootstrap.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.yml
和application-local.yml
配置文件的名称分别修改成bootstrap.yml
和bootstrap-local.yml
。发现上面存在的问题就解决了。项目启动时会依次去找 dataId 为demo-service
、demo-service.yml
、demo-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
,其实也是这种考虑。存在加载顺序的问题,容易踩坑。(被坑的才知道!都是泪!)