如何从 Spring Cloud Config Server 读取多个配置文件

Posted

技术标签:

【中文标题】如何从 Spring Cloud Config Server 读取多个配置文件【英文标题】:How to read multiple config file from Spring Cloud Config Server 【发布时间】:2017-10-12 20:32:55 【问题描述】:

Spring cloud config server 支持读取名称为$spring.application.name.properties的属性文件。但是我的应用程序中有 2 个属性文件。

a.properties
b.properties

我可以让配置服务器读取这两个属性文件吗?

【问题讨论】:

【参考方案1】:

重命名您的配置服务器正在查看的 git 或文件系统中的属性文件。

a.properties -> <your_application_name>.properties
a.properties -> <your_application_name>-<profile-name>.properties

例如,如果您的应用程序名称是 test,并且您在 dev 配置文件上运行您的应用程序,则以下两个属性将一起使用。

test.properties
test-dev.properties

您还可以在配置客户端的bootstrap.properties 中指定其他配置文件,以检索更多属性文件,如下所示。例如,

spring:
  profiles: dev
  cloud:
    config:
      uri: http://yourconfigserver.com:8888
      profile: dev,dev-db,dev-mq

如果你像上面那样指定,下面的所有文件将一起使用。

test.properties
test-dev.properties
test-dev-db.prpoerties
test-dev-mq.properties

【讨论】:

你也可以spring.application.name=a,b 如果您有多个服务并且想要共享相同的通用属性文件怎么办? (jdbc.properties、server.properties 等)【参考方案2】:

请注意,提供的答案假定您的属性文件处理不同的执行配置文件。如果他们不这样做,即您的属性由于某些其他原因被拆分为不同的文件,例如,维护目的,按业务/功能域划分,或任何其他适合您需要的原因,那么,通过为每个此类文件定义一个配置文件,您只是在“滥用”配置文件功能,以实现您的目标(每个应用程序有多个属性文件)。

然后你可以问“好的,那有什么问题?”。问题是你限制了你自己可能拥有的各种可能性。如果您确实想通过配置文件自定义应用程序配置,则必须为此创建伪子配置文件,因为文件名已经是配置文件。示例:

您的应用程序配置可以由您在springboot应用程序中使用的不同配置文件自定义(例如在@Profile()注释中),让它们成为devuat产品。您可以启动您的应用程序,将不同的配置文件设置为活动状态,例如'dev' vs 'uat',得到你想要的属性组。对于您的 a.properties b.properties 和 c.properties 文件,如果支持不同的文件名,您将拥有 a-dev.properties b-dev.properties 和 c-dev.properties 文件与 a-uat.properties b-uat.properties 和 c- uat.properties 文件,用于“dev”和“uat”配置文件。

尽管如此,使用提供的解决方案,您已经为每个文件定义了 3 个配置文件:appname-a.properties appname-b.properties 和 appname-c.properties:a、bc。现在想象一下,您必须为每个...配置文件创建不同的配置文件(!它已经表明这里出了问题)!您最终会得到很多配置文件排列(随着文件的增加,情况会变得更糟):文件将是 appname-a-dev.properties, appname-b-dev.properties, app-c-dev.properties vs appname-a-uat.properties, appname-b-uat.properties, app-c-uat.properties,但配置文件会从 ['dev', 'uat'] 增加到 ['a-dev', 'b-dev '、'c-dev'、'a-uat'、'b-uat'、'c-uat']!!!

更糟糕的是,您将如何处理代码中的所有这些配置文件,尤其是您的 @Profile() 注释?您是否会因为想要添加一两个更多不同的属性文件而将代码空间与“人工”配置文件混为一谈?在适用的情况下定义您的 devuat 配置文件就足够了,并在其他地方定义适用的属性文件名(然后可以由配置文件进一步支持,无需任何其他配置操作),就像它发生在 externalized properties configuration for individual springboot apps

