Composite Environment Repositories

在某些场景中,你可能希望从多个环境存储库中提取配置数据。若要执行此操作,你可以在配置服务器的应用程序属性或 YAML 文件中启用 composite 配置文件。例如,如果你要从 Subversion 存储库和两个 Git 存储库中提取配置数据,可以为配置服务器设置以下属性:

spring:
  profiles:
    active: composite
  cloud:
    config:
      server:
        composite:
        -
          type: svn
          uri: file:///path/to/svn/repo
        -
          type: git
          uri: file:///path/to/rex/git/repo
        -
          type: git
          uri: file:///path/to/walter/git/repo

使用此配置时,优先顺序由在 composite 密钥下列出的存储库顺序决定。在上述示例中,Subversion 存储库首先列出,因此在 Subversion 存储库中找到的值将覆盖在其中一个 Git 存储库中针对同一属性找到的值。在 rex Git 存储库中发现的值将优先于在 walter Git 存储库中针对同一属性找到的值。 如果你只想从每种不同类型的一个存储库中提取配置数据,你可以启用相应的配置文件(而不是 composite 配置文件),在配置服务器的应用程序属性或 YAML 文件中。例如,如果你要从一个 Git 存储库和一个 HashiCorp Vault 服务器中提取配置数据,可以为配置服务器设置以下属性:

spring:
  profiles:
    active: git, vault
  cloud:
    config:
      server:
        git:
          uri: file:///path/to/git/repo
          order: 2
        vault:
          host: 127.0.0.1
          port: 8200
          order: 1

使用此配置时,优先顺序可以通过 order 属性决定。你可以使用 order 属性来指定所有存储库的优先顺序。order 属性的数值越低,其优先顺序越高。存储库的优先顺序有助于解决包含相同属性值的存储库之间的任何潜在冲突。

如果您的复合环境包含之前的示例中的 Vault 服务器,则您必须在对配置服务器发出的每个请求中包含 Vault 令牌。请参阅 Vault Backend

从环境存储库检索值时出现的任何类型的故障都会导致整个复合环境出现故障。如果您希望复合环境即使在某个存储库出现故障时也能继续运行,则可以将 spring.cloud.config.server.failOnCompositeError 设置为 false

使用复合环境时,所有存储库都包含相同标签非常重要。如果您拥有与上述示例中类似的环境,并且请求带有 master 标签的配置数据,但 Subversion 存储库不包含名为 master 的分支,整个请求都将失败。

Custom Composite Environment Repositories

除了使用 Spring Cloud 中的一个环境存储库之外,你还可以提供自己的 EnvironmentRepository bean,以包含在复合环境中。若要执行此操作,你的 bean 必须实现 EnvironmentRepository 接口。如果你想在复合环境中控制自定义 EnvironmentRepository 的优先顺序,你还可以实现 Ordered 接口并覆盖 getOrdered 方法。如果你没有实现 Ordered 接口,你的 EnvironmentRepository 将具有最低优先顺序。