【问题标题】:How to override a property defined in profile-specific application-{profile}.yml for a single application?如何为单个应用程序覆盖特定于配置文件的 application-{profile}.yml 中定义的属性?
【发布时间】:2021-10-20 06:28:20
【问题描述】:

我设置了一个spring-cloud-config 服务器来提供来自 git 存储库的 YML 文件。服务器正在使用 Spring Cloud 2020.0.3。有几个spring-cloud-config 客户端正在使用来自服务器的配置文件。使用配置的客户端应用程序正在使用 Spring Boot 2.4.6 和新的配置解析实现。

配置存储库包含一个application-db.yml 文件和myapp.yml 文件。 application-db.yml 文件有几个公共属性集,所有应用程序都将用于db 配置文件。 myapp.yml 具有特定应用程序的属性。在使用 Spring Boot 2.4.6 之前,我能够在 myapp.yml 中覆盖来自 application-db.yml 的属性。实际上,application-db.yml 属性是各个应用程序可以覆盖的默认值。

例如application-db.yml 可能有(属性键不相关):

spring:
  datasource:
    hikari:
      maximum-pool-size: 5

将大多数应用程序的连接池大小设置为5myapp.yml 可以设置

spring:
  datasource:
    hikari:
      maximum-pool-size: 10

对于10 的一次性连接池大小。

在 Spring Cloud 2020.0.3 (Spring Cloud Config 3.0.4) 和 Spring Boot 2.4.6 中,application-db.yml 中的属性不能在 myapp.yml 中被覆盖,并且连接池大小属性始终具有值5.

我已尝试在application.yml 中设置以下属性,结果仍然相同。

spring:
  cloud:
    config:
      allowOverride: true
      overrideNone: true
      overrideSystemProperties: false

根据Config file processing in Spring Boot 2.4,在配置处理中允许覆盖属性值,但这取决于文档顺序。

Spring Boot 使用 Spring Cloud Config 是否仍支持覆盖行为?如果是这样,它是否取决于云配置服务器提供文档的顺序?有没有办法控制顺序?

编辑说明:我最初在application.yml 文件中发布了关于覆盖属性的信息。经过更多调查,这确实允许覆盖。在诸如application-db.yml 之类的配置文件特定文件中,我无法覆盖值。我开始认为这可能是一个错误。

【问题讨论】:

    标签: spring-boot spring-cloud spring-cloud-config


    【解决方案1】:

    最新版本记录的here 支持您正在寻找的覆盖行为,并且应该是默认行为,无需添加其他属性来启用覆盖。您需要在 spring.application.name 属性中包含应用程序名称,以便配置服务器识别覆盖文件。覆盖文件还需要与您在客户端应用程序中提供的名称相同(在这种情况下,例如,我的配置仓库有文件 application.properties 和 myapp.properties。

    客户端应用程序.properties

    spring.application.name=myapp
    spring.config.import=optional:configserver:http://localhost:8888
    ...
    

    服务器应用程序.properties

    spring.application.name=configserver
    spring.cloud.config.server.git.uri=https://github.com/...
    server.port=8888
    ...
    

    在配置仓库中

    application.properties

    spring:
      datasource:
        hikari:
          maximum-pool-size: 5
    

    myapp.properties

    spring:
      datasource:
        hikari:
          maximum-pool-size: 10
    

    如果客户端应用程序无法从配置服务器应用程序获取覆盖文件(在本例中为 myapp 文件),它将回退到其本地 application.properties 文件。但是,如果您的应用程序需要的所有属性都不存在,那么应用程序可能会失败,因此最好将所有属性从覆盖文件复制到客户端 application.properties 文件以防获取失败。

    如果这不能解决您的问题,我会查看 this 属性覆盖部分。

    【讨论】:

    • 感谢您提供详细解释,经过更多调查后,我发现该问题仅影响配置文件特定的配置文件。我编辑了我的问题以更准确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 2019-03-02
    • 2022-11-03
    • 2019-11-03
    相关资源
    最近更新 更多