Spring Cloud Config 中属性的加载优先级是啥?

Posted

技术标签:

【中文标题】Spring Cloud Config 中属性的加载优先级是啥?【英文标题】:What is the loading precedence for properties from Spring Cloud Config?Spring Cloud Config 中属性的加载优先级是什么? 【发布时间】:2018-12-30 09:09:39 【问题描述】:

Spring 有一个明确的externalized configurations 加载顺序。

    您的主目录上的 Devtools 全局设置属性(当 devtools 处于活动状态时为 ~/.spring-boot-devtools.properties)。 您的测试中的@TestPropertySource 注释。 @SpringBootTest#properties 注释属性添加到您的测试中。 命令行参数。 来自 SPRING_APPLICATION_JSON 的属性(嵌入在环境变量或系统属性中的内联 JSON)。 ServletConfig 初始化参数。 ServletContext 初始化参数。 来自 java:comp/env 的 JNDI 属性。 Java 系统属性 (System.getProperties())。 操作系统环境变量。 仅具有随机属性的 RandomValuePropertySource。*。 打包 jar 之外的特定于配置文件的应用程序属性(应用程序-profile.properties 和 YAML 变体)。 打包在您的 jar 中的特定于配置文件的应用程序属性(application-profile.properties 和 YAML 变体)。 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。 应用程序属性打包在您的 jar 中(application.properties 和 YAML 变体)。 @Configuration 类上的@PropertySource 注释。 默认属性(通过设置 SpringApplication.setDefaultProperties 指定)。

但是,来自Spring Cloud Config 的配置似乎有一个明显的遗漏。有谁知道 Spring Cloud Config 适合上面的位置

【问题讨论】:

【参考方案1】:

正如其他人所说,配置服务器是第一位的。如果您尝试使用本地属性(即application-local.yml)覆盖配置服务器的属性,那么您需要向配置服务器添加两个属性**:

spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true

根据documentation:

由 引导上下文通常是“远程的”(例如来自配置服务器),并且 默认情况下,它们不能在本地被覆盖。如果您想允许您的应用程序覆盖远程 具有自己的系统属性或配置文件的属性, 远程属性源必须通过设置授予它权限 spring.cloud.config.allowOverride=true(设置这个不起作用 本地)。一旦设置了该标志,就会有一些更细粒度的设置 控制与系统相关的远程属性的位置 属性和应用程序的本地配置: spring.cloud.config.overrideNone=true 用任何本地覆盖 财产来源,以及 spring.cloud.config.overrideSystemProperties=false 如果只有系统 属性和环境变量应该覆盖远程设置,但不是 本地配置文件。

另见this,关于使用spring.cloud.config.override-system-properties=false 通过系统/命令行属性覆盖。上面引用的文档有/有不一致之处,我从引用中删除了。

注意,如果您希望远程配置服务器覆盖本地属性文件源,但不覆盖本地系统属性或环境属性,请在配置服务器中添加以下内容:

spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=false
spring.cloud.config.overrideSystemProperties=false

** 在这种情况下,overrideSystemProperties 值将被忽略。见org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration#insertPropertySources

注意:以上所有内容均适用于 Spring Boot 2.3.x。 2.4.x 版使用备用加载优先级。见https://github.com/spring-cloud/spring-cloud-config/issues/1856

【讨论】:

【参考方案2】:

文档指出:

引导属性在 /env 端点中显示为高优先级属性源,如下例所示

所以它是位置#0

【讨论】:

【参考方案3】:

第 12 和 14 点涵盖 Spring Cloud Config。

12. 打包 jar 之外的特定于配置文件的应用程序属性(应用程序-profile.properties 和 YAML 变体)。

14. 打包 jar 之外的应用程序属性(application.properties 和 YAML 变体)。

【讨论】:

以上是关于Spring Cloud Config 中属性的加载优先级是啥?的主要内容,如果未能解决你的问题,请参考以下文章

spring cloud config如何使用本地属性覆盖远程属性

Spring Cloud Config - 从 Git 读取多个属性文件

使用 Spring Cloud Config 进行属性版本控制

微服务不从 spring-cloud-config-server 微服务获取属性

Spring cloud config客户端属性没有得到解决

Spring Boot 应用程序未从 Spring Cloud Config Server 读取属性值