Spring Cloud 配置服务器
Spring Cloud Config Server 为外部配置(名称-值对或等效的 YAML 内容)提供了基于 HTTP 资源的 API。
服务器可嵌入到 Spring Boot 应用程序中,方法是使用@EnableConfigServer
注解。
因此,以下应用程序是配置服务器:
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}
与所有 Spring Boot 应用程序一样,它默认在端口 8080 上运行,但您可以通过各种方式将其切换到更传统的端口 8888。
最简单的方法(也设置了默认配置存储库)是使用spring.config.name=configserver
(有一个configserver.yml
在 Config Server jar 中)。
另一种是使用你自己的application.properties
,如以下示例所示:
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
哪里${user.home}/config-repo
是包含 YAML 和属性文件的 git 存储库。
在 Windows 上,如果文件 URL 是带有驱动器前缀的绝对 “/” (例如file:///${user.home}/config-repo ). |
以下清单显示了在前面的示例中创建 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 存储库仅用于测试。 您应该使用 服务器在生产环境中托管配置存储库。 |
如果您只在配置存储库中保留文本文件,则配置存储库的初始克隆可以快速高效。 如果存储二进制文件,尤其是大型文件,则可能会在第一次配置请求时遇到延迟,或者在服务器中遇到内存不足错误。 |
环境存储库
您应该将 Config Server 的配置数据存储在哪里?
控制此行为的策略是EnvironmentRepository
服务Environment
对象。
这Environment
是 Spring 中域的浅层副本Environment
(包括propertySources
作为主要功能)。
这Environment
资源由三个变量参数化:
-
{application}
,该 Map 到spring.application.name
在客户端。 -
{profile}
,该 Map 到spring.profiles.active
在客户端上(逗号分隔的列表)。 -
{label}
,这是一个服务器端功能,用于标记一组“版本化”的配置文件。
存储库实现通常行为类似于 Spring Boot 应用程序,从spring.config.name
等于{application}
parameter 和spring.profiles.active
等于{profiles}
参数。
配置文件的优先规则也与常规 Spring Boot 应用程序中的优先级规则相同:活动配置文件优先于默认值,并且如果有多个配置文件,则最后一个配置文件获胜(类似于向Map
).
以下示例客户端应用程序具有此引导程序配置:
spring:
application:
name: foo
profiles:
active: dev,mysql
(与 Spring Boot 应用程序一样,这些属性也可以通过环境变量或命令行参数设置)。
如果存储库是基于文件的,则服务器会创建一个Environment
从application.yml
(在所有客户端之间共享)和foo.yml
(使用foo.yml
优先)。
如果 YAML 文件中包含指向 Spring 配置文件的文档,则这些文档将以更高的优先级应用(按列出的配置文件的顺序)。
如果存在特定于配置文件的 YAML(或属性)文件,则这些文件的优先级也高于默认值。
更高的优先级转换为PropertySource
在Environment
.
(这些相同的规则适用于独立的 Spring Boot 应用程序。
你可以将spring.cloud.config.server.accept-empty设置为false,以便在找不到应用程序时,Server将返回 HTTP 404 状态。默认情况下,此标志设置为 true。
Git 后端
的默认实现EnvironmentRepository
使用 Git 后端,这对于管理升级和物理环境以及审计更改非常方便。
要更改存储库的位置,您可以设置spring.cloud.config.server.git.uri
configuration 属性(例如在application.yml
).
如果使用file:
前缀,它应该从本地存储库工作,以便您可以在没有服务器的情况下快速轻松地开始使用。但是,在这种情况下,服务器将直接在本地存储库上运行,而无需克隆它(如果它不是裸露的并不重要,因为 Config Server 永远不会更改“远程”存储库)。
要扩展 Config Server 并使其具有高可用性,您需要将服务器的所有实例指向同一个存储库,因此只有共享文件系统才能工作。
即使在这种情况下,最好使用ssh:
协议,以便服务器可以克隆它并使用本地工作副本作为缓存。
此存储库实现映射了{label}
参数添加到 git 标签(提交 ID、分支名称或标签)。
如果 git 分支或标签名称包含斜杠 (),则应使用特殊字符串指定 HTTP URL 中的标签(以避免与其他 URL 路径产生歧义)。
例如,如果标签为/
(_)
foo/bar
,替换斜杠将导致以下标签:foo(_)bar
.
包含特殊字符串也可以应用于(_)
{application}
参数。
如果您使用命令行客户端(如 curl),请小心 URL 中的括号 — 您应该使用单引号 ('') 从 shell 中转义它们。
跳过 SSL 证书验证
可以通过设置git.skipSslValidation
property 设置为true
(默认值为false
).
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
skipSslValidation: true
设置 HTTP 连接超时
您可以配置配置服务器等待获取 HTTP 连接的时间(以秒为单位)。使用git.timeout
财产。
spring:
cloud:
config:
server:
git:
uri: https://example.com/my/repo
timeout: 4
Git URI 中的占位符
Spring Cloud Config Server 支持带有占位符的 git 存储库 URL{application}
和{profile}
(以及{label}
如果你需要它,但请记住,标签无论如何都是作为 git 标签应用的)。
因此,您可以使用类似于以下的结构来支持“每个应用程序一个存储库”策略:
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}
您还可以使用类似的模式来支持 “每个配置文件一个存储库” 策略,但使用{profile}
.
此外,在{application}
参数可以启用对多个
organizations,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/{application}
哪里{application}
在请求时按以下格式提供:organization(_)application
.
模式匹配和多个存储库
Spring Cloud Config 还包括对模式的更复杂需求的支持
在 Application 和 Profile Name 上匹配。
模式格式是逗号分隔的{application}/{profile}
带有通配符的名称(请注意,可能需要用引号开头的模式),如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
simple: https://github.com/simple/config-repo
special:
pattern: special*/dev*,*special*/dev*
uri: https://github.com/special/config-repo
local:
pattern: local*
uri: file:/home/configsvc/config-repo
如果{application}/{profile}
不匹配任何模式,则使用在spring.cloud.config.server.git.uri
.
在上面的示例中,对于 “simple” 存储库,模式为simple/*
(它只匹配一个名为simple
在所有配置文件中)。“local” 存储库匹配所有以local
在所有配置文件中(后缀会自动添加到没有配置文件匹配器的任何模式)。/*
仅当要设置的唯一属性是 URI 时,才能使用“simple”示例中使用的“one-liner”快捷方式。 如果需要设置任何其他内容 (凭据、模式等),则需要使用完整表单。 |
这pattern
property 实际上是一个数组,因此你可以使用 YAML 数组(或者[0]
,[1]
等后缀)绑定到多个模式。
如果要运行具有多个配置文件的应用程序,则可能需要这样做,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
repos:
development:
pattern:
- '*/development'
- '*/staging'
uri: https://github.com/development/config-repo
staging:
pattern:
- '*/qa'
- '*/production'
uri: https://github.com/staging/config-repo
Spring Cloud 猜测,包含不以 结尾的配置文件的模式意味着您实际上希望匹配以此模式开头的配置文件列表(因此* */staging 是["*/staging", "*/staging,*"] 等)。
这很常见,例如,您需要在本地运行 “development” 配置文件中的应用程序,但也需要远程运行 “cloud” 配置文件中的应用程序。 |
每个仓库还可以选择将配置文件存储在子目录中,并且搜索这些目录的模式可以指定为search-paths
.
以下示例显示了顶层的配置文件:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
search-paths:
- foo
- bar*
在前面的示例中,服务器在顶层和foo/
子目录以及名称以bar
.
默认情况下,服务器在配置 首先请求。 可以将服务器配置为在启动时克隆存储库,如以下顶级示例所示:
spring:
cloud:
config:
server:
git:
uri: https://git/common/config-repo.git
repos:
team-a:
pattern: team-a-*
cloneOnStart: true
uri: https://git/team-a/config-repo.git
team-b:
pattern: team-b-*
cloneOnStart: false
uri: https://git/team-b/config-repo.git
team-c:
pattern: team-c-*
uri: https://git/team-a/config-repo.git
在前面的示例中,服务器在启动时克隆了 team-a 的 config-repo,然后再 接受任何请求。 在请求存储库中的配置之前,不会克隆所有其他存储库。
将存储库设置为在 Config Server 启动时克隆有助于在 Config Server 启动时快速识别配置错误的配置源(例如无效的存储库 URI)。
跟cloneOnStart 未为配置源启用,则 Config Server 可能会使用配置错误或无效的配置源成功启动,并且在应用程序从该配置源请求配置之前不会检测到错误。 |
认证
要在远程存储库上使用 HTTP 基本身份验证,请在username
和password
属性(不在 URL 中),如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
username: trolley
password: strongpassword
如果您不使用 HTTPS 和用户凭证,则当您将密钥存储在默认目录 (~/.ssh
) 和 URI 指向 SSH 位置,例如[email protected]:configuration/cloud-configuration
.
Git 服务器的条目必须出现在~/.ssh/known_hosts
文件,并且它位于ssh-rsa
格式。
其他格式(如ecdsa-sha2-nistp256
) 不受支持。
为避免意外,您应该确保known_hosts
文件,并且它与你提供给配置服务器的 URL 匹配。
如果您在 URL 中使用主机名,则希望在known_hosts
文件。
存储库是使用 JGit 访问的,因此您找到的任何文档都应该适用。
HTTPS 代理设置可以在~/.git/config
或(与任何其他 JVM 进程相同)使用
系统属性 (-Dhttps.proxyHost
和-Dhttps.proxyPort
).
如果您不知道您的位置~/.git directory 是,请使用git config --global 要作设置(例如,git config --global http.sslVerify false ). |
JGit 需要 PEM 格式的 RSA 密钥。下面是一个示例 ssh-keygen(来自 openssh)命令,它将生成 corect 格式的密钥:
ssh-keygen -m PEM -t rsa -b 4096 -f ~/config_server_deploy_key.rsa
警告:使用 SSH 密钥时,预期的 ssh 私钥必须以
.如果键以-----BEGIN RSA PRIVATE KEY-----
那么 RSA 密钥在 spring-cloud-config 服务器启动时不会加载。错误如下所示:-----BEGIN OPENSSH PRIVATE KEY-----
- Error in object 'spring.cloud.config.server.git': codes [PrivateKeyIsValid.spring.cloud.config.server.git,PrivateKeyIsValid]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [spring.cloud.config.server.git.,]; arguments []; default message []]; default message [Property 'spring.cloud.config.server.git.privateKey' is not a valid private key]
要更正上述错误,必须将 RSA 密钥转换为 PEM 格式。上面提供了一个使用 openssh 的示例,用于以适当的格式生成新密钥。
使用 AWS CodeCommit 进行身份验证
Spring Cloud Config Server 还支持 AWS CodeCommit 身份验证。 AWS CodeCommit 在从命令行使用 Git 时使用身份验证帮助程序。 此帮助程序不与 JGit 库一起使用,因此,如果 Git URI 与 AWS CodeCommit 模式匹配,则会为 AWS CodeCommit 创建 JGit CredentialProvider。 AWS CodeCommit URI 遵循以下模式:
https//git-codecommit.${AWS_REGION}.amazonaws.com/v1/repos/${repo}.
如果您提供带有 AWS CodeCommit URI 的用户名和密码,则它们必须是提供存储库访问权限的 AWS accessKeyId 和 secretAccessKey。 如果您未指定用户名和密码,则使用 AWS 默认凭证提供程序链检索 accessKeyId 和 secretAccessKey。
如果您的 Git URI 与 CodeCommit URI 模式(如前所示)匹配,则必须在用户名和密码中提供有效的AWS凭证,或者在默认凭证提供程序链支持的位置之一提供。 AWS EC2 实例可以使用 EC2 实例的 IAM 角色。
这aws-java-sdk-core jar 是一个可选的依赖项。
如果aws-java-sdk-core jar 不在您的类路径上,则不会创建 AWS Code Commit 凭证提供程序,无论 git 服务器 URI 如何。 |
使用 Google Cloud Source 进行身份验证
Spring Cloud Config Server 还支持对 Google Cloud Source 存储库进行身份验证。
如果您的 Git URI 使用http
或https
协议,域名为source.developers.google.com
,则将使用 Google Cloud Source 凭据提供程序。Google Cloud Source 存储库 URI 的格式为https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}
.要获取存储库的 URI,请单击 Google Cloud Source UI 中的“Clone”,然后选择“Manually generated credentials”。不生成任何凭证,只需复制显示的 URI。
Google Cloud Source 凭据提供程序将使用 Google Cloud Platform 应用程序默认凭据。请参阅 Google Cloud SDK 文档,了解如何为系统创建应用程序默认凭证。此方法适用于开发环境中的用户帐户和生产环境中的服务帐户。
com.google.auth:google-auth-library-oauth2-http 是可选的依赖项。
如果google-auth-library-oauth2-http jar 不在您的 Classpath 上,则不会创建 Google Cloud Source 凭证提供程序,无论 git 服务器 URI 如何。 |
使用属性的 Git SSH 配置
默认情况下,Spring Cloud Config Server 使用的 JGit 库使用 SSH 配置文件,例如~/.ssh/known_hosts
和/etc/ssh/ssh_config
使用 SSH URI 连接到 Git 存储库时。
在 Cloud Foundry 等云环境中,本地文件系统可能是短暂的或不容易访问的。
对于这些情况,可以使用 Java 属性设置 SSH 配置。
为了激活基于属性的 SSH 配置,spring.cloud.config.server.git.ignoreLocalSshSettings
property 必须设置为true
,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: [email protected]:team/repo1.git
ignoreLocalSshSettings: true
hostKey: someHostKey
hostKeyAlgorithm: ssh-rsa
privateKey: |
-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF
ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud
1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG
EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
+AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe
pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG
ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW
dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R
gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV
cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N
CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs
q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J
69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
-----END RSA PRIVATE KEY-----
下表描述了 SSH 配置属性。
属性名称 | 言论 |
---|---|
ignoreLocalSshSettings |
如果 |
私有密钥 |
有效的 SSH 私钥。如果 |
hostKey |
有效的 SSH 主机密钥。如果 |
hostKey算法 |
其中之一 |
strictHostKeyChecking |
|
knownHostsFile 文件 |
自定义位置 |
preferredAuthentications |
覆盖服务器身份验证方法顺序。如果服务器在 |
Git 搜索路径中的占位符
Spring Cloud Config Server 还支持带有{application}
和{profile}
(以及{label}
如果
您需要它),如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
search-paths: '{application}'
前面的清单会导致在存储库中搜索与目录同名(以及顶级)的文件。 通配符在带有占位符的搜索路径中也有效(搜索中包括任何匹配的目录)。
强制拉取 Git 存储库
如前所述, Spring Cloud Config Server 会克隆远程 git 存储库,以防本地副本变脏(例如, 文件夹内容更改),使得 Spring Cloud Config Server 无法从远程存储库更新本地副本。
为了解决这个问题,有一个force-pull
如果本地副本是脏的,则 Spring Cloud Config Server 会强制从远程存储库中提取属性,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
force-pull: true
如果您有多存储库配置,则可以配置force-pull
属性,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://git/common/config-repo.git
force-pull: true
repos:
team-a:
pattern: team-a-*
uri: https://git/team-a/config-repo.git
force-pull: true
team-b:
pattern: team-b-*
uri: https://git/team-b/config-repo.git
force-pull: true
team-c:
pattern: team-c-*
uri: https://git/team-a/config-repo.git
的默认值force-pull property 为false . |
删除 Git 存储库中未跟踪的分支
由于 Spring Cloud Config Server 具有远程 git 存储库的克隆
将分支签出到本地仓库后(例如通过标签获取属性),它将保留此分支
forever 或直到下一次服务器重启(这将创建新的本地存储库)。
因此,可能会出现远程分支被删除但其本地副本仍可用于获取的情况。
如果 Spring Cloud Config Server 客户端服务以--spring.cloud.config.label=deletedRemoteBranch,master
它将从deletedRemoteBranch
local 分支,而不是从master
.
为了保持本地仓库分支的整洁和远程 -deleteUntrackedBranches
属性。
它将使 Spring Cloud Config Server 强制从本地存储库中删除未跟踪的分支。
例:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
deleteUntrackedBranches: true
的默认值deleteUntrackedBranches property 为false . |
Git 刷新率
您可以控制配置服务器获取更新的配置数据的频率
使用 Git 后端spring.cloud.config.server.git.refreshRate
.这
此属性的值以秒为单位指定。默认情况下,该值为 0,这意味着
配置服务器每次都会从 Git 仓库中获取更新的配置
请求。
版本控制后端文件系统使用
使用基于 VCS 的后端(git、svn),文件被检出或克隆到本地文件系统。
默认情况下,它们被放置在系统临时目录中,前缀为config-repo- .
例如,在 linux 上,它可能是/tmp/config-repo-<randomid> .
某些作系统会定期清理临时目录。
这可能会导致意外行为,例如缺少属性。
为避免此问题,请通过设置spring.cloud.config.server.git.basedir 或spring.cloud.config.server.svn.basedir 添加到不驻留在 System Temp 结构中的目录。 |
文件系统后端
Config Server 中还有一个“本机”配置文件,它不使用 Git,但从本地 Classpath 或文件系统(您想要指向的任何静态 URL)加载配置文件spring.cloud.config.server.native.searchLocations
).
要使用本机配置文件,请使用spring.profiles.active=native
.
请记住使用file: 前缀(没有前缀的默认值通常是 Classpath)。
与任何 Spring Boot 配置一样,您可以嵌入 -style 环境占位符,但请记住,Windows 中的绝对路径需要一个额外的(例如,${} / file:///${user.home}/config-repo ). |
的searchLocations 与本地 Spring Boot 应用程序相同(即[classpath:/, classpath:/config,
file:./, file:./config] ).
这不会暴露application.properties 从服务器到所有客户端,因为服务器中存在的任何属性源在发送到客户端之前都会被删除。 |
文件系统后端非常适合快速入门和测试。 要在 生产环境中使用它,您需要确保文件系统是可靠的,并在 Config Server 的所有实例之间共享。 |
搜索位置可以包含以下占位符{application}
,{profile}
和{label}
.
这样,您可以隔离路径中的目录,并选择对您有意义的策略(例如,每个应用程序的子目录或每个配置文件的子目录)。
如果不在搜索位置使用占位符,则此存储库还会将{label}
参数添加到搜索路径上的后缀中,以便从每个搜索位置和与标签同名的子目录加载属性文件(标记的属性在 Spring Environment 中优先)。
因此,没有占位符的默认行为与添加以/{label}/
.
例如file:/tmp/config
与file:/tmp/config,file:/tmp/config/{label}
.
可以通过设置spring.cloud.config.server.native.addLabelLocations=false
.
Vault 后端
Spring Cloud Config Server 还支持将 Vault 作为后端。
有关 Vault 的更多信息,请参阅 Vault 快速入门指南。
要使配置服务器能够使用 Vault 后端,您可以使用vault
轮廓。
例如,在您的配置服务器的application.properties
中,您可以添加spring.profiles.active=vault
.
默认情况下,配置服务器假定您的 Vault 服务器在http://127.0.0.1:8200
.
它还假定 backend 的名称为secret
关键是application
.
所有这些默认值都可以在配置服务器的application.properties
.
下表描述了可配置的 Vault 属性:
名字 | 默认值 |
---|---|
主机 |
127.0.0.1 |
港口 |
8200 |
方案 |
http |
后端 |
秘密 |
defaultKey |
应用 |
profileSeparator 的 |
, |
kvVersion |
1 |
skipSslValidation |
假 |
超时 |
5 |
Namespace |
零 |
上表中的所有属性都必须以spring.cloud.config.server.vault 或放置在复合配置的正确 Vault 部分中。 |
所有可配置的属性都可以在org.springframework.cloud.config.server.environment.VaultEnvironmentProperties
.
Vault 0.10.0 引入了一个版本化的键值后端(k/v 后端版本 2),它公开了与早期版本不同的 API,现在它需要一个data/ 在挂载路径和实际上下文路径之间,并将 Secret 包装在data 对象。设置spring.cloud.config.server.vault.kv-version=2 将考虑到这一点。 |
(可选)支持 Vault EnterpriseX-Vault-Namespace
页眉。要将其发送到 Vault,请将namespace
财产。
在您的配置服务器运行的情况下,您可以向服务器发出 HTTP 请求以检索 值。 为此,您需要 Vault 服务器的令牌。
首先,将一些数据放入 Vault 中,如以下示例所示:
$ vault kv put secret/application foo=bar baz=bam
$ vault kv put secret/myapp foo=myappsbar
其次,向配置服务器发出 HTTP 请求以检索值,如以下示例所示:
$ curl -X "GET" "http://localhost:8888/myapp/default" -H "X-Config-Token: yourtoken"
您应该会看到类似于以下内容的响应:
{
"name":"myapp",
"profiles":[
"default"
],
"label":null,
"version":null,
"state":null,
"propertySources":[
{
"name":"vault:myapp",
"source":{
"foo":"myappsbar"
}
},
{
"name":"vault:application",
"source":{
"baz":"bam",
"foo":"bar"
}
}
]
}
Client 端提供必要的身份验证以让 Config Server 与 Vault 通信的默认方法是设置 X-Config-Token 标头。
但是,您可以通过设置与 Spring Cloud Vault 相同的配置属性来省略 Headers 并在服务器中配置身份验证。
要设置的属性是spring.cloud.config.server.vault.authentication
.
它应设置为受支持的身份验证方法之一。
您可能还需要设置特定于您使用的身份验证方法的其他属性,方法是使用与spring.cloud.vault
而是使用spring.cloud.config.server.vault
前缀。
有关更多详细信息,请参阅 Spring Cloud Vault 参考指南。
如果省略X-Config-Token标头并使用服务器属性来设置身份验证,则 Config Server 应用程序需要对 Spring Vault 的额外依赖才能启用其他身份验证选项。 有关如何添加该依赖项,请参见 Spring Vault 参考指南。 |
多个属性源
使用 Vault 时,您可以为应用程序提供多个属性源。 例如,假设您已将数据写入 Vault 中的以下路径:
secret/myApp,dev
secret/myApp
secret/application,dev
secret/application
写入secret/application
可用于使用 Config Server 的所有应用程序。
名称为myApp
将写入任何属性secret/myApp
和secret/application
可用。
什么时候myApp
具有dev
profile 启用,则写入上述所有路径的属性将可供其使用,列表中第一个路径中的属性优先于其他路径。
通过代理访问后端
配置服务器可以通过 HTTP 或 HTTPS 代理访问 Git 或 Vault 后端。对于 Git 或 Vault,此行为由proxy.http
和proxy.https
.这些设置是按存储库进行的,因此,如果您使用的是复合环境存储库,则必须为复合中的每个后端单独配置代理设置。如果使用的网络需要为 HTTP 和 HTTPS URL 提供单独的代理服务器,则可以为单个后端配置 HTTP 和 HTTPS 代理设置。
下表描述了 HTTP 和 HTTPS 代理的代理配置属性。所有这些属性都必须以proxy.http
或proxy.https
.
属性名称 | 言论 |
---|---|
主机 |
代理的主机。 |
港口 |
用于访问代理的端口。 |
非代理主机 |
配置服务器应在代理外部访问的任何主机。如果为两者提供了值 |
用户名 |
用于向代理进行身份验证的用户名。如果为两者提供了值 |
密码 |
用于向代理进行身份验证的密码。如果为两者提供了值 |
以下配置使用 HTTPS 代理访问 Git 存储库。
spring:
profiles:
active: git
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
proxy:
https:
host: my-proxy.host.io
password: myproxypassword
port: '3128'
username: myproxyusername
nonProxyHosts: example.com
与所有应用程序共享配置
在所有应用程序之间共享配置因您采用的方法而异,如以下主题所述:
基于文件的存储库
对于基于文件的(git、svn 和 native)存储库,文件名为application*
(application.properties
,application.yml
,application-*.properties
等)在所有客户端应用程序之间共享。
您可以使用具有这些文件名的资源来配置全局默认值,并根据需要将它们覆盖为特定于应用程序的文件。
属性覆盖功能还可用于设置占位符应用程序的全局默认值 允许在本地覆盖它们。
使用 “native” profile (a local file system backend) ,您应该使用不属于服务器自身配置的显式搜索位置。
否则,application* 默认搜索位置中的资源将被删除,因为它们是服务器的一部分。 |
Vault 服务器
当使用 Vault 作为后端时,您可以通过将配置放在secret/application
.
例如,如果运行以下 Vault 命令,则使用配置服务器的所有应用程序都将具有foo
和baz
他们可以使用:
$ vault write secret/application foo=bar baz=bam
CredHub 服务器
当使用 CredHub 作为后端时,您可以通过将配置放入/application/
或者将其放在default
配置文件。
例如,如果运行以下 CredHub 命令,则使用配置服务器的所有应用程序都将具有属性shared.color1
和shared.color2
他们可以使用:
credhub set --name "/application/profile/master/shared" --type=json
value: {"shared.color1": "blue", "shared.color": "red"}
credhub set --name "/my-app/default/master/more-shared" --type=json
value: {"shared.word1": "hello", "shared.word2": "world"}
JDBC 后端
Spring Cloud Config Server 支持 JDBC(关系数据库)作为配置属性的后端。
您可以通过添加spring-jdbc
添加到类路径中,并使用jdbc
配置文件或通过添加JdbcEnvironmentRepository
.
如果在 Classpath 中包含正确的依赖项(有关此的更多详细信息,请参见用户指南),则 Spring Boot 会配置数据源。
您可以禁用JdbcEnvironmentRepository
通过设置spring.cloud.config.server.jdbc.enabled
property 设置为false
.
数据库需要有一个名为PROPERTIES
替换为名为APPLICATION
,PROFILE
和LABEL
(通常的Environment
含义)、加号KEY
和VALUE
对于Properties
风格。
在 Java 中,所有字段都是 String 类型,因此您可以创建它们VARCHAR
您需要的任何长度。
属性值的行为方式与它们来自名为{application}-{profile}.properties
,包括所有加密和解密,这些加密和解密将作为后处理步骤应用(即,不直接在存储库实现中)。
Redis 后端
Spring Cloud Config Server 支持将 Redis 作为配置属性的后端。 您可以通过向 Spring Data Redis 添加依赖项来启用此功能。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
</dependencies>
以下配置使用 Spring DataRedisTemplate
以访问 Redis。我们可以使用spring.redis.*
properties 覆盖默认连接设置。
spring:
profiles:
active: redis
redis:
host: redis
port: 16379
属性应作为字段存储在哈希中。hash 的名称应与spring.application.name
属性或连词spring.application.name
和spring.profiles.active[n]
.
HMSET sample-app server.port "8100" sample.topic.name "test" test.property1 "property1"
运行上方可见的命令后,哈希应包含以下键和值:
HGETALL sample-app { "server.port": "8100", "sample.topic.name": "test", "test.property1": "property1" }
未指定配置文件时default 将被使用。 |
AWS S3 后端
Spring Cloud Config Server 支持将 AWS S3 作为配置属性的后端。 您可以通过向适用于 Amazon S3 的 AWS Java 开发工具包添加依赖项来启用此功能。
<dependencies>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
</dependency>
</dependencies>
以下配置使用 AWS S3 客户端访问配置文件。我们可以使用spring.awss3.*
properties 选择存储配置的存储桶。
spring:
profiles:
active: awss3
cloud:
config:
server:
awss3:
region: us-east-1
bucket: bucket1
还可以指定一个 AWS URL 来覆盖 S3 服务的标准终端节点spring.awss3.endpoint
.这允许支持 S3 的 beta 区域和其他与 S3 兼容的存储 API。
使用默认 AWS Credential Provider Chain 找到凭证。支持版本控制和加密的存储桶,无需进一步配置。
配置文件以{application}-{profile}.properties
,{application}-{profile}.yml
或{application}-{profile}.json
.可以提供可选标签来指定文件的目录路径。
未指定配置文件时default 将被使用。 |
CredHub 后端
Spring Cloud Config Server 支持 CredHub 作为配置属性的后端。 您可以通过向 Spring CredHub 添加依赖项来启用此功能。
<dependencies>
<dependency>
<groupId>org.springframework.credhub</groupId>
<artifactId>spring-credhub-starter</artifactId>
</dependency>
</dependencies>
以下配置使用双向 TLS 访问 CredHub:
spring:
profiles:
active: credhub
cloud:
config:
server:
credhub:
url: https://credhub:8844
这些属性应存储为 JSON,例如:
credhub set --name "/demo-app/default/master/toggles" --type=json
value: {"toggle.button": "blue", "toggle.link": "red"}
credhub set --name "/demo-app/default/master/abs" --type=json
value: {"marketing.enabled": true, "external.enabled": false}
名称为spring.cloud.config.name=demo-app
将具有以下属性可供他们使用:
{ toggle.button: "blue", toggle.link: "red", marketing.enabled: true, external.enabled: false }
未指定配置文件时default ,并且未指定标签时master 将用作默认值。
注意:添加到application 将由所有应用程序共享。 |
OAuth 2.0 版本
<dependencies>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-oauth2-client</artifactId>
</dependency>
</dependencies>
以下配置使用 OAuth 2.0 和 UAA 访问 CredHub:
spring:
profiles:
active: credhub
cloud:
config:
server:
credhub:
url: https://credhub:8844
oauth2:
registration-id: credhub-client
security:
oauth2:
client:
registration:
credhub-client:
provider: uaa
client-id: credhub_config_server
client-secret: asecret
authorization-grant-type: client_credentials
provider:
uaa:
token-uri: https://uaa:8443/oauth/token
使用的 UAA 客户端 ID 应具有credhub.read 作为范围。 |
复合环境存储库
在某些情况下,您可能希望从多个环境存储库中提取配置数据。
为此,您可以启用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
property,则其优先级越高。
存储库的优先级顺序有助于解决包含相同属性值的存储库之间的任何潜在冲突。
如果复合环境包括上一个示例中的 Vault 服务器,则必须在向配置服务器发出的每个请求中包含一个 Vault 令牌。参见 Vault Backend。 |
从环境存储库中检索值时,任何类型的失败都会导致整个复合环境失败。
如果您希望在存储库失败时继续进行组合,则可以将spring.cloud.config.server.failOnCompositeError 自false . |
使用复合环境时,所有存储库都包含相同的标签非常重要。
如果您有一个与前面示例中类似的环境,并且您使用master 标签,但 Subversion 仓库不包含名为master ,则整个请求失败。 |
自定义复合环境存储库
除了使用 Spring Cloud 中的环境存储库之一外,您还可以提供自己的EnvironmentRepository
作为复合环境的一部分包含在 bean 中。
为此,您的 bean 必须实现EnvironmentRepository
接口。
如果要控制自定义的优先级EnvironmentRepository
在复合环境中,您还应实现Ordered
接口并覆盖getOrdered
方法。
如果您未实现Ordered
界面中,您的EnvironmentRepository
的优先级最低。
Property Overrides
Config Server 具有“覆盖”功能,允许作员为所有应用程序提供配置属性。
使用普通 Spring Boot 钩子的应用程序不会意外更改被覆盖的属性。
要声明覆盖,请将名称-值对的映射添加到spring.cloud.config.server.overrides
,如以下示例所示:
spring:
cloud:
config:
server:
overrides:
foo: bar
前面的示例会导致所有作为 config 客户端的应用程序读取foo=bar
,独立于它们自己的配置。
配置系统不能强制应用程序以任何特定方式使用配置数据。 因此,覆盖是不可强制执行的。 但是,它们确实为 Spring Cloud Config 客户端提供了有用的默认行为。 |
通常,可以通过使用反斜杠 () 转义 或 .
例如${} \ $ { \${app.foo:bar} resolve为bar ,除非应用程序提供自己的app.foo . |
在 YAML 中,您无需转义反斜杠本身。 但是,在属性文件中,当您在服务器上配置覆盖时,您确实需要转义反斜杠。 |
您可以将客户端中所有覆盖的优先级更改为更像默认值,让应用程序在环境变量或 System 属性中提供自己的值,方法是将spring.cloud.config.overrideNone=true
标志(默认值为 false)。
运行状况指示器
Config Server 带有一个运行状况指示器,用于检查配置的EnvironmentRepository
正在工作。
默认情况下,它会询问EnvironmentRepository
对于名为app
这default
profile 和EnvironmentRepository
实现。
您可以配置运行状况指示器以检查更多应用程序以及自定义配置文件和自定义标签,如以下示例所示:
spring:
cloud:
config:
server:
health:
repositories:
myservice:
label: mylabel
myservice-dev:
name: myservice
profiles: development
您可以通过设置management.health.config.enabled=false
.
安全
你可以用任何对你有意义的方式(从物理网络安全到 OAuth2 持有者令牌)来保护你的 Config Server,因为 Spring Security 和 Spring Boot 提供了对许多安全安排的支持。
要使用默认的 Spring Boot 配置的 HTTP Basic 安全性,请在 Classpath 中包含 Spring Security(例如,通过spring-boot-starter-security
).
默认值为user
以及随机生成的密码。随机密码在实践中没有用,因此我们建议您配置密码(通过设置spring.security.user.password
) 并对其进行加密(有关如何执行此作的说明,请参阅下文)。
加密和解密
要使用加密和解密功能,您需要在 JVM 中安装全功能 JCE(默认情况下不包含它)。 您可以从 Oracle 下载“Java 加密扩展 (JCE) 无限强度管辖策略文件”并按照安装说明进行作(实质上,您需要将 JRE lib/security 目录中的两个策略文件替换为您下载的文件)。 |
如果远程属性源包含加密内容(以{cipher}
),则在通过 HTTP 发送到客户端之前,会对其进行解密。
这种设置的主要优点是,当属性值处于 “静态” 状态时(例如,在 git 存储库中),它们不需要是纯文本形式。
如果无法解密某个值,则会将其从属性源中删除,并添加具有相同键但前缀为invalid
和一个表示“不适用”的值(通常<n/a>
).
这主要是为了防止密文被用作密码并意外泄露。
如果您为 config 客户端应用程序设置远程 config 存储库,它可能包含一个application.yml
类似于以下内容:
spring:
datasource:
username: dbuser
password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
中的 加密值application.properties
文件不能用引号括起来。否则,该值不会被解密。以下示例显示了有效的值:
spring.datasource.username: dbuser spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
您可以安全地将此纯文本推送到共享的 git 存储库,并且密钥密码将受到保护。
服务器还会公开/encrypt
和/decrypt
endpoints (假设这些是安全的,并且只有授权代理才能访问)。
如果您编辑远程配置文件,则可以使用 Config Server 通过对/encrypt
endpoint,如以下示例所示:
$ curl localhost:8888/encrypt -s -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果您使用 curl 进行测试,则使用--data-urlencode (而不是-d ) 并为要加密的值添加前缀(curl 需要这样做)或设置显式= Content-Type: text/plain 确保在存在特殊字符('+' 特别棘手)时对数据进行正确编码。 |
请确保不要在加密值中包含任何 curl 命令统计信息,这就是示例使用-s 选项将其静音。将值输出到文件有助于避免此问题。 |
逆运算也可以通过/decrypt
(前提是服务器是
配置了对称密钥或完整密钥对),如以下示例所示:
$ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
获取加密的值并添加{cipher}
前缀,然后再将其放入 YAML 或属性文件,以及提交并将其推送到远程(可能不安全)存储。
这/encrypt
和/decrypt
端点也都接受/*/{application}/{profiles}
,当客户端调用主环境资源时,它可用于基于每个应用程序(名称)和每个配置文件控制加密。
要以这种精细的方式控制加密,您还必须提供@Bean 的类型TextEncryptorLocator 这将为每个名称和配置文件创建不同的加密器。
默认情况下提供的密钥不会这样做(所有加密都使用相同的密钥)。 |
这spring
命令行客户端(使用 Spring Cloud CLI 扩展
installed) 也可用于加密和解密,如以下示例所示:
$ spring encrypt mysecret --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda $ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
要在文件中使用密钥(例如用于加密的 RSA 公钥),请在 key 值替换为 “@” 并提供文件路径,如以下示例所示:
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
这--key 参数是必需的(尽管有前缀)。-- |
密钥管理
Config Server 可以使用对称(共享)密钥或非对称密钥(RSA 密钥对)。
非对称选择在安全性方面更胜一筹,但使用对称密钥通常更方便,因为它是在bootstrap.properties
.
要配置对称密钥,您需要将encrypt.key
更改为 secret String (或使用ENCRYPT_KEY
环境变量使其远离纯文本配置文件)。
您不能使用encrypt.key . |
要配置非对称密钥,请使用密钥库(例如
由keytool
实用程序)。这
密钥库属性为encrypt.keyStore.*
等于*
财产 | 描述 |
---|---|
|
包含一个 |
|
保存解锁密钥库的密码 |
|
标识存储区中要使用的键 |
|
要创建的 KeyStore 的类型。默认为 |
加密是使用公钥完成的,私钥是 需要解密。 因此,原则上,如果您只想加密(并准备使用私钥在本地解密值),则可以在服务器中仅配置公钥。 在实践中,你可能不想在本地执行解密,因为它将密钥管理过程分散到所有客户端,而不是 将其集中在服务器中。 另一方面,如果您的 config server 相对不安全并且只有少数 Client 端需要加密属性,则它可能是一个有用的选项。
创建用于测试的密钥库
要创建用于测试的密钥库,您可以使用类似于以下内容的命令:
$ keytool -genkeypair -alias mytestkey -keyalg RSA \ -dname "CN=Web Server,OU=Unit,O=Organization,L=City,S=State,C=US" \ -keypass changeme -keystore server.jks -storepass letmein
使用 JDK 11 或更高版本时,使用上述命令时,可能会收到以下警告。在这种情况下
您可能希望确保keypass 和storepass 值匹配。 |
Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -keypass value.
将server.jks
file 中(例如),然后在
你bootstrap.yml
中,对于 Config Server,创建以下设置:
encrypt:
keyStore:
location: classpath:/server.jks
password: letmein
alias: mytestkey
secret: changeme
使用多个密钥和密钥轮换
除了{cipher}
prefix 的 Config Server 会查找零个或多个{name:value}
(Base64 编码的)密文开头之前的前缀。
键被传递给TextEncryptorLocator
,它可以执行任何需要的逻辑来查找TextEncryptor
对于密码。
如果您已配置密钥库 (encrypt.keystore.location
),则默认定位器会查找具有key
前缀,其密文如下所示:
foo:
bar: `{cipher}{key:testkey}...`
定位器将查找名为 “testkey” 的键。
密钥也可以通过使用{secret:…}
值。
但是,如果未提供,则默认使用密钥库密码(这是您在构建密钥库且未指定密钥时获得的密码)。
如果您确实提供了密钥,则还应使用自定义SecretLocator
.
当密钥仅用于加密几个字节的配置数据(即,它们没有在其他地方使用)时,出于加密原因,几乎不需要密钥轮换。
但是,您可能偶尔需要更改密钥(例如,在发生安全漏洞时)。
在这种情况下,所有客户端都需要更改其源配置文件(例如,在 git 中)并使用新的{key:…}
前缀。
请注意,客户端需要首先检查密钥别名在 Config Server 密钥库中是否可用。
如果你想让 Config Server 处理所有加密和解密,{name:value} 前缀也可以添加为纯文本,发布到/encrypt 端点。 |
提供加密属性
有时您希望 Client 端在本地解密配置,而不是在服务器中解密。
在这种情况下,如果您提供encrypt.*
配置来查找密钥,您仍然可以拥有/encrypt
和/decrypt
端点,但您需要通过将spring.cloud.config.server.encrypt.enabled=false
在bootstrap.[yml|properties]
.
如果您不关心终端节点,则在不配置 key 或 enabled 标志时,它应该可以正常工作。