【问题标题】: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 适合上面的位置
【问题讨论】:
标签:
java
spring
spring-boot
spring-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 变体)。