入门Nacos时关于Springboot配置boostrap与application.xml的加载

m0_37777187 2020-10-28 05:35:02
这几天因为项目组把一个springboot的项目整合到微服务里,用到Nacos,就简单的研究了一下。
涉及到当使用Nacos作为配置中心的时候,简单整合参考demo发现一个问题。到取nacos的配置的时候对应的dataId的规则是这样的:

${prefix}-${spring.profiles.active}.${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

具体到我的springboot测试环境里,除了指定了nacos的bootstrap.yml,本地还有application.yml,application-dev.yml,application-test.yml这些并没有删去,只是把信息都稍作修改放到配置中心里。

当我在bootstrap.yml里指定了spring.application.name为A,spring.cloud.nacos.config.file-extension为yaml时,也没有写spring.profiles.active,按上面的规则,去服务器找配置的对应dataId应该是A.yaml。
最后发觉对应dataId却是B-test.yaml,当然没拿到服务器上的配置。
而B是本地application-test.yml里的spring.application.name的值,并且application.yml指定是spring.profiles.active为test。

这个就让我困惑了,我之前对这个并没有什么研究。一直的认知是bootstrap的加载顺序高于application的。我理想的效果应该是先按bootstrap里配置的注册中心信息去拿服务器的配置,拿不到时再按本地的application找对应的配置。
这个实际效果却是,bootstrap和application-x同时配置有spring.application.name时,生效的是application-test.yml中的值。

后面我又测试了一下,当在bootstrap.yml也指定spring.profiles.active为dev(application.yml仍旧是test)。后面结果是对应dataId是C-dev.yaml。C是application-dev.yml里的spring.application.name的值。
此处具体到spring.profiles.active上却是bootstrap.yml的值。

只有当把application-dev.yml或application-test.yml里的spring.application.name的值都删掉时,这个时候name才会是A。dataId也是A-dev.yml或A-test.yml

我后面这样测试了一下:
applicaiton.yml里指定spring.profiles.active的是test配置,对应的applicaiton-dev.yml和applicaiton-test的yml里的spring.application.name分别是M和N。bootstrap.yml的file-extension为yaml。
1.当bootstrap.yml里既不指定active也不写name时。
最后dataId:N-test.yaml
2.当bootstrap.yml里name写上C。
最后dataId:N-test.yaml
3.当bootstrap.yml里active写上dev
最后dataId:M-dev.yaml
4.当bootstrap.yml里active写上dev,name写上F。
最后dataId:M-dev.yaml
5.当bootstrap.yml里active写上dev,name写上F。同时删掉applicaiton-dev.yml里name的A的值
最后dataId:F-dev.yaml

似乎这个取配置的dataId,一般来说,先看bootstrap里有没有写spring.profiles.active,没有的话就看application.xml里的spring.profiles.active指定,根据这个去找对应的-dev或-test的application文件对应的spring.application.name。
然后按照如name-dev.yaml到配置中心去拿对应配置,这个配置确实会优先于本地配置生效。

这是什么顺序
...全文
4783 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
KeepSayingNo 2020-10-29
  • 打赏
  • 举报
回复
具体加载还是依赖看nacos是怎么处理得,你说的那个加载器顺序是类加载器顺序把

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