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

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

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

        【讨论】:

          猜你喜欢
          • 2016-10-24
          • 2016-09-15
          • 2018-08-01
          • 1970-01-01
          • 2016-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多