1.0.0.BUILD-快照
Spring Cloud Config为分布式系统中的外部化配置提供服务器端和客户端支持。使用Config Server,您可以有一个配置中心来跨所有的环境管理应用程序的外部属性。客户端和服务器上的概念等同于Spring Environment
和PropertySource
抽象,因此它们非常适合Spring应用程序,但可以与任何语言运行的任何应用程序一起使用。当应用程序通过部署管道从开发到测试再到生产环境时,您可以管理这些环境之间的配置,并确保应用程序迁移时具有运行所需要的所有内容。服务器存储后端的默认实现使用git,因此它可以轻松支持配置环境的标签版本,以及可用于管理内容的各种工具。添加替代实现并把它们插入Spring配置也很容易。
这个快速入门使用Spring Cloud Config Server的服务器和客户端。
首先,启动服务器,如下所示:
$ cd spring-cloud-config-server
$ ../mvnw spring-boot:run
服务器是一个Spring Boot应用程序,因此如果您愿意,可以从IDE运行它(主类是ConfigServerApplication
)。
接下来尝试一个客户端,如下所示:
$ curl localhost:8888/foo/development
{"name":"foo","label":"master","propertySources":[
{"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
{"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
]}
定位属性源的默认策略是克隆git存储库(在spring.cloud.config.server.git.uri
)并使用它来初始化一个迷你 SpringApplication
。迷你应用程序的Environment
用于枚举属性源并在JSON端点发布它们。
HTTP服务具有以下形式的资源:
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties
其中application
作为spring.config.name被
注入SpringApplication
(在正常的Spring Boot应用程序中通常什么是application),profile
是一个active profile(或逗号分隔的属性列表),并且label
是一个可选的git标签(默认为master
)。
Spring Cloud Config Server从各种来源为远程客户端提取配置。以下示例从git存储库(必须提供)获取配置,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri: https://github.com/spring-cloud-samples/config-repo
其他来源是任何JDBC兼容的数据库,Subversion,Hashicorp Vault,Credhub和本地文件系统。
要在应用程序中使用这些功能,您可以将其构建为依赖于spring-cloud-config-client的Spring Boot应用程序(例如,请参阅config-client或示例应用程序的测试用例)。添加依赖项最方便的方法是使用Spring Boot启动程序org.springframework.cloud:spring-cloud-starter-config
。也有一个父pom和spring-cloud-starter-parent
BOM给Maven用户,以及Gradle和Spring CLI用户使用的Spring IO版本管理属性文件。以下示例显示了典型的Maven配置:
pom.xml中。
org.springframework.boot
spring-boot-starter-parent
{spring-boot-docs-version}
org.springframework.cloud
spring-cloud-dependencies
{spring-cloud-version}
pom
import
org.springframework.cloud
spring-cloud-starter-config
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-maven-plugin
现在您可以创建一个标准的Spring Boot应用程序,例如以下HTTP服务器:
@SpringBootApplication
@RestController
public class Application {
@RequestMapping("/")
public String home() {
return "Hello World!";
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
当此HTTP服务器运行时,它从端口8888上的默认本地配置服务器(如果它正在运行)中获取外部配置。要修改启动行为,您可以使用bootstrap.properties改变config server的位置
(类似于application.properties
但是用于应用程序上下文的引导阶段),如以下示例所示:
spring.cloud.config.uri: http://myconfigserver.com
默认情况下,如果未设置应用程序名称,将使用application
。要修改名称,可以将以下属性添加到bootstrap.properties
文件中:
spring.application.name: myapp
![]() |
设置属性时, |
引导属性在/env
端点中显示为高优先级属性源,如以下示例所示。
$ curl localhost:8080/env
{
"profiles":[],
"configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
"servletContextInitParams":{},
"systemProperties":{...},
...
}
名为configService:
包含foo
值为bar
且优先级最高的属性。
![]() |
属性源名称中的URL是git存储库,而不是配置服务器URL。 |
Spring Cloud Config Server为外部配置(名称 - 值对或等效的YAML内容)提供基于HTTP资源的API。通过使用@EnableConfigServer
注释,服务器可嵌入Spring Boot应用程序中。因此,以下应用程序是配置服务器:
ConfigServer.java。
@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
,如以下示例所示:
application.properties。
server.port: 8888
spring.cloud.config.server.git.uri: file://${user.home}/config-repo
这里${user.home}/config-repo
是包含YAML和属性文件的git存储库。
![]() |
在Windows上,如果文件URL是带有驱动器前缀的绝对值,则需要额外的“/”(例如 |
![]() |
以下清单显示了在前面的示例中创建git存储库的方法。
|
![]() |
使用git存储库的本地文件系统仅用于测试。您应该使用服务器在生产中托管配置存储库。 |
![]() |
如果只保留文本文件,则配置存储库的初始克隆可以快速有效。如果存储二进制文件(尤其是大型文件),则第一次配置请求或服务器中遇到内存不足错误时可能会出现延迟。 |
您应该在哪里存储配置服务器的配置数据?管理此行为的策略是EnvironmentRepository,它
服务于Environment
对象。这Environment
是来自Spring Environment
的域的浅Copy(包括propertySources
作为主要特征)。该Environment
资源由三个参数:
{application}
,映射到客户端的spring.application.name
。{profile}
,映射到客户端的spring.profiles.active
(以逗号分隔的列表)。{label}
,这是标记配置文件版本集的服务器端特性。存储库实现通常表现得像Spring Boot应用程序,从spring.config.name
加载配置文件等于{application}
参数,并且spring.profiles.active
等于{profiles}
参数。配置文件的优先规则也与常规Spring Boot应用程序相同:Active配置文件优先于默认配置文件,如果有多个配置文件,则最后一个配置文件获胜(类似于向Map中添加条目)。
以下示例客户端应用程序具有此引导程序配置:
bootstrap.yml。
spring:
application:
name: foo
profiles:
active: dev,mysql
(像往常一样,Spring Boot应用程序也可以通过环境变量或命令行参数设置这些属性)。
如果存储库是基于文件的,则服务器会从application.yml
(在所有客户端之间共享)和 foo.yml
(foo.yml
优先级更高)创建一个 Environment
。如果YAML文件中包含指向Spring配置文件的文档,则它们有更高的优先级(按列出的配置文件的顺序)。如果存在特定于配置文件的YAML(或属性)文件,则这些文件的优先级也高于默认值。更高的优先级转换为前面提到的Environment的
PropertySource
。(这些相同的规则适用于独立的Spring Boot应用程序。)
您可以将spring.cloud.config.server.accept-empty设置为false,以便在找不到应用程序时,Server将返回HTTP 404状态。默认情况下,此标志设置为true。
默认实现EnvironmentRepository
使用Git后端,这对于管理升级和物理环境以及审计更改非常方便。要更改存储库的位置,可以spring.cloud.config.server.git.uri
在Config Server中设置配置属性(例如,在中application.yml
)。如果你用它设置它file:
前缀,它应该在本地存储库中工作,这样您就可以在没有服务器的情况下快速轻松地开始使用。但是,在这种情况下,服务器直接在本地存储库上运行而不对其进行克隆(如果它不是裸的则无关紧要,因为Config Server从不对“远程”存储库进行更改)。要向上扩展Config Server并使其具有高可用性,您需要让服务器的所有实例指向同一个存储库,因此只有共享文件系统才能工作。即使在这种情况下,最好将ssh:
协议用于共享文件系统存储库,以便服务器可以克隆它并使用本地工作副本作为缓存。
此存储库实现将{label}
HTTP资源的参数映射到git标签(提交标识,分支名称或标记)。如果git分支或标记名称包含斜杠(/
),则应使用特殊字符串指定HTTP URL中的标签(_)
(以避免与其他URL路径不一致)。例如,如果标签是foo/bar
,则替换斜杠将导致以下标签:foo(_)bar
。包含特殊字符串(_)
也可以应用于{application}
参数。如果您使用命令行客户端(如curl),请小心URL中的括号 - 您应该使用单引号('')将它们从shell中转义。
跳过SSL证书验证
通过将git.skipSslValidation
属性设置为true
(默认值为false
),可以禁用配置服务器对Git服务器的SSL证书的验证。
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}
参数中使用特殊字符串“(_)” 可以启用对多个组织的支持,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri:https://github.com/ { application }
其中{application}
被设置在请求时在以下格式:organization(_)application
。
模式匹配和多个存储库
Spring Cloud Config还支持更复杂的需求,并在应用程序和配置文件名称上进行模式匹配。模式格式是{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}
与任何模式都不匹配,则使用下面定义的默认URI spring.cloud.config.server.git.uri
。在上面的示例中,对于“ 简单 ”存储库,模式是simple/*
(它只匹配simple
在所有配置文件中命名的一个应用程序)。在“ 本地 ”库匹配所有应用程序名称开头local
的所有配置文件(该/*
后缀会自动添加到没有档案资料匹配的任何模式)。
![]() |
的“ 单行 ”中所使用的短切“ 简单 ”可以使用例如仅当要设置的唯一属性是URI。如果您需要设置其他任何内容(凭据,模式等),则需要使用完整表单。 |
的pattern
在回购属性实际上是一个数组,所以可以使用一个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'
- '* /生产'
URI:https://github.com/staging/config-repo
![]() |
Spring Cloud猜测包含未结束的配置文件的模式 |
每个存储库还可以选择将配置文件存储在子目录中,并且可以将搜索这些目录的模式指定为searchPaths
。以下示例显示了顶级的配置文件:
spring:
cloud:
config:
server:
git:
uri:https://github.com/spring-cloud-samples/config-repo
searchPaths: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)。如果 |
认证
要在远程存储库上使用HTTP基本身份验证,请单独添加username
和password
属性(不在URL中),如以下示例所示:
spring:
cloud:
config:
server:
git:
uri:https://github.com/spring-cloud-samples/config-repo
用户名:trolley
密码:strongpassword
如果您不使用HTTPS和用户凭据,当您将密钥存储在默认目录(~/.ssh
)中并且URI指向SSH位置(例如,)时,SSH也应该开箱即用[email protected]:configuration/cloud-configuration
。重要的是Git服务器的条目存在于~/.ssh/known_hosts
文件中并且ssh-rsa
格式正确。ecdsa-sha2-nistp256
不支持其他格式(例如)。为了避免意外,您应该确保known_hosts
Git服务器的文件中只有一个条目,并且它与您提供给配置服务器的URL相匹配。如果在URL中使用主机名,则希望文件中具有该主机名(而不是IP)known_hosts
。可以使用JGit访问存储库,因此您在其上找到的任何文档都应该适用。可以设置HTTPS代理设置~/.git/config
或者(与任何其他JVM进程相同)具有系统属性(-Dhttps.proxyHost
和-Dhttps.proxyPort
)。
![]() |
如果您不知道 |
使用AWS CodeCommit进行身份验证
Spring Cloud Config Server还支持AWS CodeCommit身份验证。从命令行使用Git时,AWS CodeCommit使用身份验证帮助程序。此助手不与JGit库一起使用,因此如果Git URI与AWS CodeCommit模式匹配,则会创建AWS CodeCommit的JGit CredentialProvider。AWS CodeCommit URI遵循以下模式://git-codecommit.$ {AWS_REGION} .amazonaws.com / $ {repopath}。
如果您使用AWS CodeCommit URI提供用户名和密码,则它们必须是提供对存储库的访问权限的AWS accessKeyId和secretAccessKey。如果未指定用户名和密码,则使用AWS默认凭据提供程序链检索accessKeyId和secretAccessKey 。
如果您的Git URI与CodeCommit URI模式匹配(如前所示),则必须在用户名和密码中或默认凭据提供程序链支持的某个位置提供有效的AWS凭据。AWS EC2实例可以将IAM角色用于EC2实例。
![]() |
该 |
使用属性进行Git SSH配置
默认情况下,春季云配置服务器使用JGit库使用SSH配置文件,如~/.ssh/known_hosts
和/etc/ssh/ssh_config
通过使用SSH URI连接到Git仓库时。在Cloud Foundry等云环境中,本地文件系统可能是短暂的或不易访问的。对于这些情况,可以使用Java属性设置SSH配置。要激活基于属性的SSH配置,spring.cloud.config.server.git.ignoreLocalSshSettings
必须将该属性设置为true
,如以下示例所示:
spring:
cloud:
config:
server:
git:
uri:git @ gitserver.com:team / repo1.git
ignoreLocalSshSettings:true
hostKey:someHostKey
hostKeyAlgorithm:ssh-rsa
privateKey:|
-----开始RSA私钥-----
MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM + o7ds7FRES5RTjv2RT / JVNJCoqF
OL8 + ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq + ObBBNhg5N + hOwKjjpzdj2Ud
1l 7R + wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
fY6yTiKxFzwb38IQP0ojIUWNrq0 + 9 Xt + NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
BO56 / RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD + valhfD75MxoXU7s3FK7yjxy3rsG
EmfA6tHV8 / 4 a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
5 MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
+ AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ / 28 I4BX / mOSe
pZVnfRixAoGBAO6Uiwt40 / PKs53mCEWngslSCsh9oGAaLTf / XdvMns5VmuyyAyKG
ti8Ol5wqBMi4GIUzjbgUvSUt + IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
xrtWZ9eNj2TsIAMp / svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx / AoGBANYW
dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
PhKpeaeIiAaNnFo8m9aoTKr + 7 I6 / uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
FwlJc / xlFqDusrcHL7abW5qq0L4v3R + FrJw3ZYufzLTVcKfdj6GelwJJO + 8 wBm + R
gTKYJItEhT48duLIfTDyIpHGVm9 + I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
VAykcNgyDvtAVODP + 4 m6JvhjAoGBALbtTqErKN47V0 + JJpapLnF0KxGrqeGIjIRV
cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
KTbTjefRFhVUjQqnucAvfGi29f + 9 oE3Ei9f7wA + H35ocF6JvTYUsHNMIO / 3 gZ38N
CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC /围兜
q0TY3we + ERB40U8Z2BvU61QuwaunJ2 + uGadHo58VSVdggqAo0BSkH58innKKt96J
69 pcVH / 4 rmLbXdcmNYGm6iu + MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
----- END RSA私钥-----
下表介绍了SSH配置属性。
表5.1。SSH配置属性
Property名称 | 备注 |
---|---|
ignoreLocalSshSettings |
如果 |
专用密钥 |
有效的SSH私钥。如果 |
hostKey |
有效的SSH主机密钥。如果 |
hostKeyAlgorithm |
其中一个 |
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
searchPaths:'{application}'
上面的清单导致在存储库中搜索与目录(以及顶层)同名的文件。通配符在带占位符的搜索路径中也有效(搜索中包含任何匹配的目录)。
强行拉入Git存储库
如前所述,Spring Cloud Config Server会在本地副本变脏(例如,OS进程更改文件夹内容)时复制远程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
![]() |
|
删除Git存储库中未跟踪的分支
由于Spring Cloud Config Server在签出分支到本地存储库后具有远程git存储库的克隆(例如,通过标签获取属性),它将永久保留此分支或直到下一个服务器重新启动(这将创建新的本地存储库)。因此可能存在删除远程分支但仍然可以获取其本地副本的情况。如果Spring Cloud Config Server客户端服务启动,--spring.cloud.config.label=deletedRemoteBranch,master
它将从deletedRemoteBranch
本地分支获取属性,但不从master
。
为了保持本地存储库分支的清洁和远程 - deleteUntrackedBranches
可以设置属性。它将使Spring Cloud Config Server 强制从本地存储库中删除未跟踪的分支。例:
spring:
cloud:
config:
server:
git:
uri:https://github.com/spring-cloud-samples/config-repo
deleteUntrackedBranches:true
![]() |
|
Git刷新率
您可以使用控制来控制配置服务器从Git后端获取更新配置数据的频率spring.cloud.config.server.git.refreshRate
。此属性的值以秒为单位指定。默认情况下,该值为0,这意味着配置服务器将在每次请求时从Git存储库获取更新的配置。
![]() |
使用基于VCS的后端(git,svn),文件将被签出或克隆到本地文件系统。默认情况下,它们放在系统临时目录中,前缀为 |
Config Server中还有一个“ 本机 ”配置文件,它不使用Git,但从本地类路径或文件系统(您想要指向的任何静态URL)加载配置文件spring.cloud.config.server.native.searchLocations
。要使用本机配置文件,请启动配置服务器spring.profiles.active=native
。
![]() |
请记住使用 |
![]() |
它的默认值 |
![]() |
文件系统后端非常适合快速入门和测试。要在生产中使用它,您需要确保文件系统可靠并在Config Server的所有实例之间共享。 |
搜索位置可以包含占位符{application}
,{profile}
和{label}
。通过这种方式,您可以隔离路径中的目录并选择对您有意义的策略(例如每个应用程序的子目录或每个配置文件的子目录)。
如果您不在搜索位置使用占位符,则此存储库还会将{label}
HTTP资源的参数附加到搜索路径上的后缀,因此将从每个搜索位置和与该标签同名的子目录中加载属性文件(标记的属性在Spring环境中优先。因此,没有占位符的默认行为与添加以/{label}/
。结尾的搜索位置相同。例如,file:/tmp/config
与...相同file:/tmp/config,file:/tmp/config/{label}
。可以通过设置禁用此行为spring.cloud.config.server.native.addLabelLocations=false
。
Spring Cloud Config Server还支持Vault作为后端。
Vault是一种安全访问机密的工具。秘密就是您要严格控制访问的任何内容,例如API密钥,密码,证书和其他敏感信息。Vault为任何机密提供统一的界面,同时提供严格的访问控制并记录详细的审计日志。
有关Vault的详细信息,请参阅Vault快速入门指南。
要使配置服务器能够使用Vault后端,您可以使用vault
配置文件运行配置服务器。例如,在配置服务器中application.properties
,您可以添加spring.profiles.active=vault
。
默认情况下,配置服务器假定您的Vault服务器运行于http://127.0.0.1:8200
。它还假设后端的名称是secret
,密钥是application
。所有这些默认值都可以在配置服务器中配置application.properties
。下表介绍了可配置的Vault属性:
名称 | 默认值 |
---|---|
host |
127.0.0.1 |
port |
8200 |
scheme |
HTTP |
backend |
secret |
defaultKey |
application |
profileSeparator |
, |
kvVersion |
1 |
skipSslValidation |
false |
timeout |
5 |
namespace |
null |
![]() |
重要 |
---|---|
上表中的所有属性都必须以 |
所有可配置的属性都可以在中找到org.springframework.cloud.config.server.environment.VaultEnvironmentProperties
。
Vault 0.10.0引入了一个版本化的键值后端(k / v后端版本2),它暴露了与早期版本不同的API,它现在需要data/
在挂载路径和实际上下文路径之间并在data
对象中包装秘密。设置kvVersion=2
将考虑到这一点。
(可选)支持Vault Enterprise X-Vault-Namespace
标头。要将其发送到Vault,请设置该namespace
属性。
在配置服务器运行时,您可以向服务器发出HTTP请求以从Vault后端检索值。为此,您需要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”
}
}
]
}
多个属性源
使用Vault时,您可以为应用程序提供多个属性源。例如,假设您已将数据写入Vault中的以下路径:
秘密/对myApp,开发
秘密/对myApp
秘密/应用开发
秘密/应用
写入的属性secret/application
可供使用Config Server的所有应用程序使用。名称为的应用程序myApp
将具有写入secret/myApp
并secret/application
可用的任何属性。如果启用myApp
了dev
配置文件,则可以使用写入所有上述路径的属性,列表中第一个路径中的属性优先于其他路径。
配置服务器可以通过HTTP或HTTPS代理访问Git或Vault后端。通过proxy.http
和下的设置可以控制Git或Vault的此行为proxy.https
。这些设置是每个存储库,因此如果您使用的是复合环境存储库,则必须单独为复合中的每个后端配置代理设置。如果使用需要单独的代理服务器用于HTTP和HTTPS URL的网络,则可以为单个后端配置HTTP和HTTPS代理设置。
下表描述了HTTP和HTTPS代理的代理配置属性。所有这些属性必须以proxy.http
或为前缀proxy.https
。
表5.2。代理配置属性
物业名称 | 备注 |
---|---|
主办 |
代理的主机。 |
港口 |
用于访问代理的端口。 |
nonProxyHosts |
配置服务器应在代理外部访问的任何主机。如果提供两个值 |
用户名 |
用于向代理进行身份验证的用户名。如果提供两个值 |
密码 |
用于向代理进行身份验证的密码。如果提供两个值 |
以下配置使用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'
用户名:myproxyusername
nonProxyHosts:example.com
所有应用程序之间的共享配置因您采用的方法而异,如以下主题中所述:
基于文件的存储库
基于文件(GIT,SVN和本地)仓库,并在文件名的资源application*
(application.properties
,application.yml
,application-*.properties
,等)的所有客户端应用程序之间共享。您可以使用具有这些文件名的资源来配置全局默认值,并根据需要由特定于应用程序的文件覆盖它们。
#_property_overrides [property overrides]功能也可用于设置全局默认值,允许占位符应用程序在本地覆盖它们。
![]() |
使用“ 本机 ”配置文件(本地文件系统后端),您应该使用不属于服务器自身配置的显式搜索位置。否则, |
Vault服务器
使用Vault作为后端时,您可以通过放置配置来与所有应用程序共享配置secret/application
。例如,如果您运行下面的命令库,使用配置服务器的所有应用程序将具有的属性foo
,并baz
提供给他们:
$ vault写秘密/应用程序foo = bar baz = bam
Spring Cloud Config Server支持JDBC(关系数据库)作为配置属性的后端。您可以通过添加spring-jdbc
到类路径并使用jdbc
配置文件或添加类型的bean 来启用此功能JdbcEnvironmentRepository
。如果在类路径中包含正确的依赖项(有关详细信息,请参阅用户指南),Spring Boot会配置数据源。
数据库需要有一个叫做表PROPERTIES
一个名为列APPLICATION
,PROFILE
以及LABEL
(与通常的Environment
意思),再加上KEY
和VALUE
在键和值对Properties
风格。所有字段都是Java中的String类型,因此您可以根据VARCHAR
需要设置它们。属性值的行为方式与它们来自命名的Spring Boot属性文件{application}-{profile}.properties
(包括所有加密和解密)的行为方式相同,后者将作为后处理步骤(即不直接在存储库实现中)应用。
Spring Cloud Config Server支持CredHub作为配置属性的后端。您可以通过向Spring CredHub添加依赖项来启用此功能。
pom.xml中。
org.springframework.credhub groupId>
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:是的,
external.enabled:false
}
![]() |
如果未指定配置文件, |
OAuth 2.0
您可以使用UAA作为提供程序对OAuth 2.0进行身份验证。
pom.xml中。
org.springframework.security groupId>
spring-security-config artifactId>
dependency>
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应具有 |
在某些情况下,您可能希望从多个环境存储库中提取配置数据。为此,您可以composite
在配置服务器的应用程序属性或YAML文件中启用配置文件。例如,如果要从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存储库中的相同属性找到的值之前,将使用Git存储库中找到的值walter
。
如果只想从每个不同类型的存储库中提取配置数据,则可以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
端口:8200
订单:1
使用此配置,优先级可以由order
属性确定。您可以使用该order
属性指定所有存储库的优先级顺序。order
属性的数值越低,它的优先级越高。存储库的优先级顺序有助于解决包含相同属性值的存储库之间的任何潜在冲突。
![]() |
如果复合环境包含Vault服务器,如上例所示,则必须在对配置服务器发出的每个请求中包含Vault令牌。请参阅Vault后端。 |
![]() |
从环境存储库检索值时的任何类型的故障都会导致整个复合环境失败。 |
![]() |
使用复合环境时,所有存储库都必须包含相同的标签。如果您具有与前面示例中的环境类似的环境,并且您使用 |
自定义复合环境存储库
除了使用Spring Cloud中的一个环境存储库之外,您还可以提供自己的EnvironmentRepository
bean作为复合环境的一部分。为此,您的bean必须实现该EnvironmentRepository
接口。如果要EnvironmentRepository
在复合环境中控制自定义的优先级,还应实现该Ordered
接口并覆盖该getOrdered
方法。如果您未实现该Ordered
接口,EnvironmentRepository
则优先级最低。
Config Server具有“ 覆盖 ”功能,允许操作员为所有应用程序提供配置属性。使用普通Spring Boot挂钩的应用程序不会意外更改被覆盖的属性。要声明覆盖,请添加名称 - 值对的映射spring.cloud.config.server.overrides
,如以下示例所示:
spring:
cloud:
config:
server:
overrides:
foo:bar
上述示例使得所有配置客户端应用程序都可以读取foo=bar
,而与其自身配置无关。
![]() |
配置系统不能强制应用程序以任何特定方式使用配置数据。因此,覆盖是不可执行的。但是,它们确实为Spring Cloud Config客户端提供了有用的默认行为。 |
![]() |
通常,Spring环境占位符 |
![]() |
在YAML中,您不需要逃避反斜杠本身。但是,在属性文件中,在服务器上配置替代时,需要转义反斜杠。 |
您可以通过spring.cloud.config.overrideNone=true
在远程存储库中设置标志(默认值为false),将客户端中所有覆盖的优先级更改为更像默认值,让应用程序在环境变量或系统属性中提供自己的值。
Config Server附带一个运行状况指示器,用于检查配置EnvironmentRepository
是否正常。默认情况下,它会询问EnvironmentRepository
名为的应用程序app
,default
配置文件以及EnvironmentRepository
实现提供的默认标签。
您可以配置运行状况指示器以检查更多应用程序以及自定义配置文件和自定义标签,如以下示例所示:
spring:
cloud:
config:
server:
health:
repositories:
myservice:
label:mylabel
myservice-dev:
name:myservice
profiles:development
您可以通过设置禁用健康指标spring.cloud.config.server.health.enabled=false
。
您可以以对您有意义的任何方式保护您的Config Server(从物理网络安全到OAuth2承载令牌),因为Spring Security和Spring Boot为许多安全安排提供支持。
要使用默认的Spring Boot配置的HTTP Basic安全性,请在类路径中包含Spring Security(例如,通过spring-boot-starter-security
)。默认值是用户名user
和随机生成的密码。随机密码在实践中没有用,因此我们建议您配置密码(通过设置spring.security.user.password
)并对其进行加密(有关如何执行此操作的说明,请参阅下文)。
![]() |
重要 |
---|---|
要使用加密和解密功能,您需要在JVM中安装全功能JCE(默认情况下不包括它)。您可以从Oracle 下载“ Java Cryptography Extension(JCE)Unlimited Strength Jurisdiction Policy Files ”并按照安装说明进行操作(实质上,您需要将JRE lib / security目录中的两个策略文件替换为您下载的那些)。 |
如果远程属性源包含加密内容(以...开头的值{cipher}
),则在通过HTTP发送到客户端之前对它们进行解密。此设置的主要优点是,属性值在“ 静止 ”时不必是纯文本格式(例如,在git存储库中)。如果某个值无法解密,则会从属性源中删除invalid
该值,并添加一个附加属性,该属性具有相同的键但前缀为“ 不适用 ”(通常
)的值。这主要是为了防止密文被用作密码并意外泄露。
如果为配置客户端应用程序设置远程配置存储库,则它可能包含application.yml
类似于以下内容:
application.yml。
spring:
datasource:
用户名:dbuser
密码:'{cipher} FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
.properties文件中的加密值不得用引号括起来。否则,该值不会被解密。以下示例显示了可行的值:
application.properties。
spring.datasource.username:dbuser
spring.datasource.password:{cipher} FKSAJDFGYOS8F7GLHAKERGFHLSAJ
您可以安全地将此纯文本推送到共享的git存储库,并且密码保密。
服务器还公开/encrypt
和/decrypt
终止(假设这些是安全的并且只能由授权代理访问)。如果编辑远程配置文件,则可以使用Config Server通过POST到/encrypt
端点来加密值,如以下示例所示:
$ curl localhost:8888 / encrypt -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
![]() |
如果您加密的值中包含需要进行URL编码的字符,则应使用该 |
![]() |
请确保不要在加密值中包含任何curl命令统计信息。将值输出到文件可以帮助避免此问题。 |
通过/decrypt
(如果服务器配置了对称密钥或完整密钥对),也可以使用反向操作,如以下示例所示:
$ curl localhost:8888 / decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的秘密
![]() |
如果你使用curl进行测试,那么使用 |
获取加密值并添加{cipher}
前缀,然后再将其放入YAML或属性文件中,然后再提交并将其推送到远程(可能不安全)存储。
该/encrypt
和/decrypt
终点还兼有接受的形式路径/*/{name}/{profiles}
,它可以用来控制每个应用程序(名称)加密和每个配置文件的基础,当客户打电话到主环境资源。
![]() |
要以这种精细的方式控制加密,您还必须提供一种 |
该spring
命令行客户机(安装弹簧云CLI扩展)也可以用于加密和解密,因为显示在下面的例子:
$ spring加密mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
我的秘密
要在文件中使用密钥(例如用于加密的RSA公钥),请在密钥值前加上“@”并提供文件路径,如以下示例所示:
$ spring encrypt mysecret --key @ $ {HOME} /.ssh / id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv / QHiY5sI2dRcR + ...
![]() |
该 |
Config Server可以使用对称(共享)密钥或非对称密钥(RSA密钥对)。非对称选择在安全性方面是优越的,但是使用对称密钥通常更方便,因为它是在单元中配置的单个属性值bootstrap.properties
。
要配置对称密钥,需要设置encrypt.key
为秘密字符串(或使用ENCRYPT_KEY
环境变量使其不受纯文本配置文件的影响)。
![]() |
您无法使用配置非对称密钥 |
要配置非对称密钥,请使用密钥库(例如,由keytool
JDK附带的实用程序创建)。密钥存储属性是encrypt.keyStore.*
与*
等于
属性 | 描述 |
---|---|
|
包含一个 |
|
保存解锁密钥库的密码 |
|
标识要使用的商店中的哪个键 |
|
要创建的KeyStore的类型。默认为 |
加密是使用公钥完成的,并且需要私钥进行解密。因此,原则上,如果您只想加密(并准备在本地使用私钥解密值),则只能在服务器中配置公钥。实际上,您可能不希望在本地进行解密,因为它会围绕所有客户端传播密钥管理过程,而不是将其集中在服务器中。另一方面,如果您的配置服务器相对不安全且只有少数客户端需要加密属性,那么它可能是一个有用的选项。
要创建用于测试的密钥库,可以使用类似于以下内容的命令:
$ keytool -genkeypair -alias mytestkey -keyalg RSA \
-dname“CN = Web服务器,OU =单位,O =组织,L =城市,S =州,C = US”
-keypass changeme -keystore server.jks -storepass letmein
将server.jks
文件放在类路径中(例如),然后在您bootstrap.yml
的Config Server中创建以下设置:
encrypt:
keyStore:
location:classpath:/server.jks
密码:letmein
别名:mytestkey
secret:changeme
除了{cipher}
加密属性值中的前缀之外,Config Server 还会{name:value}
在(Base64编码的)密码文本开始之前查找零个或多个前缀。密钥传递给a TextEncryptorLocator
,它可以执行TextEncryptor
为密码定位所需的任何逻辑。如果已配置密钥库(encrypt.keystore.location
),则默认定位器将查找具有key
前缀提供的别名的密钥,密码文本类似于以下内容:
foo:
bar:`{cipher} {key:testkey} ...`
定位器查找名为“testkey”的密钥。也可以使用{secret:…}
前缀中的值来提供秘密。但是,如果未提供,则默认使用密钥库密码(这是您在构建密钥库时未获得的密码)。如果您确实提供了秘密,则还应使用自定义加密秘密SecretLocator
。
当密钥仅用于加密几个字节的配置数据时(即,它们未在其他地方使用),在加密方面几乎不需要密钥轮换。但是,您可能偶尔需要更改密钥(例如,在发生安全漏洞的情况下)。在这种情况下,所有客户端都需要更改其源配置文件(例如,在git中)并{key:…}
在所有密码中使用新的前缀。请注意,客户端需要首先检查Config Server密钥库中的密钥别名是否可用。
![]() |
如果您想让Config Server处理所有加密和解密, |
有时您希望客户端在本地解密配置,而不是在服务器中执行此操作。在这种情况下,如果你提供的encrypt.*
配置定位的关键,你仍然可以拥有/encrypt
和/decrypt
终点,但你需要通过将明确地关掉传出性质的解密spring.cloud.config.server.encrypt.enabled=false
在bootstrap.[yml|properties]
。如果您不关心端点,那么如果您不配置密钥或启用标志,它应该可以工作。