Spring Cloud 配置服务器
Spring Cloud Config Server 为外部配置(名称-值对或等效的 YAML 内容)提供了基于 HTTP 资源的 API。
通过使用 Comments,服务器可嵌入到 Spring Boot 应用程序中。
因此,以下应用程序是配置服务器:@EnableConfigServer
@SpringBootApplication
@EnableConfigServer
public class ConfigServer {
public static void main(String[] args) {
SpringApplication.run(ConfigServer.class, args);
}
}
与所有 Spring Boot 应用程序一样,它默认在端口 8080 上运行,但您可以通过各种方式将其切换到更传统的端口 8888。
最简单的方法(还设置了默认配置存储库)是使用(在 Config Server jar 中有一个)启动它。
另一种方法是使用你自己的 ,如以下示例所示:spring.config.name=configserver
configserver.yml
application.properties
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
其中 是包含 YAML 和属性文件的 git 存储库。${user.home}/config-repo
在 Windows 上,如果文件 URL 是带有驱动器前缀的绝对 “/” (例如,),则需要在文件 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 的配置数据存储在哪里?
控制此行为的策略是 , serving 对象。
这是 Spring 中域的浅层副本(包括作为主要功能)。
资源由三个变量参数化:EnvironmentRepository
Environment
Environment
Environment
propertySources
Environment
-
{application}
,该 Map 到客户端。spring.application.name
-
{profile}
,该列表映射到客户端(逗号分隔列表)。spring.profiles.active
-
{label}
,这是一个服务器端功能,用于标记一组“版本化”的配置文件。
存储库实现通常表现得像 Spring Boot 应用程序,从 等于 parameter 和 等于 parameter 加载配置文件。
配置文件的优先规则也与常规 Spring Boot 应用程序中的优先级规则相同:活动配置文件优先于默认值,如果有多个配置文件,则最后一个配置文件获胜(类似于向 a 添加条目)。spring.config.name
{application}
spring.profiles.active
{profiles}
Map
以下示例客户端应用程序具有此引导程序配置:
spring:
application:
name: foo
profiles:
active: dev,mysql
(与 Spring Boot 应用程序一样,这些属性也可以通过环境变量或命令行参数设置)。
如果存储库是基于文件的,则服务器将创建 from (在所有客户端之间共享) 和 (具有优先权)。
如果 YAML 文件中包含指向 Spring 配置文件的文档,则这些文档将以更高的优先级应用(按列出的配置文件的顺序)。
如果存在特定于配置文件的 YAML(或属性)文件,则这些文件的优先级也高于默认值。
较高的优先级将转换为 .
(这些相同的规则适用于独立的 Spring Boot 应用程序。Environment
application.yml
foo.yml
foo.yml
PropertySource
Environment
您可以设置为 ,以便在找不到应用程序时 Server 返回 HTTP 404 状态。默认情况下,此标志设置为 .spring.cloud.config.server.accept-empty
false
true
不能将属性放置在远程 .这些属性用作应用程序初始化的一部分。spring.main.* EnvironmentRepository |
Git 后端
的默认实现使用 Git 后端,这对于管理升级和物理环境以及审计更改非常方便。
要更改存储库的位置,您可以在 Config Server 中设置 configuration 属性(例如在 中)。
如果使用前缀设置它,它应该可以从本地存储库工作,以便您可以在没有服务器的情况下快速轻松地开始使用。但是,在这种情况下,服务器将直接在本地存储库上运行,而无需克隆它(如果它不是裸露的并不重要,因为 Config Server 永远不会更改“远程”存储库)。
要扩展 Config Server 并使其具有高可用性,您需要将服务器的所有实例指向同一个存储库,因此只有共享文件系统才能工作。
即使在这种情况下,最好将协议用于共享文件系统存储库,以便服务器可以克隆它并使用本地工作副本作为缓存。EnvironmentRepository
spring.cloud.config.server.git.uri
application.yml
file:
ssh:
此存储库实现将 HTTP 资源的参数映射到 git 标签(提交 ID、分支名称或标签)。
如果 git 分支或标签名称包含斜杠 (),则应使用特殊字符串指定 HTTP URL 中的标签(以避免与其他 URL 路径产生歧义)。
例如,如果标签是 ,则替换斜杠将产生以下标签:。
特殊字符串的包含也可以应用于参数。
如果您使用命令行客户端(如 curl),请小心 URL 中的括号 — 您应该使用单引号 ('') 从 shell 中转义它们。{label}
/
(_)
foo/bar
foo(_)bar
(_)
{application}
跳过 SSL 证书验证
可以通过将属性设置为 (default is )来禁用配置服务器对 Git 服务器的 SSL 证书的验证。git.skipSslValidation
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 支持带有 and 占位符的 git 存储库 URL(如果您需要,请记住该标签无论如何都作为 git 标签应用)。
因此,您可以使用类似于以下的结构来支持“每个应用程序一个存储库”策略:{application}
{profile}
{label}
spring:
cloud:
config:
server:
git:
uri: https://github.com/myorg/{application}
您还可以使用类似的模式来支持“每个配置文件一个存储库”策略,但使用 .{profile}
此外,在参数中使用特殊字符串 “(_)” 可以启用对多个
organizations,如以下示例所示:{application}
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
如果与任何模式都不匹配,则使用 在 中定义的默认 URI。
在上面的示例中,对于“simple”存储库,模式为 (它仅匹配所有配置文件中命名的一个应用程序)。“local” 存储库匹配所有配置文件中所有以 开头的应用程序名称(后缀会自动添加到没有配置文件匹配器的任何模式)。{application}/{profile}
spring.cloud.config.server.git.uri
simple/*
simple
local
/*
仅当要设置的唯一属性是 URI 时,才能使用“simple”示例中使用的“one-liner”快捷方式。 如果需要设置任何其他内容 (凭据、模式等),则需要使用完整表单。 |
repo 中的属性实际上是一个数组,因此你可以使用 YAML 数组(或属性文件中的 、 等后缀)来绑定到多个模式。
如果要运行具有多个配置文件的应用程序,则可能需要这样做,如以下示例所示:pattern
[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 猜测包含不以 结尾的配置文件的模式意味着您实际上希望匹配以此模式开头的配置文件列表(因此是 的快捷方式,依此类推)。
这很常见,例如,您需要在本地运行 “development” 配置文件中的应用程序,但也需要远程运行 “cloud” 配置文件中的应用程序。* */staging ["*/staging", "*/staging,*"] |
每个存储库还可以选择将配置文件存储在子目录中,并且搜索这些目录的模式可以指定为 .
以下示例显示了顶层的配置文件: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)。
如果未启用配置源,则 Config Server 可能会使用配置错误或无效的配置源成功启动,并且在应用程序从该配置源请求配置之前不会检测到错误。cloneOnStart |
认证
要在远程存储库上使用 HTTP 基本身份验证,请单独添加 and 属性(而不是在 URL 中),如以下示例所示:username
password
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
username: trolley
password: strongpassword
如果您不使用 HTTPS 和用户凭证,则当您将密钥存储在默认目录 () 中并且 URI 指向 SSH 位置(如 .
Git 服务器的条目必须存在于文件中,并且其格式必须为该条目。
不支持其他格式(如 )。
为避免意外,您应该确保 Git 服务器的文件中只有一个条目,并且它与您提供给配置服务器的 URL 匹配。
如果您在 URL 中使用主机名,则您希望文件中恰好包含该主机名(而不是 IP)。
存储库是使用 JGit 访问的,因此您找到的任何文档都应该适用。
HTTPS 代理设置可以在 OR 中设置(与任何其他 JVM 进程相同),使用
系统属性 ( 和 )。~/.ssh
[email protected]:configuration/cloud-configuration
~/.ssh/known_hosts
ssh-rsa
ecdsa-sha2-nistp256
known_hosts
known_hosts
~/.git/config
-Dhttps.proxyHost
-Dhttps.proxyPort
如果您不知道目录的位置,请使用 来操作设置(例如,)。~/.git 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 私钥必须以 .如果密钥以 开头,则 RSA 密钥在启动 spring-cloud-config 服务器时不会加载。错误如下所示:-----BEGIN RSA PRIVATE KEY-----
-----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 角色。
jar 是一个可选的依赖项。
如果 jar 不在您的类路径上,则不会创建 AWS Code Commit 凭证提供程序,无论 git 服务器 URI 如何。aws-java-sdk-core aws-java-sdk-core |
使用 Google Cloud Source 进行身份验证
Spring Cloud Config Server 还支持对 Google Cloud Source 存储库进行身份验证。
如果您的 Git URI 使用 or 协议且域名为 ,则将使用 Google Cloud Source 凭据提供程序。Google Cloud Source 存储库 URI 的格式为 .要获取存储库的 URI,请单击 Google Cloud Source UI 中的“Clone”,然后选择“Manually generated credentials”。不生成任何凭证,只需复制显示的 URI。http
https
source.developers.google.com
https://source.developers.google.com/p/${GCP_PROJECT}/r/${REPO}
Google Cloud Source 凭据提供程序将使用 Google Cloud Platform 应用程序默认凭据。请参阅 Google Cloud SDK 文档,了解如何为系统创建应用程序默认凭证。此方法适用于开发环境中的用户帐户和生产环境中的服务帐户。
com.google.auth:google-auth-library-oauth2-http 是可选的依赖项。
如果 jar 不在您的 Classpath 上,则不会创建 Google Cloud Source 凭证提供程序,无论 git 服务器 URI 如何。google-auth-library-oauth2-http |
使用属性的 Git SSH 配置
默认情况下,Spring Cloud Config Server 使用的 JGit 库使用 SSH 配置文件,例如在使用 SSH URI 连接到 Git 存储库时使用。
在 Cloud Foundry 等云环境中,本地文件系统可能是短暂的或不容易访问的。
对于这些情况,可以使用 Java 属性设置 SSH 配置。
要激活基于属性的 SSH 配置,必须将属性设置为 ,如以下示例所示:~/.ssh/known_hosts
/etc/ssh/ssh_config
spring.cloud.config.server.git.ignoreLocalSshSettings
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 配置,而不是基于文件的 SSH 配置。必须设置为 as ,而不是在存储库定义中。 |
私有密钥 |
有效的 SSH 私钥。如果为 true,并且 Git URI 为 SSH 格式,则必须设置。 |
hostKey |
有效的 SSH 主机密钥。如果还设置了,则必须设置。 |
hostKey算法 |
其中之一。如果还设置了,则必须设置。 |
strictHostKeyChecking |
|
knownHostsFile 文件 |
自定义文件的位置。 |
preferredAuthentications |
覆盖服务器身份验证方法顺序。如果 server 在方法之前进行了键盘交互式身份验证,这应该允许规避登录提示。 |
Git 搜索路径中的占位符
Spring Cloud Config Server 还支持带有占位符的搜索路径,用于 and(如果
您需要它),如以下示例所示:{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 无法从远程存储库更新本地副本。
为了解决这个问题,有一个属性使 Spring Cloud Config Server 在本地副本脏时强制从远程存储库中提取,如以下示例所示:force-pull
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
property 的默认值为 。force-pull false |
删除 Git 存储库中未跟踪的分支
由于 Spring Cloud Config Server 具有远程 git 存储库的克隆
将分支签出到本地仓库后(例如通过标签获取属性),它将保留此分支
forever 或直到下一次服务器重启(这将创建新的本地存储库)。
因此,可能会出现远程分支被删除但其本地副本仍可用于获取的情况。
如果 Spring Cloud Config Server 客户端服务以它开头,它将从本地分支获取属性,而不是从。--spring.cloud.config.label=deletedRemoteBranch,master
deletedRemoteBranch
master
为了保持本地仓库分支的整洁并更新到 remote - 可以设置属性。
它将使 Spring Cloud Config Server 强制从本地存储库中删除未跟踪的分支。
例:deleteUntrackedBranches
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
deleteUntrackedBranches: true
property 的默认值为 。deleteUntrackedBranches false |
Git 刷新率
您可以控制配置服务器获取更新的配置数据的频率
使用 .这
此属性的值以秒为单位指定。默认情况下,该值为 0,这意味着
配置服务器每次都会从 Git 仓库中获取更新的配置
请求。spring.cloud.config.server.git.refreshRate
默认标签
Git 使用的默认标签是 .如果未设置且名为 的分支不存在,则默认情况下,配置服务器还将尝试签出名为 .如果
您希望禁用可设置为 的 fallback 分支行为。main
spring.cloud.config.server.git.defaultLabel
main
master
spring.cloud.config.server.git.tryMasterBranch
false
版本控制后端文件系统使用
使用基于 VCS 的后端(git、svn),文件被检出或克隆到本地文件系统。
默认情况下,它们被放置在前缀为 .
例如,在 linux 上,它可能是 .
某些操作系统会定期清理临时目录。
这可能会导致意外行为,例如缺少属性。
为避免此问题,请通过设置 or 将 Config Server 使用的目录更改为不驻留在系统 temp 结构中的目录。config-repo- /tmp/config-repo-<randomid> spring.cloud.config.server.git.basedir spring.cloud.config.server.svn.basedir |
文件系统后端
Config Server 中还有一个“本机”配置文件,它不使用 Git,但从本地 Classpath 或文件系统(您要指向的任何静态 URL)加载配置文件。
要使用本机配置文件,请使用 .spring.cloud.config.server.native.searchLocations
spring.profiles.active=native
请记住对文件资源使用前缀(没有前缀的默认值通常是 Classpath)。
与任何 Spring Boot 配置一样,您可以嵌入 -style 环境占位符,但请记住,Windows 中的绝对路径需要一个额外的(例如)。file: ${} / file:///${user.home}/config-repo |
的默认值 与本地 Spring Boot 应用程序(即 )相同。
这不会向所有客户端公开 from the server,因为服务器中存在的任何属性源都会在发送到 client 之前被删除。searchLocations [classpath:/, classpath:/config,
file:./, file:./config] application.properties |
文件系统后端非常适合快速入门和测试。 要在 生产环境中使用它,您需要确保文件系统是可靠的,并在 Config Server 的所有实例之间共享。 |
搜索位置可以包含 、 和 的占位符。
这样,您可以隔离路径中的目录,并选择对您有意义的策略(例如,每个应用程序的子目录或每个配置文件的子目录)。{application}
{profile}
{label}
如果不在搜索位置中使用占位符,则此存储库还会将 HTTP 资源的参数附加到搜索路径上的后缀,以便从每个搜索位置和与标签同名的子目录加载属性文件(标记的属性在 Spring Environment 中优先)。
因此,没有占位符的默认行为与添加以 .
例如,与 相同。
可以通过设置 来禁用此行为。{label}
/{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 后端,您可以使用配置文件运行配置服务器。
例如,在 config server 的 中,您可以添加 .vault
application.properties
spring.profiles.active=vault
默认情况下,配置服务器假定您的 Vault 服务器在 上运行。
它还假定后端的名称为 ,键为 。
所有这些默认值都可以在 config server 的 .
下表描述了可配置的 Vault 属性:http://127.0.0.1:8200
secret
application
application.properties
名字 | 默认值 |
---|---|
主机 |
127.0.0.1 |
港口 |
8200 |
方案 |
http |
后端 |
秘密 |
defaultKey |
应用 |
profileSeparator 的 |
, |
kvVersion |
1 |
skipSslValidation |
假 |
超时 |
5 |
Namespace |
零 |
上表中的所有属性都必须以复合配置的正确 Vault 部分为前缀或放置在正确的 Vault 部分中。spring.cloud.config.server.vault |
所有可配置属性都可以在 中找到。org.springframework.cloud.config.server.environment.VaultEnvironmentProperties
Vault 0.10.0 引入了一个版本化的键值后端(k/v 后端版本 2),它公开了与早期版本不同的 API,它现在需要在挂载路径和实际上下文路径之间有一个,并将密钥包装在一个对象中。设置将考虑这一点。data/ data spring.cloud.config.server.vault.kv-version=2 |
(可选)支持 Vault Enterprise 标头。要将其发送到 Vault,请设置该特性。X-Vault-Namespace
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 Vault 参考指南。spring.cloud.config.server.vault.authentication
spring.cloud.vault
spring.cloud.config.server.vault
如果省略X-Config-Token标头并使用服务器属性来设置身份验证,则 Config Server 应用程序需要对 Spring Vault 的额外依赖才能启用其他身份验证选项。 有关如何添加该依赖项,请参见 Spring Vault 参考指南。 |
多个属性源
使用 Vault 时,您可以为应用程序提供多个属性源。 例如,假设您已将数据写入 Vault 中的以下路径:
secret/myApp,dev
secret/myApp
secret/application,dev
secret/application
写入的属性可用于使用 Config Server 的所有应用程序。
名称为 的应用程序将具有写入和可用的任何属性。
启用配置文件后,写入上述所有路径的属性将可供其使用,列表中第一个路径中的属性优先于其他路径。secret/application
myApp
secret/myApp
secret/application
myApp
dev
通过代理访问后端
配置服务器可以通过 HTTP 或 HTTPS 代理访问 Git 或 Vault 后端。
对于 Git 或 Vault,此行为由 和 下的设置控制。
这些设置是按存储库进行的,因此,如果您使用的是复合环境存储库,则必须为复合中的每个后端单独配置代理设置。
如果使用的网络需要为 HTTP 和 HTTPS URL 提供单独的代理服务器,则可以为单个后端配置 HTTP 和 HTTPS 代理设置:在这种情况下,访问将使用代理并访问代理。
此外,您可以指定一个唯一代理,该代理将在应用程序和代理之间使用代理定义协议,用于两种协议。proxy.http
proxy.https
http
http
https
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 作为后端时,您可以通过将配置放在 .
例如,如果运行以下 Vault 命令,则使用 config server 的所有应用程序都将具有 properties 并可供它们使用:secret/application
foo
baz
$ vault write secret/application foo=bar baz=bam
CredHub 服务器
当使用 CredHub 作为后端时,您可以通过将配置放入或将其放置在应用程序的配置文件中来与所有应用程序共享配置。
例如,如果运行以下 CredHub 命令,则使用配置服务器的所有应用程序都将具有属性并可供它们使用:/application/
default
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"}
AWS Secrets Manager
使用 AWS Secrets Manager 作为后端时,您可以通过将配置放入或将其放置在应用程序的配置文件中来与所有应用程序共享配置。
例如,如果你使用以下键添加 secret,则使用 config server 的所有应用程序都将具有 properties 和 available for them:/application/
default
shared.foo
shared.bar
secret name = /secret/application-default/
secret value =
{
shared.foo: foo,
shared.bar: bar
}
或
secret name = /secret/application/
secret value =
{
shared.foo: foo,
shared.bar: bar
}
AWS Parameter Store
当使用 AWS Parameter Store 作为后端时,您可以通过在层次结构中放置属性来与所有应用程序共享配置。/application
例如,如果您添加具有以下名称的参数,则使用配置服务器的所有应用程序都将具有属性并可供它们使用:foo.bar
fred.baz
/config/application/foo.bar
/config/application-default/fred.baz
JDBC 后端
Spring Cloud Config Server 支持 JDBC(关系数据库)作为配置属性的后端。
您可以通过添加到 Classpath 并使用 profile 或通过添加 type 为 的 bean 来启用此功能。
如果在 Classpath 中包含正确的依赖项(有关此的更多详细信息,请参见用户指南),则 Spring Boot 会配置数据源。spring-boot-starter-data-jdbc
jdbc
JdbcEnvironmentRepository
您可以通过将 属性设置为 来禁用 的自动配置 。JdbcEnvironmentRepository
spring.cloud.config.server.jdbc.enabled
false
数据库需要有一个名为 、 、 和 (具有通常含义)、plus 和 的列,用于样式中的键和值对。
在 Java 中,所有字段都是 String 类型,因此你可以将它们设置为所需的任何长度。
属性值的行为方式与它们来自名为 Spring Boot 的属性文件的行为方式相同,包括所有加密和解密,这些加密和解密将作为后处理步骤应用(即,不直接在存储库实现中)。PROPERTIES
APPLICATION
PROFILE
LABEL
Environment
KEY
VALUE
Properties
VARCHAR
{application}-{profile}.properties
用于 JDBC 的默认标签是 .您可以通过设置 来更改它。master spring.cloud.config.server.jdbc.defaultLabel |
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 Data 访问 Redis。我们可以使用 properties 来覆盖默认连接设置。RedisTemplate
spring.redis.*
spring:
profiles:
active: redis
redis:
host: redis
port: 16379
属性应作为字段存储在哈希中。哈希的名称应与 property 或 和 的 joint 相同。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 客户端访问配置文件。我们可以使用 properties 来选择存储配置的存储桶。spring.cloud.config.server.awss3.*
spring:
profiles:
active: awss3
cloud:
config:
server:
awss3:
region: us-east-1
bucket: bucket1
还可以指定 AWS URL 以使用 覆盖 S3 服务的标准终端节点。这允许支持 S3 的 beta 区域和其他与 S3 兼容的存储 API。spring.cloud.config.server.awss3.endpoint
使用默认 AWS Credential Provider Chain 找到凭证。支持版本控制和加密的存储桶,无需进一步配置。
配置文件以 、 或 的形式存储在存储桶中。可以提供可选标签来指定文件的目录路径。{application}-{profile}.properties
{application}-{profile}.yml
{application}-{profile}.json
如果未指定配置文件,则将使用。default |
AWS Parameter Store 后端
Spring Cloud Config Server 支持将 AWS Parameter Store 作为配置属性的后端。您可以通过向适用于 SSM 的 AWS Java 开发工具包添加依赖项来启用此功能。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-ssm</artifactId>
</dependency>
以下配置使用 AWS SSM 客户端访问参数。
spring:
profiles:
active: awsparamstore
cloud:
config:
server:
awsparamstore:
region: eu-west-2
endpoint: https://ssm.eu-west-2.amazonaws.com
origin: aws:parameter:
prefix: /config/service
profile-separator: _
recursive: true
decrypt-values: true
max-results: 5
下表描述了 AWS Parameter Store 配置属性。
属性名称 | 必填 | 默认值 | 言论 |
---|---|---|---|
地区 |
不 |
AWS Parameter Store 客户端要使用的区域。如果未显式设置,则开发工具包会尝试使用 Default Region Provider Chain 来确定要使用的区域。 |
|
端点 |
不 |
AWS SSM 客户端的入口点的 URL。这可用于为 API 请求指定备用终端节点。 |
|
起源 |
不 |
|
添加到属性源名称的前缀,用于显示其来源。 |
前缀 |
不 |
|
前缀指示从 AWS Parameter Store 加载的每个属性的参数层次结构中的 L1 级别。 |
profile-separator (配置文件分隔符) |
不 |
|
将附加的配置文件与上下文名称分隔开的字符串。 |
递归的 |
不 |
|
Flag 指示检索层次结构中的所有 AWS 参数。 |
解密值 |
不 |
|
Flag 以指示检索所有 AWS 参数,并解密其值。 |
最大结果 |
不 |
|
为 AWS Parameter Store API 调用返回的最大项目数。 |
AWS Parameter Store API 凭证是使用默认凭证提供程序链确定的。 版本化参数已受支持,默认行为是返回最新版本。
|
AWS Secrets Manager 后端
Spring Cloud Config Server 支持将 AWS Secrets Manager 作为配置属性的后端。 您可以通过向 AWS Java SDK for Secrets Manager 添加依赖项来启用此功能。
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-secretsmanager</artifactId>
</dependency>
以下配置使用 AWS Secrets Manager 客户端访问密钥。
spring:
profiles:
active: awssecretsmanager
cloud:
config:
server:
aws-secretsmanager:
region: us-east-1
endpoint: https://us-east-1.console.aws.amazon.com/
origin: aws:secrets:
prefix: /secret/foo
profileSeparator: _
AWS Secrets Manager API 凭证是使用默认凭证提供程序链确定的。
|
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 client-id 应具有 as 范围。credhub.read |
复合环境存储库
在某些情况下,您可能希望从多个环境存储库中提取配置数据。
为此,您可以在配置服务器的应用程序属性或 YAML 文件中启用配置文件。
例如,如果要从 Subversion 存储库和两个 Git 存储库中提取配置数据,则可以为配置服务器设置以下属性:composite
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
使用此配置时,优先级由存储库在密钥下列出的顺序决定。
在上面的示例中,首先列出了 Subversion 存储库,因此在 Subversion 存储库中找到的值将覆盖在其中一个 Git 存储库中找到的相同属性的值。
在 Git 存储库中找到的值将在 Git 存储库中为同一属性找到的值之前使用。composite
rex
walter
如果您只想从每个不同类型的存储库中提取配置数据,则可以在配置服务器的应用程序属性或 YAML 文件中启用相应的配置文件,而不是配置文件。
例如,如果要从单个 Git 存储库和单个 HashiCorp Vault 服务器中提取配置数据,则可以为配置服务器设置以下属性:composite
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 |
使用复合环境时,所有存储库都包含相同的标签非常重要。
如果您有一个与前面示例中类似的环境,并且您请求带有标签的配置数据,但 Subversion 存储库不包含名为 的分支,则整个请求将失败。master master |
自定义复合环境存储库
除了使用 Spring Cloud 中的环境存储库之一之外,您还可以提供自己的 Bean 作为复合环境的一部分。
为此,您的 bean 必须实现该接口。
如果要在复合环境中控制自定义的优先级,则还应实现接口并覆盖该方法。
如果不实现接口,则 your 的优先级最低。EnvironmentRepository
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 客户端提供了有用的默认行为。 |
通常,可以通过使用反斜杠 () 转义 或 .
例如,resolves 为 ,除非应用程序提供自己的 .${} \ $ { \${app.foo:bar} bar app.foo |
在 YAML 中,您无需转义反斜杠本身。 但是,在属性文件中,当您在服务器上配置覆盖时,您确实需要转义反斜杠。 |
您可以通过在远程存储库中设置标志(默认值为 false),将客户端中所有覆盖的优先级更改为更接近默认值,让应用程序在环境变量或系统属性中提供自己的值。spring.cloud.config.overrideNone=true
使用 Bootstrap 覆盖属性
如果启用 config first bootstrap,则可以允许客户端应用程序通过在 来自 Config Server 的 applications 配置。
spring.cloud.config.allowOverride=true
spring.cloud.config.overrideNone=true
启用 Bootstrap 并将这两个属性设置为 true 后,您将能够覆盖来自配置服务器的配置 在 clients 应用程序配置中。
使用占位符覆盖属性
在不启用 config first bootstrap 的情况下覆盖属性的一种更简洁的方法是在来自 config server 的配置中使用属性占位符。
例如,如果来自配置服务器的配置包含以下属性
hello=${app.hello:Hello From Config Server!}
您可以通过在本地应用程序配置中设置来覆盖 from the config server 的值hello
app.hello
app.hello=Hello From Application!
使用配置文件覆盖属性
覆盖来自配置服务器的属性的最后一种方法是在 Client 端中特定于配置文件的配置文件中指定它们 应用。
例如,如果您从配置服务器获得以下配置
hello="Hello From Config Server!"
您可以通过在特定于配置文件的配置文件中设置来覆盖客户端应用程序中 的值,并且
然后启用该配置文件。hello
hello
hello="Hello From Application!"
在上面的示例中,您必须启用配置文件。overrides
运行状况指示器
Config Server 带有一个运行状况指示器,用于检查配置的是否正常工作。
默认情况下,它会请求名为 、配置文件和实施提供的默认标签。EnvironmentRepository
EnvironmentRepository
app
default
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
执行器和安全
一些平台配置健康检查或类似的东西,并指向或其他 actuator 端点。如果 actuator 不是 config server 的依赖项,则对 config server API /{application}/{label} 的请求将匹配,可能会泄露安全信息。请记住,在这种情况下添加spring-boot-starter-actuator 依赖项并配置用户,以便调用/actuator/ 的用户无权访问配置服务器API。/actuator/health /actuator/ /{application}/{label} |
加密和解密
要使用加密和解密功能,您需要在 JVM 中安装全功能 JCE(默认情况下不包含它)。 您可以从 Oracle 下载“Java 加密扩展 (JCE) 无限强度管辖策略文件”并按照安装说明进行操作(实质上,您需要将 JRE lib/security 目录中的两个策略文件替换为您下载的文件)。 |
如果远程属性源包含加密内容(值以 开头 ),则在通过 HTTP 发送到客户端之前,会对其进行解密。
这种设置的主要优点是,当属性值处于 “静态” 状态时(例如,在 git 存储库中),它们不需要是纯文本形式。
如果无法解密某个值,则会将其从属性源中删除,并添加具有相同键但前缀为 的附加属性,该值表示“不适用”(通常)。
这主要是为了防止密文被用作密码并意外泄露。{cipher}
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 存储库,并且密钥密码将受到保护。
服务器还公开和端点(假设它们是安全的,并且只有授权代理才能访问)。
如果您编辑远程配置文件,则可以使用 Config Server 通过对端点进行 POST 来加密值,如以下示例所示:/encrypt
/decrypt
/encrypt
$ curl localhost:8888/encrypt -s -d mysecret 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果你正在使用 curl 进行测试,那么使用 (而不是 ) 并为要加密的值加上前缀(curl 需要这样做)或设置一个显式以确保 curl 在有特殊字符时正确编码数据('+' 特别棘手)。--data-urlencode -d = Content-Type: text/plain |
请确保不要在加密值中包含任何 curl 命令统计信息,这就是示例使用 option 将其静音的原因。将值输出到文件有助于避免此问题。-s |
反向操作也可以通过 (前提是服务器是
配置了对称密钥或完整密钥对),如以下示例所示:/decrypt
$ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda mysecret
在将加密值放入 YAML 或属性文件之前,以及在提交并将其推送到远程(可能不安全)存储之前,获取加密值并添加前缀。{cipher}
和 endpoints 还接受 形式的路径,当客户端调用主环境资源时,这些路径可用于按应用程序(名称)和按配置文件控制加密。/encrypt
/decrypt
/*/{application}/{profiles}
要以这种精细方式控制加密,您还必须提供 of 类型,以便为每个名称和配置文件创建不同的加密程序。
默认情况下提供的密钥不会这样做(所有加密都使用相同的密钥)。@Bean TextEncryptorLocator |
命令行客户端(带有 Spring Cloud CLI 扩展
installed) 也可用于加密和解密,如以下示例所示:spring
$ 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 密钥对)。
非对称选择在安全性方面更胜一筹,但使用对称密钥通常更方便,因为它是在 .application.properties
要配置对称密钥,您需要设置为秘密 String(或使用环境变量使其远离纯文本配置文件)。encrypt.key
ENCRYPT_KEY
如果包含在类路径中或设置为系统属性,则需要在 中设置。spring-cloud-starter-bootstrap spring.cloud.bootstrap.enabled=true encrypt.key bootstrap.properties |
您不能使用 配置非对称密钥。encrypt.key |
要配置非对称密钥,请使用密钥库(例如
由 JDK 附带的实用程序创建)。这
密钥库属性等于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 或更高版本时,使用上述命令时,可能会收到以下警告。在这种情况下
您可能希望确保 AND 值匹配。keypass storepass |
Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -keypass value.
将文件放在 Classpath 中(例如),然后在
您的 ,对于 Config Server,创建以下设置:server.jks
bootstrap.yml
encrypt:
keyStore:
location: classpath:/server.jks
password: letmein
alias: mytestkey
secret: changeme
使用多个密钥和密钥轮换
除了加密属性值中的前缀外,Config Server 还会在(Base64 编码的)密文开始之前查找零个或多个前缀。
密钥被传递给 ,它可以执行查找密码所需的任何逻辑。
如果您已配置密钥库 (),则默认定位器将查找具有前缀提供的别名的密钥,其密文如下所示:{cipher}
{name:value}
TextEncryptorLocator
TextEncryptor
encrypt.keystore.location
key
foo:
bar: `{cipher}{key:testkey}...`
定位器将查找名为 “testkey” 的键。
也可以通过在前缀中使用值来提供密钥。
但是,如果未提供,则默认使用密钥库密码(这是您在构建密钥库且未指定密钥时获得的密码)。
如果您确实提供了密钥,则还应使用自定义 .{secret:…}
SecretLocator
当密钥仅用于加密几个字节的配置数据(即,它们没有在其他地方使用)时,出于加密原因,几乎不需要密钥轮换。
但是,您可能偶尔需要更改密钥(例如,在发生安全漏洞时)。
在这种情况下,所有客户端都需要更改其源配置文件(例如,在 git 中)并在所有密码中使用新前缀。
请注意,客户端需要首先检查密钥别名在 Config Server 密钥库中是否可用。{key:…}
如果要让 Config Server 处理所有加密和解密,还可以将前缀添加为发布到端点的纯文本。{name:value} /encrypt |
提供加密属性
有时您希望 Client 端在本地解密配置,而不是在服务器中解密。
在这种情况下,如果您提供用于查找密钥的配置,则仍可以拥有 和 endpoints,但需要通过将 显式关闭传出属性的解密。
如果您不关心终端节点,则在不配置 key 或 enabled 标志时,它应该可以正常工作。encrypt.*
/encrypt
/decrypt
spring.cloud.config.server.encrypt.enabled=false
bootstrap.[yml|properties]