如何从 Spring 云配置服务器读取多个配置文件

How to read multiple config file from Spring Cloud Config Server

Spring 云配置服务器支持读取名称为 ${spring.application.name}.properties 的 属性 个文件。但是我的应用程序中有 2 个属性文件。

a.properties
b.properties

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

在 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

请注意,所提供的答案假定您的 属性 文件 处理不同的执行配置文件 。如果他们不这样做,即您的属性由于某些其他原因被分成不同的文件,例如,维护目的,除以 business/functional 域,或任何其他适合您需要的原因,然后,通过为每个这样的定义一个配置文件文件,您只是 "abusing" 配置文件功能,以实现您的目标(每个应用多个 属性 文件)。

然后你可以问 "OK, so what is the problem with that?"。问题是你限制了自己的各种可能性,否则你就会有。如果您真的想通过配置文件自定义您的应用程序配置,您将不得不为此创建伪、子配置文件,因为文件名已经是一个配置文件。示例:

您的应用程序配置可以通过您在 springboot 应用程序中使用的不同配置文件进行自定义(例如在@Profile() 注释中),让它们成为 devuatprod。您可以启动您的应用程序,将不同的配置文件设置为活动的,例如'dev' vs 'uat',得到你想要的属性组。对于您的 a.properties b.properties 和 c.properties 文件,如果支持不同的文件名,您将有一个-dev.properties b-dev.properties 和 c-dev.properties 文件与 a-uat[=55= .properties b-uat.properties 和 c-uat.properties 文件用于 'dev' 和 'uat' 配置文件。

然而,使用提供的解决方案,您已经为每个文件定义了 3 个配置文件:appname-a.properties appname-b.properties,和 appname- c.properties:abc。现在想象一下,您必须为每个...创建一个不同的配置文件(!它已经表明这里出了问题)!你最终会得到 很多配置文件排列(随着文件的增加会变得更糟):文件将是 appname-a-dev。属性,appname-b-dev.properties,app-c-dev.properties 与 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() 注释?您是否会因为要添加一两个不同的 属性 文件而将代码 space 与 "artificial" 配置文件混在一起?定义 devuat 配置文件(如果适用)并在其他地方定义适用的 属性 文件名(然后可以由配置文件进一步支持,无需任何其他配置操作),就像在 externalized properties configuration for individual springboot apps

中发生的那样

为了论证的完整性,我将在这里补充一点,如果有一天你想切换到 .yml 属性 文件,使用提供的基于配置文件的命名解决方案,您还失去了在同一个 .yml 文件中定义不同 "yaml document sections per profile" 的能力(是的,在 .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。我希望它得到审查和接受。

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

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

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 因为我不想在外部发布这些内容 overridden/refreshed 但如果你愿意,你可以这样做。

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 存储库中捕获和 return 匹配文件。该配置文件还将应用并相应地获取正确的 属性 文件。价值的优先顺序也被保留。

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

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

无需再 add/modify 或稍后重新启动配置服务器。对于新申请,在application.yml的repos下添加一个条目就像一次性注册一样。

希望它能以某种方式提供帮助!

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

spring.application.name=a,b