环境仓库
Config Server 的配置数据应存储在哪里?控制此行为的策略是 EnvironmentRepository,它提供 Environment 对象。这个 Environment 是 Spring Environment 领域的一个浅拷贝(主要特性包括 propertySources)。Environment 资源由三个变量参数化:
-
{application},对应客户端的spring.application.name。 -
{profile},对应客户端的spring.profiles.active(以逗号分隔的列表)。 -
{label},是服务器端用于标记一组“版本化”配置文件的标签。
仓库实现通常表现得像一个Spring Boot应用,从spring.config.name等于{application}参数,以及spring.profiles.active等于{profiles}参数的配置文件中加载配置。配置文件的优先级规则也与常规Spring Boot应用相同:激活的配置文件优先于默认配置,并且,如果存在多个配置文件,最后一个生效(类似于向Map中添加条目)。
以下示例客户端应用程序具有以下引导配置:
spring:
application:
name: foo
profiles:
active: dev,mysql
(与Spring Boot应用程序一样,这些属性也可以通过环境变量或命令行参数来设置)。
如果仓库是基于文件的,服务器会从 application.yml(在所有客户端之间共享)和 foo.yml(其中 foo.yml 具有优先权)创建一个 Environment。如果 YAML 文件内部包含指向 Spring 配置文件的文档,这些文档将按更高的优先级应用(按照配置文件中列出的顺序)。如果有特定于配置文件的 YAML(或属性)文件,这些文件也比默认文件具有更高的优先级。更高的优先级意味着 PropertySource 在 Environment 中列出的位置更靠前。(这些相同的规则适用于独立的 Spring Boot 应用程序。)
你可以将 spring.cloud.config.server.accept-empty 设置为 false,这样当应用未找到时,服务器将返回 HTTP 404 状态码。默认情况下,该标志设置为 true。
你不能将 spring.main.* 属性放置在远程 EnvironmentRepository 中。这些属性是作为应用程序初始化的一部分来使用的。
章节总结
Git 后端
EnvironmentRepository 的默认实现使用 Git 后端,这对于管理升级、物理环境以及审计变更非常方便。要更改存储库的位置,你可以在 Config Server 中设置 spring.cloud.config.server.git.uri 配置属性(例如在 application.yml 中)。如果使用 file: 前缀进行设置,它应该能够从本地存储库工作,这样你就可以快速轻松地开始,无需服务器。然而,在这种情况下,服务器直接操作本地存储库而无需克隆它(即使它不是裸存储库也没关系,因为 Config Server 永远不会对“远程”存储库进行更改)。为了扩展 Config Server 并使其高可用,你需要让服务器的所有实例都指向同一个存储库,因此只有共享文件系统才能工作。即使在这种情况下,对于共享文件系统存储库,最好使用 ssh: 协议,这样服务器可以克隆它并使用本地工作副本作为缓存。
版本控制后端文件系统使用
如果向配置服务器发出请求,并且该请求包含多个标签,配置服务器将为每个标签返回属性源。然而,如果尝试获取其中一个标签时出现错误,配置服务器将返回错误,而不会尝试任何剩余的标签。
文件系统后端
Config Server 中还有一个“原生”配置文件,它不使用 Git,而是从本地类路径或文件系统(您希望通过 spring.cloud.config.server.native.searchLocations 指向的任何静态 URL)加载配置文件。要使用原生配置文件,请使用 spring.profiles.active=native 启动 Config Server。
Vault 后端
Spring Cloud Config Server 也支持将 Vault 作为后端。
通过代理访问后端
配置服务器可以通过 HTTP 或 HTTPS 代理访问 Git 或 Vault 后端。此行为通过 proxy.http 和 proxy.https 下的设置分别控制 Git 或 Vault 的代理行为。这些设置是针对每个仓库的,因此如果您使用的是复合环境仓库,则必须单独为复合仓库中的每个后端配置代理设置。如果网络要求为 HTTP 和 HTTPS URL 使用不同的代理服务器,您可以为单个后端同时配置 HTTP 和 HTTPS 代理设置:在这种情况下,HTTP 访问将使用 HTTP 代理,HTTPS 访问将使用 HTTPS 代理。此外,您还可以指定一个单独的代理,该代理将用于应用程序和代理之间使用代理定义协议的所有协议。
在所有应用程序间共享配置
所有应用程序之间的配置共享方式因您采用的方法而异,具体如下:
AWS Secrets Manager
当使用 AWS Secrets Manager 作为后端时,您可以通过将配置放置在 /application/ 下,或者将其放置在应用程序的默认配置文件中,来与所有应用程序共享配置。例如,如果您添加了具有以下键名的密钥,所有使用配置服务器的应用程序都将能够访问共享属性 shared.foo 和 shared.bar:
AWS Parameter Store
当使用AWS Parameter Store作为后端时,您可以通过将属性放置在/application层次结构中,与所有应用程序共享配置。
JDBC 后端
Spring Cloud Config Server 支持将 JDBC(关系型数据库)作为配置属性的后端存储。您可以通过在类路径中添加 spring-boot-starter-data-jdbc 并使用 jdbc 配置文件,或者通过添加一个 JdbcEnvironmentRepository 类型的 Bean 来启用此功能。如果在类路径中包含正确的依赖项(有关详细信息,请参阅用户指南),Spring Boot 将自动配置数据源。
Redis Backend
Spring Cloud Config Server 支持将 Redis 作为配置属性的后端存储。您可以通过添加 Spring Data Redis 依赖来启用此功能。
AWS S3 后端
Spring Cloud Config Server 支持将 AWS S3 作为配置属性的后端存储。您可以通过添加对 AWS Java SDK For Amazon S3 的依赖来启用此功能。
AWS Parameter Store 后端
Spring Cloud Config Server 支持将 AWS Parameter Store 作为配置属性的后端。您可以通过添加 AWS Java SDK for SSM 的依赖来启用此功能。
AWS Secrets Manager 后端
Spring Cloud Config Server 支持将 AWS Secrets Manager 作为配置属性的后端。您可以通过添加 AWS Java SDK for Secrets Manager 的依赖来启用此功能。
CredHub 后端
Spring Cloud Config Server 支持将 CredHub 作为配置属性的后端存储。您可以通过添加 Spring CredHub 依赖项来启用此功能。
MongoDB 后端
Spring Cloud Config Server 支持将 MongoDB 作为配置属性的后端存储。您可以通过在类路径中添加 spring-boot-starter-data-mongodb 并使用 mongodb 配置文件来启用此功能。
复合环境仓库
在某些场景下,你可能希望从多个环境仓库中拉取配置数据。为此,你可以在配置服务器的应用程序属性或 YAML 文件中启用复合配置文件。例如,如果你希望从 Subversion 仓库以及两个 Git 仓库中拉取配置数据,可以为你的配置服务器设置以下属性:
自定义环境仓库
Spring Cloud Config 支持通过创建和集成自定义的 EnvironmentRepository 实现来增强其配置管理功能。这允许您为应用程序添加独特的配置源。通过实现 Ordered 接口并指定 getOrder 方法,您还可以在复合配置设置中设置自定义存储库的优先级。如果不这样做,自定义存储库默认会被视为具有最低优先级。
属性覆盖
Config Server 具有“覆盖”功能,允许操作员为所有应用程序提供配置属性。被覆盖的属性无法通过常规的 Spring Boot 钩子被应用程序意外更改。要声明覆盖,请向 spring.cloud.config.server.overrides 添加一个名称-值对映射,如下例所示:
使用 Bootstrap 覆盖属性
如果启用配置优先引导,您可以通过在应用程序配置中放置两个属性来让客户端设置覆盖配置服务器中的配置,这些属性位于配置服务器使用的外部环境存储库(例如 Git、Vault、SVN 等)中。
使用占位符覆盖属性
在不首先启用配置引导的情况下覆盖属性的更简洁方法是使用来自配置服务器的配置中的属性占位符。
使用配置文件覆盖属性
覆盖配置服务器属性的最终方法是在客户端应用程序的特定配置文件中指定它们。