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

时间:2017-05-13 17:34:30

标签: spring-cloud spring-cloud-config

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

a.properties
b.properties

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

4 个答案:

答案 0 :(得分:8)

在配置服务器正在查看的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

答案 1 :(得分:2)

请注意,提供的答案假设您的属性文件使用不同的执行配置文件。如果不这样做,即由于某种其他原因(例如出于维护目的,按业务/功能域划分的原因)或满足您需求的任何其他原因将您的属性拆分为不同的文件,则通过为每个此类文件定义一个配置文件,您只是“滥用”配置文件功能,以实现您的目标(每个应用有多个属性文件)。

然后您可以问“好的,那是什么问题?”。问题是您要限制自己免受其他各种可能性的困扰。如果您实际上想通过配置文件自定义应用程序配置,则必须为此创建伪子配置文件,因为文件名已经是一个配置文件。示例:

您的应用程序配置可以通过不同的配置文件进行自定义,您可以在springboot应用程序内部使用这些配置文件(例如,在@Profile()批注中),将其设置为 dev uat 产品。您可以启动您的应用程序,将其他配置文件设置为活动状态,例如'dev'vs'uat',并获得所需的属性组。对于您的a.properties b.properties和c.properties文件,如果支持不同的文件名,您将拥有a- dev .properties b- dev < /em>.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 < / em>, b c 。现在,假设您必须为每个...配置文件创建一个不同的配置文件(!它已经显示这里出了问题)!您最终会得到许多配置文件排列(随着文件的增加,情况会变得更糟):文件将是appname- a-dev .properties,appname- b-dev .properties,app- c-dev .properties与appname- a-uat .properties,appname- b-uat < /em>.properties,app-c-uat.properties,但配置文件将从['dev','uat']增加到['a-dev','b-dev ','c-dev','a-uat','b-uat','c-uat'] !!!

更糟糕的是,您将如何处理代码中的所有这些配置文件,更具体地说是@Profile()注释?您是否仅由于要添加一个或两个以上不同的属性文件,而使带有“人工”配置文件的代码空间混乱?在适用的情况下定义您的 dev uat 配置文件,并在其他位置定义适用的属性文件名(配置文件可以进一步支持它们,而无需添加其他文件)就足够了任何其他配置操作),就像在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,它允许通过提供<来定义其他受支持的文件名(来自“ application [-profile]”和“ {{appname} [-profile]”的应用,目前受支持)。 em> spring.cloud.congif.server.searchNames 环境属性-类似于springboot应用程序的 spring.config.name 。我希望它能得到审查和接受。

答案 2 :(得分:1)

我最近遇到了相同的要求,但有更多的限制,即不允许我在环境配置文件中玩耍。所以不允许我做被接受的答案。我与其他可能与我有同样情况的人分享我的做法。

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

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),我们只需要这样做:

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

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

希望它能以一种或多种方式提供帮助!

答案 3 :(得分:1)

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

spring.application.name=a,b