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

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

a.properties
b.properties

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

【问题讨论】:

    标签: spring-cloud spring-cloud-config


    【解决方案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),我们只需要这样做:

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

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

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

      【讨论】:

        【解决方案4】:

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

        spring.application.name=a,b
        

        【讨论】:

          猜你喜欢
          • 2019-09-06
          • 2020-04-22
          • 2021-01-09
          • 2018-03-22
          • 1970-01-01
          • 2015-08-25
          • 2017-01-06
          • 2016-07-29
          • 2016-02-27
          相关资源
          最近更新 更多