Spring Cloud 配置服务器
Spring Cloud Config Server 提供了一个基于 HTTP 资源的 API,用于外部配置(键值对或等效的 YAML 内容)。通过使用 @EnableConfigServer
注解,该服务器可以嵌入到 Spring Boot 应用程序中。因此,以下应用程序就是一个配置服务器:
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}
与所有 Spring Boot 应用程序一样,它默认在端口 8080 上运行,但你可以通过多种方式将其切换到更常规的端口 8888。最简单的方法是通过使用 spring.config.name=configserver
启动它(Config Server 的 jar 包中有一个 configserver.yml
文件),这还会设置一个默认的配置仓库。另一种方法是使用你自己的 application.properties
,如下例所示:
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
其中 ${user.home}/config-repo
是一个包含 YAML 和 properties 文件的 Git 仓库。
在 Windows 上,如果文件 URL 是带有驱动器前缀的绝对路径(例如,[/${user.home}/config-repo](file:///$%7Buser.home%7D/config-repo)
),则需要在文件 URL 中额外添加一个 "/"。
以下列表展示了在前面示例中创建 git 仓库的步骤:
$ cd $HOME
$ mkdir config-repo
$ cd config-repo
$ git init .
$ echo info.foo: bar > application.properties
$ git add -A .
$ git commit -m "Add application.properties"
将本地文件系统用于 Git 仓库仅适用于测试环境。在生产环境中,您应该使用服务器来托管配置仓库。
如果您的配置仓库中只保留文本文件,初始克隆可以快速高效。如果您存储了二进制文件,尤其是大文件,可能会在首次请求配置时遇到延迟,或在服务器中遇到内存不足的错误。
章节总结
🗃️ 环境仓库
21 个项目
📄️ 健康指标
Config Server 自带一个健康指示器(Health Indicator),用于检查配置的 EnvironmentRepository 是否正常工作。默认情况下,它会向 EnvironmentRepository 请求一个名为 app 的应用程序、默认配置文件以及 EnvironmentRepository 实现提供的默认标签。
📄️ 安全
你可以以任何你认为合适的方式保护你的配置服务器(从物理网络安全到 OAuth2 承载令牌),因为 Spring Security 和 Spring Boot 提供了对多种安全安排的支持。
📄️ 执行器与安全
📄️ 加密与解密
如果远程属性源包含加密内容(以 {cipher} 开头的值),它们会在通过 HTTP 发送给客户端之前被解密。这种设置的主要优势在于,属性值在“静止状态”时(例如,在 git 仓库中)不需要以明文形式存在。如果某个值无法解密,它将被从属性源中移除,并添加一个具有相同键但前缀为 invalid 的属性,其值表示“不适用”(通常为 \<n/a>)。这主要是为了防止密文被用作密码并意外泄露。
📄️ 密钥管理
Config Server 可以使用对称密钥(共享密钥)或非对称密钥(RSA 密钥对)。在安全性方面,非对称密钥的选择更为优越,但使用对称密钥通常更为方便,因为它只需要在 application.properties 中配置一个属性值。
📄️ 创建用于测试的密钥库
要创建一个用于测试的密钥库,你可以使用类似于以下的命令:
📄️ 使用多个密钥和密钥轮换
除了加密属性值中的 {cipher} 前缀外,Config Server 还会在(Base64 编码的)密文开始之前查找零个或多个 {name:value} 前缀。这些密钥会被传递给 TextEncryptorLocator,它可以执行任何逻辑来为密文定位 TextEncryptor。如果你配置了密钥库(encrypt.keystore.location),默认的定位器会查找由密钥前缀提供的别名的密钥,密文可能类似于以下形式:
📄️ 提供加密属性
有时你希望客户端在本地解密配置,而不是在服务器上进行解密。在这种情况下,如果你提供了 encrypt.* 配置来定位密钥,你仍然可以使用 /encrypt 和 /decrypt 端点,但你需要通过在 bootstrap.\[yml|properties] 中设置 spring.cloud.config.server.encrypt.enabled=false 来显式关闭对传出属性的解密。如果你不关心这些端点,那么如果你既不配置密钥也不配置启用标志,它应该也能正常工作。
📄️ 提供替代格式
从环境端点返回的默认 JSON 格式非常适合 Spring 应用程序使用,因为它直接映射到 Environment 抽象。如果你愿意,可以通过在资源路径后添加后缀(.yml、.yaml 或 .properties)来使用相同的数据作为 YAML 或 Java 属性文件。这对于那些不关心 JSON 端点结构或它们提供的额外元数据的应用程序(例如,未使用 Spring 的应用程序可能会从这种方法的简单性中受益)来说非常有用。
📄️ 提供纯文本服务
除了使用 Environment 抽象(或以 YAML 或 properties 格式表示的替代形式)之外,您的应用程序可能需要针对其环境定制的通用纯文本配置文件。Config Server 通过一个额外的端点 /{application}/{profile}/{label}/{path} 提供这些文件,其中 application、profile 和 label 的含义与常规环境端点相同,但 path 是文件名的路径(例如 log.xml)。此端点的源文件定位方式与环境端点相同。对于 properties 和 YAML 文件,使用相同的搜索路径。然而,与聚合所有匹配资源不同,仅返回第一个匹配的资源。
📄️ 提供二进制文件服务
为了从配置服务器提供二进制文件,你需要发送一个 Accept 头,其值为 application/octet-stream。
📄️ 嵌入配置服务器
配置服务器作为独立应用程序运行时效果最佳。然而,如果需要,您可以将其嵌入到另一个应用程序中。为此,请使用 @EnableConfigServer 注解。在这种情况下,一个名为 spring.cloud.config.server.bootstrap 的可选属性可能会很有用。它是一个标志,用于指示服务器是否应从其自己的远程仓库进行配置。默认情况下,该标志是关闭的,因为它可能会延迟启动。然而,当嵌入到另一个应用程序中时,以与其他应用程序相同的方式进行初始化是有意义的。当将 spring.cloud.config.server.bootstrap 设置为 true 时,您还必须使用复合环境仓库配置。例如
📄️ 推送通知与 Spring Cloud Bus
许多源代码仓库提供商(如 Github、Gitlab、Gitea、Gitee、Gogs 或 Bitbucket)通过 webhook 通知你仓库中的更改。你可以通过提供商用户界面配置 webhook,设置一个 URL 和一组你感兴趣的事件。例如,Github 使用 POST 请求向 webhook 发送一个包含提交列表的 JSON 主体,并设置一个头部(X-Github-Event)为 push。如果你添加了对 spring-cloud-config-monitor 库的依赖,并在 Config Server 中激活了 Spring Cloud Bus,那么 /monitor 端点将被启用。
📄️ AOT 和原生镜像支持
自 4.0.0 版本起,Spring Cloud Config Server 支持 Spring AOT 转换。从 4.1.0 版本开始,它还支持 GraalVM 原生镜像,前提是使用 GraalVM 21 或更高版本,但需要用户针对已知的 GraalVM 问题添加一些解决方法,如下所述。