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 微服务获取属性