为了参数的完整性,我只是在这里补充一点,如果你想有一天切换到 .yml 属性文件,使用提供的基于配置文件的命名解决方案,你也失去了定义不同的能力同一 .yml 文件中的“每个配置文件的 yaml 文档部分”(是的,在 .yml 中,您可以拥有一个属性文件,但可以在其中定义多个逻辑 yml 文档,这通常用于自定义不同配置文件的属性,同时具有所有相关属性在一个地方)。你失去了这个能力,因为你已经在文件名(appname-profile.yml)中使用了配置文件

我已经发布了一个pull request with a minor fix for spring-cloud-config-server 1.4.x,它允许通过提供一个 spring.cloud.congif.server.searchNames 环境属性 - 类似于 springboot 应用程序的 spring.config.name。我希望它得到审查和接受。

【讨论】:

【参考方案3】:

我最近遇到了同样的要求,但有一些限制,即我不能在环境配置文件中玩耍。所以我不被允许作为公认的答案。我正在分享我是如何做到的,以替代可能与我有相同情况的人。

在我的应用程序中,我有如下属性:

appxyz-data-soures.properties
appxyz-data-soures-staging.properties
appxyz-data-soures-production.properties
appxyz-interfaces.properties
appxyz-interfaces-staging.properties
appxyz-interfaces-production.properties
appxyz-feature.properties
appxyz-feature-staging.properties
appxyz-feature-production.properties

application.properties // for my use, contains local properties only
bootstrap.properties // for my use, contains management properties only

在我的应用程序中,我设置了这些特定的属性,可以让我实现所需的功能。但请注意,我还有其他所需的配置(启用云配置、执行器刷新、eureka 服务发现等) - 只是突出显示这些以强调:

spring.application.name=appxyz
spring.cloud.config.name=appxyz-data-soures,appxyz-interfaces,appxyz-feature

您可以观察到,我不想在我的应用程序名称周围玩耍,而是使用它作为我的配置属性文件的前缀。

在我的配置服务器中,我在 application.yml 中配置了捕获pattern: 'appxyz-*'

spring:
  cloud:
    config:
      server:
        git:
          uri: <git repo default>
          repos:
            appxyz:
              pattern: 'appxyz-*'
              uri: <another git repo if you have 1 repo per app>
              private-key: $git.appxyz.pk
          strict-host-key-checking: false
          ignore-local-ssh-settings: true
          private-key: $git.default.pk

在我的 Git 存储库中,我有以下内容。没有 application.properties 和 bootstrap,因为我不希望它们在外部被发布和覆盖/刷新,但如果你愿意,你可以这样做。

appxyz-data-soures.properties
appxyz-data-soures-staging.properties
appxyz-data-soures-production.properties
appxyz-interfaces.properties
appxyz-interfaces-staging.properties
appxyz-interfaces-production.properties
appxyz-feature.properties
appxyz-feature-staging.properties
appxyz-feature-production.properties

它将是匹配pattern: 'appxyz-*' 的模式,它将从我的 git 存储库中捕获并返回匹配的文件。配置文件也将相应地应用并获取正确的属性文件。价值的优先顺序也得以保留。

此外,如果您希望在您的应用程序中添加更多文件(例如appxyz-circuit-breaker.properties),我们只需要这样做:

    spring.cloud.config.name=...,appxyz-circuit-breaker 中添加名称模式 在本地和外部添加文件的副本(在 git 存储库中。

以后无需添加/修改更多或重新启动配置服务器。对于新的应用程序,在application.yml的repos下添加一个条目就像一次性注册一样。

希望它以某种方式有所帮助!

【讨论】:

【参考方案4】:

在您的应用程序 bootstrap.properties 中,您必须指定如下:

spring.application.name=a,b

【讨论】:

以上是关于如何从 Spring Cloud Config Server 读取多个配置文件的主要内容,如果未能解决你的问题,请参考以下文章

如何要求 Spring Cloud Config 服务器从特定分支签出配置?

Spring Boot + Spring Cloud Config - 如何从 Git 外部配置添加更多配置文件

Spring Cloud Config 配置中心 自动加解密功能

无法通过 spring.cloud.config.enabled:false 禁用 Spring Cloud Config

spring cloud config

spring cloud config客户端未从配置服务器加载配置