Spring cloud配置服务器支持读取名为${spring.application.name}.properties
的属性文件。但是我的应用程序中有2个属性文件。
a.properties
b.properties
我可以让配置服务器读取这两个属性文件吗?
答案 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
),我们只需要这样做:
spring.cloud.config.name=...,appxyz-circuit-breaker
以后无需添加/修改更多内容或重新启动配置服务器。对于新应用程序,这就像一次性注册一样,是在application.yml的repos
下添加一个条目。
希望它能以一种或多种方式提供帮助!
答案 3 :(得分:1)
在应用程序 bootstrap.properties 中,您必须指定如下所示:
spring.application.name=a,b