来自 Spring Cloud Config 的属性的加载优先级是什么?
What is the loading precedence for properties from Spring Cloud Config?
Spring 具有加载 externalized configurations 的明确顺序。
- 主目录上的 Devtools 全局设置属性(~/.spring-boot-devtools.properties 当 devtools 处于活动状态时)。
- @TestPropertySource 对您的测试进行注释。
- @SpringBootTest#properties 注释属性在您的测试中。
- 命令行参数。
- 来自 SPRING_APPLICATION_JSON 的属性(内联 JSON 嵌入到环境变量或系统 属性 中)。
- ServletConfig 初始化参数。
- ServletContext 初始化参数。
- 来自 java 的 JNDI 属性:comp/env.
- Java 系统属性 (System.getProperties()).
- OS 环境变量。
- 只具有随机属性的 RandomValuePropertySource。*。
- 打包的 jar 文件之外的特定于配置文件的应用程序属性(application-{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 适合上面
文档指出:
The bootstrap properties show up in the /env endpoint as a high-priority property source, as shown in the following example
所以位置#0
第 12 点和第 14 点涵盖了 Spring 云配置。
12.Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).
14.Application properties outside of your packaged jar (application.properties and YAML variants).
正如其他人所说,配置服务器是第一位的。如果您尝试使用本地属性(即 application-local.yml
)覆盖配置服务器的属性,则需要向配置服务器添加两个属性**:
spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true
根据 documentation:
The property sources that are added to you application by the
bootstrap context are often "remote" (e.g. from a Config Server), and
by default they cannot be overridden locally. If you want to allow your applications to override the remote
properties with their own System properties or config files, the
remote property source has to grant it permission by setting
spring.cloud.config.allowOverride=true (it doesn’t work to set this
locally). Once that flag is set there are some finer grained settings
to control the location of the remote properties in relation to System
properties and the application’s local configuration:
spring.cloud.config.overrideNone=true to override with any local
property source, and
spring.cloud.config.overrideSystemProperties=false if only System
properties and env vars should override the remote settings, but not
the local config files.
另见 this,关于使用 spring.cloud.config.override-system-properties=false
通过系统/命令行属性覆盖。上面引用的文档 had/has 不一致,我从引用中删除了。
注意,如果您希望远程配置服务器覆盖本地属性文件源而不是本地系统属性或环境属性,请在配置服务器中添加以下内容:
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
Spring 具有加载 externalized configurations 的明确顺序。
- 主目录上的 Devtools 全局设置属性(~/.spring-boot-devtools.properties 当 devtools 处于活动状态时)。
- @TestPropertySource 对您的测试进行注释。
- @SpringBootTest#properties 注释属性在您的测试中。
- 命令行参数。
- 来自 SPRING_APPLICATION_JSON 的属性(内联 JSON 嵌入到环境变量或系统 属性 中)。
- ServletConfig 初始化参数。
- ServletContext 初始化参数。
- 来自 java 的 JNDI 属性:comp/env.
- Java 系统属性 (System.getProperties()).
- OS 环境变量。
- 只具有随机属性的 RandomValuePropertySource。*。
- 打包的 jar 文件之外的特定于配置文件的应用程序属性(application-{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 适合上面
文档指出:
The bootstrap properties show up in the /env endpoint as a high-priority property source, as shown in the following example
所以位置#0
第 12 点和第 14 点涵盖了 Spring 云配置。
12.Profile-specific application properties outside of your packaged jar (application-{profile}.properties and YAML variants).
14.Application properties outside of your packaged jar (application.properties and YAML variants).
正如其他人所说,配置服务器是第一位的。如果您尝试使用本地属性(即 application-local.yml
)覆盖配置服务器的属性,则需要向配置服务器添加两个属性**:
spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true
根据 documentation:
The property sources that are added to you application by the bootstrap context are often "remote" (e.g. from a Config Server), and by default they cannot be overridden locally. If you want to allow your applications to override the remote properties with their own System properties or config files, the remote property source has to grant it permission by setting spring.cloud.config.allowOverride=true (it doesn’t work to set this locally). Once that flag is set there are some finer grained settings to control the location of the remote properties in relation to System properties and the application’s local configuration: spring.cloud.config.overrideNone=true to override with any local property source, and spring.cloud.config.overrideSystemProperties=false if only System properties and env vars should override the remote settings, but not the local config files.
另见 this,关于使用 spring.cloud.config.override-system-properties=false
通过系统/命令行属性覆盖。上面引用的文档 had/has 不一致,我从引用中删除了。
注意,如果您希望远程配置服务器覆盖本地属性文件源而不是本地系统属性或环境属性,请在配置服务器中添加以下内容:
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