注意:aws-java-sdk-core jar是一个可选的依赖关系。如果aws-java-sdk-core jar不在您的类路径上,则无论git服务器URI如何,都将不会创建AWS代码提交凭据提供程序。
Git搜索路径中的占位符
Spring Cloud Config服务器还支持{application}
和{profile}
(以及{label}
(如果需要))占位符的搜索路径。例:
spring:
cloud:
config:
server:
uri: https://github.com/spring-cloud-samples/config-repo
searchPaths: '{application}'
在资源库中搜索与目录(以及顶级)相同名称的文件。通配符在具有占位符的搜索路径中也是有效的(搜索中包含任何匹配的目录)。
力拉入Git存储库
如前所述Spring Cloud Config服务器克隆远程git存储库,如果某种方式本地副本变脏(例如,由操作系统进程更改文件夹内容),则Spring Cloud Config服务器无法从远程存储库更新本地副本。
要解决这个问题,有一个force-pull
属性将使Spring Cloud Config Server强制从远程存储库中提取,如果本地副本是脏的。例:
spring:
cloud:
config:
server:
uri: https://github.com/spring-cloud-samples/config-repo
force-pull: true
如果您有多个存储库配置,则可以为每个存储库配置force-pull
属性。例:
spring:
cloud:
config:
server:
uri: https://git/common/config-repo.git
force-pull: true
repos:
team-a:
pattern: team-a-*
uri: http://git/team-a/config-repo.git
force-pull: true
team-b:
pattern: team-b-*
uri: http://git/team-b/config-repo.git
force-pull: true
team-c:
pattern: team-c-*
uri: http://git/team-a/config-repo.git
搜索位置可以包含{application}
,{profile}
和{label}
的占位符。以这种方式,您可以隔离路径中的目录,并选择一个有用的策略(例如每个应用程序的子目录或每个配置文件的子目录)。
如果您不在搜索位置使用占位符,则该存储库还将HTTP资源的{label}
参数附加到搜索路径上的后缀,因此属性文件将从每个搜索位置加载并具有相同名称的子目录作为标签(标签属性在Spring环境中优先)。因此,没有占位符的默认行为与添加以/{label}/. For example `file:/tmp/config
结尾的搜索位置的添加与file:/tmp/config,file:/tmp/config/{label}
相同
Vault后端
Spring Cloud Config服务器还支持Vault作为后端。
要使配置服务器使用Vault后端,必须使用vault
配置文件运行配置服务器。例如在配置服务器的application.properties
中,您可以添加spring.profiles.active=vault
。
默认情况下,配置服务器将假定您的Vault服务器正在运行http://127.0.0.1:8200
。它还将假设后端名称为secret
,密钥为application
。所有这些默认值都可以在配置服务器的application.properties
中配置。以下是可配置的Vault属性表。所有属性前缀为spring.cloud.config.server.vault
。
所有可配置的属性可以在org.springframework.cloud.config.server.environment.VaultEnvironmentRepository
中找到。
运行您的配置服务器,您可以向服务器发出HTTP请求,以从Vault后端检索值。为此,您将需要一个令牌为您的Vault服务器。
首先将一些数据放在你身上Vault。例如
$ vault write secret/application foo=bar baz=bam
$ vault write 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中的以下路径。
secret/myApp,dev
secret/myApp
secret/application,dev
secret/application
写入secret/application
的属性可
用于使用配置服务器的所有应用程序。名称为myApp
的应用程序将具有写入secret/myApp
和secret/application
的任何属性。当myApp
启用dev
配置文件时,写入所有上述路径的属性将可用,列表中第一个路径中的属性优先于其他路径。
基于文件的存储库
使用基于文件(即git,svn和native)的存储库,所有客户端应用程序(application.properties
,application.yml
,application-*.properties
等))共享文件名为application*
的资源。您可以使用这些文件名的资源来配置全局默认值,并根据需要将其覆盖应用程序特定的文件。
#_property_overrides [属性覆盖]功能也可用于设置全局默认值,并且允许占位符应用程序在本地覆盖它们。
配置服务器附带运行状况指示器,检查配置的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
来禁用运行状况指示器。
您可以以任何对您有意义的方式(从物理网络安全性到OAuth2承载令牌)来保护您的Config Server,而Spring Security和Spring Boot可以轻松做任何事情。
要使用默认的Spring Boot配置的HTTP Basic安全性,只需在类路径中包含Spring Security(例如,通过spring-boot-starter-security
)。默认是“user”的用户名和随机生成的密码,这在实践中不会非常有用,因此我们建议您配置密码(通过security.user.password
)进行加密(有关以下内容的说明,请参阅以下内容)怎么做)。
加密和解密
如果远程属性源包含加密内容(以{cipher}
开头的值)),则在通过HTTP发送给客户端之前,它们将被解密。这种设置的主要优点是,当它们“静止”时,属性值不必是纯文本(例如在git仓库中)。如果值无法解密,则从属性源中删除该值,并添加具有相同键的附加属性,但以“无效”作为前缀。和“不适用”的值(通常为“<n / a>”)。这主要是为了防止密码被用作密码并意外泄漏。
如果要为配置客户端应用程序设置远程配置存储库,可能会包含一个application.yml
,例如:
application.yml
spring:
datasource:
username: dbuser
password: '{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
$ curl localhost:8888/decrypt -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
$ spring encrypt mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
要在文件中使用密钥(例如用于加密的RSA公钥),使用“@”键入键值,并提供文件路径,例如
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
关键参数是强制性的(尽管有一个--
前缀)。
Config Server可以使用对称(共享)密钥或非对称密钥(RSA密钥对)。非对称选择在安全性方面是优越的,但是使用对称密钥往往更方便,因为它只是配置的一个属性值。
要配置对称密钥,您只需要将encrypt.key
设置为一个秘密字符串(或使用环境变量ENCRYPT_KEY
将其保留为纯文本配置文件)。
要配置非对称密钥,您可以将密钥设置为PEM编码的文本值(encrypt.key
)或通过密钥库(例如由JDK附带的keytool
实用程序创建)。密钥库属性为encrypt.keyStore.*
,*
等于
$ 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
将server.jks
文件放在类路径(例如)中,然后在配置服务器的application.yml
中:
encrypt:
keyStore:
location: classpath:/server.jks
password: letmein
alias: mytestkey
secret: changeme
定位器将寻找一个名为“testkey”的键。也可以通过前缀中的{secret:…}
值提供一个秘密,但是如果不是默认值,则使用密钥库密码(这是您构建密钥存储并且不指定密码时获得的密码)。如果你这样做
提供一个秘密建议你也加密使用自定义SecretLocator
的秘密。
如果密钥只用于加密几个字节的配置数据(即它们没有在其他地方使用),则密码转换几乎不是必需的,但是如果存在安全漏洞,有时您可能需要更改密钥实例。在这种情况下,所有客户端都需要更改其源配置文件(例如git),并在所有密码中使用新的{key:…}
前缀,当然,先检查配置服务器密钥库中的密钥别名可用。
来自环境端点的默认JSON格式对于Spring应用程序的消耗是完美的,因为它直接映射到Environment
抽象。如果您喜欢,可以通过向资源路径(“.yml”,“.yaml”或“.properties”)添加后缀来使用与YAML或Java属性相同的数据。这对于不关心JSON端点的结构的应用程序的消费或其提供的额外的元数据可能是有用的,例如,不使用Spring的应用程序可能会受益于此方法的简单性。
YAML和属性表示有一个额外的标志(作为布尔查询参数resolvePlaceholders
提供)),以标示Spring ${…}
形式的原始文档中的占位符信号,在渲染之前应尽可能在输出中解析。这对于不了解Spring占位符约定的消费者来说是一个有用的功能。
您的应用程序可能不需要使用Environment
抽象(或YAML中的其他替代表示形式或属性格式),而是根据自己的环境需要通用的纯文本配置文件。配置服务器通过/{name}/{profile}/{label}/{path}
中的附加端点提供这些服务,其中“name”,“profile”和“label”的含义与常规环境端点相同,但“path”是文件名(例如log.xml
)。此端点的源文件位于与环境端点相同的方式:与属性或YAML文件相同的搜索路径,而不是聚合所有匹配的资源,只返回匹配的第一个。
资源位置后,使用正常格式(${…}
)的占位符使用提供的应用程序名称,配置文件和标签的有效Environment
来解析。以这种方式,资源端点与环境端点紧密集成。例如,如果您有一个GIT(或SVN)资源库的布局:
application.yml
nginx.conf
其中nginx.conf
看起来像这样:
server {
listen 80;
server_name ${nginx.server.name};
和application.yml
这样:
nginx:
server:
name: example.com
spring:
profiles: development
nginx:
server:
name: develop.com
那么/foo/default/master/nginx.conf
资源如下所示:
server {
listen 80;
server_name example.com;
和/foo/development/master/nginx.conf
如下所示:
server {
listen 80;
server_name develop.com;
要更改服务器端点的位置,您可以(可选)设置spring.cloud.config.server.prefix
,例如“/ config”,以提供前缀下的资源。前缀应该开始但不以“/”结尾。它应用于Config Server中的@RequestMappings
(即Spring Boot前缀server.servletPath
和server.contextPath
)之下。
如果您想直接从后端存储库(而不是从配置服务器)读取应用程序的配置,这基本上是一个没有端点的嵌入式配置服务器。如果不使用@EnableConfigServer
注释(只设置spring.cloud.config.server.bootstrap=true
),则可以完全关闭端点。
许多源代码存储库提供程序(例如Github,Gitlab或Bitbucket)将通过webhook通知您存储库中的更改。您可以通过提供商的用户界面将webhook配置为URL和一组感兴趣的事件。例如,
Github
将使用包含提交列表的JSON主体和“X-Github-Event”等于“push”的头文件发送到webhook。如果您在spring-cloud-config-monitor
库中添加依赖关系并激活配置服务器中的Spring Cloud Bus,则启用“/ monitor”端点。
当Webhook被激活时,配置服务器将发送一个RefreshRemoteApplicationEvent
针对他认为可能已经改变的应用程序。变更检测可以进行策略化,但默认情况下,它只是查找与应用程序名称匹配的文件的更改(例如,“foo.properties”针对的是“foo”应用程序,“application.properties”针对所有应用程序) 。如果要覆盖该行为的策略是PropertyPathNotificationExtractor
,它接受请求标头和正文作为参数,并返回更改的文件路径列表。
默认配置与Github,Gitlab或Bitbucket配合使用。除了Github,Gitlab或Bitbucket的JSON通知之外,您还可以通过使用表单编码的身体参数path={name}
通过POST为“/ monitor”来触发更改通知。这将广播到匹配“{name}”模式的应用程序(可以包含通配符)。
一个Spring Boot应用程序可以立即利用Spring Config Server(或应用程序开发人员提供的其他外部属性源),并且还将获取与Environment
更改事件相关的一些其他有用功能。
配置第一引导
这是在类路径中具有Spring Cloud Config Client的任何应用程序的默认行为。当配置客户端启动时,它将通过配置服务器(通过引导配置属性spring.cloud.config.uri
)绑定并使用远程属性源初始化Spring Environment
。
这样做的最终结果是所有想要使用配置服务器的客户端应用程序都需要spring.cloud.config.uri
(默认为“http:// localhost:8888”)的bootstrap.yml
(或环境变量) )。
发现第一个引导
如果您正在使用“DiscoveryClient”实现,例如Spring Cloud Netflix和Eureka Service Discovery或Spring Cloud Consul(Spring Cloud Zookeeper还不支持此功能),那么您可以让Config Server注册Discovery Discovery,但在默认的“配置优先”模式下,客户端将无法利用注册。
如果您希望使用DiscoveryClient
找到Config Server,可以通过设置spring.cloud.config.discovery.enabled=true
(默认为“false”)来实现。最终的结果是客户端应用程序都需要具有适当的发现配置的bootstrap.yml
(或环境变量)。例如,使用Spring Cloud Netflix,您需要定义Eureka服务器地址,例如eureka.client.serviceUrl.defaultZone
。使用此选项的价格是启动时额外的网络往返,以定位服务注册。好处是配置服务器可以更改其坐标,只要发现服务是一个固定点。默认的服务标识是“configserver”,但是您可以使用spring.cloud.config.discovery.serviceId
在客户端上进行更改(在服务器上可以通过设置spring.application.name
以通常方式更改服务。
发现客户端实现都支持某种元数据映射(例如,对于Eureka,我们有eureka.instance.metadataMap
)。可能需要在其服务注册元数据中配置Config Server的一些其他属性,以便客户端可以正确连接。如果使用HTTP Basic安全配置服务器,则可以将凭据配置为“用户名”和“密码”。并且如果配置服务器具有上下文路径,您可以设置“configPath”。例如,对于作为Eureka客户端的配置服务器:
bootstrap.yml
eureka:
instance:
metadataMap:
user: osufhalskjrtl
password: lviuhlszvaorhvlo5847
configPath: /config
如果您在Cloud Foundry部署应用程序,则提供密码的最佳方式是通过服务凭证(例如URI),因为它甚至不需要在配置文件中。在Cloud Foundry上为本地工作的用户提供的服务的一个例子,名为“configserver”:
bootstrap.yml
spring:
cloud:
config:
uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}
如果您使用另一种形式的安全性,则可能需要向ConfigServicePropertySourceLocator
提供RestTemplate
(例如,通过在引导上下文中获取它并注入一个)。ConfigServicePropertySourceLocator
提供{249 /}(例如通过在引导上下文中获取它并注入)。
配置客户端提供尝试从配置服务器加载配置的Spring Boot运行状况指示器。可以通过设置health.config.enabled=false
来禁用运行状况指示器。由于性能原因,响应也被缓存。默认缓存生存时间为5分钟。要更改该值,请设置health.config.time-to-live
属性(以毫秒为单位)。
提供自定义RestTemplate
在某些情况下,您可能需要从客户端自定义对配置服务器的请求。通常这涉及传递特殊的Authorization
标头来对服务器的请求进行身份验证。要提供自定义RestTemplate
,请按照以下步骤操作。
public class CustomConfigServiceBootstrapConfiguration {
@Bean
public ConfigClientProperties configClientProperties() {
ConfigClientProperties client = new ConfigClientProperties(this.environment);
client.setEnabled(false);
return client;
@Bean
public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
ConfigClientProperties clientProperties = configClientProperties();
ConfigServicePropertySourceLocator configServicePropertySourceLocator = new ConfigServicePropertySourceLocator(clientProperties);
configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
return configServicePropertySourceLocator;
Vault
当使用Vault作为配置服务器的后端时,客户端将需要为服务器提供令牌以从Vault中检索值。可以通过在bootstrap.yml
中设置spring.cloud.config.token
来在客户端中提供此令牌。
bootstrap.yml
spring:
cloud:
config:
token: YourVaultToken