环境仓库
你应该在哪里存储 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 后端,这对于管理升级和物理环境以及审计更改非常方便。要更改存储库的位置,你可以在配置服务器中设置 spring.cloud.config.server.git.uri 配置属性(例如在 application.yml 中)。如果你使用 file: 前缀设置它,它应该可以从本地存储库工作,这样你就可以快速轻松地开始,而无需服务器。然而,在这种情况下,服务器直接操作本地存储库而不克隆它(即使它不是裸存储库也没关系,因为配置服务器永远不会对“远程”存储库进行更改)。为了扩展配置服务器并使其高度可用,你需要让服务器的所有实例指向同一个存储库,因此只有共享文件系统才能工作。即使在这种情况下,最好使用 ssh: 协议来处理共享文件系统存储库,以便服务器可以克隆它并使用本地工作副本作为缓存。
📄️ 版本控制后端文件系统使用
📄️ 文件系统后端
在 Config Server 中还有一个“native”配置文件,它不使用 Git,而是从本地类路径或文件系统(你可以通过 spring.cloud.config.server.native.searchLocations 指向任何静态 URL)加载配置文件。要使用 native 配置文件,请使用 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 参数存储
在使用 AWS Parameter Store 作为后端时,您可以通过将属性放置在 /application 层次结构中来与所有应用程序共享配置。
📄️ JDBC 后端
Spring Cloud Config Server 支持 JDBC(关系型数据库)作为配置属性的后端存储。你可以通过将 spring-boot-starter-data-jdbc 添加到类路径中并启用 jdbc 配置文件,或者通过添加一个类型为 JdbcEnvironmentRepository 的 Bean 来启用此功能。如果在类路径中包含正确的依赖项(更多详细信息请参阅用户指南),Spring Boot 将自动配置数据源。
📄️ Redis 后端
Spring Cloud Config Server 支持将 Redis 作为配置属性的后端。你可以通过添加 Spring Data Redis 的依赖来启用此功能。
📄️ AWS S3 后端
Spring Cloud Config Server 支持将 AWS S3 作为配置属性的后端存储。你可以通过添加 AWS Java SDK For Amazon S3 的依赖来启用此功能。
📄️ AWS 参数存储后端
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 具有一个“overrides”功能,允许操作员为所有应用程序提供配置属性。被覆盖的属性无法通过常规的 Spring Boot 钩子被应用程序意外更改。要声明覆盖,请将名称-值对的映射添加到 spring.cloud.config.server.overrides 中,如下例所示:
📄️ 使用 Bootstrap 覆盖属性
如果启用了配置优先引导(config first bootstrap),你可以通过将两个属性放置在应用程序的配置中(这些配置位于配置服务器使用的外部环境存储库中,例如 Git、Vault、SVN 等),让客户端设置覆盖配置服务器中的配置。
📄️ 使用占位符覆盖属性
在不首先启用配置的情况下覆盖属性的更简洁方法是使用来自配置服务器的配置中的属性占位符。
📄️ 使用配置文件覆盖属性
覆盖来自配置服务器的属性的最终方法是在客户端应用程序中的特定配置文件内指定它们。