2021-11-22 spring-cloud-nacos配置优先级

2021-11-22 spring-cloud-nacos配置优先级,第1张

最近有项目组同学问到为什么自己配置了nacos,但配置不生效?我简单看了下,发现问题出在相关配置的优先级模式不同。
spring-boot项目,有bootstrap、application两个配置文件,结合profile,和支持的文件格式properties、yaml,已经有6个配置文件了。然后使用了spring-cloud-starter-alibaba-nacos-config 后,又提供了三级配置。这些配置之间的组合关系,将在无形中影响配置的效果。很多同学只知道其中的一种,因此在无意识引入两种或以上的配置后,就会发现有奇怪的配置不生效问题发生。

spring-boot项目依赖bootstrapyml 用于应用程序上下文的引导阶段,由父Spring ApplicationContext加载,其工作的阶段为父ApplicationContext 被加载到使用applicationyml的之前。也就是说 bootstrap 加载优先于 applicaton。

bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。

bootstrap 配置文件有以下几个应用场景:

由于spring-boot支持多种文件格式,所以多种格式之间,其优先级是平等的,只要找到了一个,就会被使用。一般有:properties、yaml、xml等格式。

应用级别的spring-boot配置文件,主要用于 Spring Boot 项目的自动化配置,其加载优先级低于bootstrapyaml。

nacos作为外部配置服务器,通过spring-boot的bootstrapyaml引入。但nacos本身,也提供了三级配置体系:主配置(只有一个,但会按照不同后缀名,去找到相关配置)、扩展配置、共享配置。

三级配置的优先级如下:主配置 > 扩展配置 > 共享配置

nacos提供的配置路径 springcloudnacosconfig 下,有一系列的属性用于定位主配置。基于 prefix(默认为 ${springapplicationname} 的值)、namespace、group(默认为字符串 DEFAULT_GROUP )、file-extension(默认为字符串 properties ),按组装规则 ${prefix}-${springprofilesactive}${file-extension} 去找到一个配置。

在nacos的所有配置中,主配置(存在的情况下)具有最高的优先级,其同名配置值不能被扩展配置或共享配置中定义的同名属性所覆盖。

上述两类配置都支持三个属性: data-id 、 group (默认为字符串 DEFAULT_GROUP )、 refresh (默认为 true )。

实际上,nacos中并未对 extension-configs 和 shared-configs 的差别进行详细阐述。我们从他们的结构,看不出本质差别;除了优先级不同以外,也没有其他差别。那么,nacos项目组为什么要引入两个类似的配置呢我们可以从当初 该功能的需求(issue) 上找到其原始目的。
摘要其核心内容如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10901166.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存