复合环境存储库
在某些情况下,您可能希望从多个环境存储库中提取配置数据。 为此,可以在配置服务器的应用程序属性或 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
使用此配置,优先级由存储库在 key 下列出的顺序决定。 在上面的例子中,首先列出了 Subversion 存储库,因此在 Subversion 存储库中找到的值将覆盖在其中一个 Git 存储库中找到的相同属性的值。 在 Git 存储库中找到的值将先于在 Git 存储库中找到相同属性的值之前使用。composite
rex
walter
如果只想从每种不同类型的存储库中提取配置数据,则可以在配置服务器的应用程序属性或 YAML 文件中启用相应的配置文件,而不是配置文件。 例如,如果要从单个 Git 存储库和单个 HashiCorp 保管库服务器中提取配置数据,则可以为配置服务器设置以下属性: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 令牌。请参阅保管库后端。 |
从环境存储库检索值时,任何类型的故障都会导致整个复合环境失败。 如果您希望即使在存储库失败时也能继续组合,则可以设置为 。 |
使用复合环境时,所有存储库都必须包含相同的标签。 如果您有一个与前面示例类似的环境,并且您使用标签请求配置数据,但 Subversion 存储库不包含调用的分支,那么整个请求将失败。 |
自定义复合环境存储库
除了使用 Spring Cloud 中的环境存储库之一之外,您还可以提供自己的 bean 作为复合环境的一部分包含在内。 为此,您的 Bean 必须实现接口。 如果要在复合环境中控制自定义的优先级,则还应实现接口并覆盖该方法。 如果您不实现接口,则您的优先级最低。EnvironmentRepository
EnvironmentRepository
EnvironmentRepository
Ordered
getOrdered
Ordered
EnvironmentRepository
属性覆盖
配置服务器具有“替代”功能,允许操作员为所有应用程序提供配置属性。 使用正常的 Spring 引导钩子的应用程序不会意外更改被覆盖的属性。 若要声明替代,请将名称/值对的映射添加到,如以下示例所示:spring.cloud.config.server.overrides
spring:
cloud:
config:
server:
overrides:
foo: bar
前面的示例使作为配置客户端的所有应用程序读取,而与它们自己的配置无关。foo=bar
配置系统不能强制应用程序以任何特定方式使用配置数据。 因此,覆盖是不可强制执行的。 但是,它们确实为 Spring Cloud Config 客户端提供了有用的默认行为。 |
通常,Spring 环境占位符可以通过使用反斜杠 () 进行转义来转义(并在客户端上解析)。 例如,解析为,除非应用提供自己的应用。 |
在 YAML 中,不需要转义反斜杠本身。 但是,在属性文件中,在服务器上配置替代时,确实需要转义反斜杠。 |
您可以通过在远程存储库中设置标志(默认值为 false),将客户端中所有覆盖的优先级更改为更像默认值,让应用程序在环境变量或系统属性中提供自己的值。spring.cloud.config.overrideNone=true
健康指示器
配置服务器附带一个运行状况指示器,用于检查配置是否正常工作。 默认情况下,它要求一个名为的应用程序、配置文件和实现提供的默认标签。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持有者令牌),因为Spring Security和Spring Boot提供了对许多安全安排的支持。
要使用默认的 Spring 引导配置的 HTTP 基本安全性,请在类路径中包含 Spring 安全性(例如,通过)。 默认值为 的用户名和随机生成的密码。随机密码在实践中没有用,因此我们建议您配置密码(通过设置)并对其进行加密(有关如何执行此操作的说明,请参阅下文)。spring-boot-starter-security
user
spring.security.user.password
执行器和安全
某些平台配置运行状况检查或类似内容,并指向其他执行器端点。如果执行器不是配置服务器的依赖项,则请求将与配置服务器API/{ |
加密和解密
要使用加密和解密功能,您需要在 JVM 中安装全强度 JCE(默认情况下不包括它)。 您可以从 Oracle 下载“Java 加密扩展 (JCE) 无限强度管辖策略文件”并按照安装说明进行操作(本质上,您需要将 JRE lib/security 目录中的两个策略文件替换为下载的文件)。 |
如果远程属性源包含加密内容(以 开头的值),则在通过 HTTP 发送到客户端之前对其进行解密。 此设置的主要优点是,属性值在“静止”时(例如,在 git 存储库中)不必为纯文本。 如果无法解密某个值,则会从属性源中删除该值,并添加具有相同键但前缀为“不适用”的值(通常)的其他属性。 这主要是为了防止密文被用作密码并意外泄漏。{cipher}
invalid
<n/a>
如果为配置客户端应用程序设置远程配置存储库,则它可能包含类似于以下内容的内容:application.yml
应用程序.yml
spring:
datasource:
username: dbuser
password: '{cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ'
文件中的加密值不得用引号括起来。否则,不会解密该值。以下示例显示了有效的值:application.properties
应用程序属性
spring.datasource.username: dbuser
spring.datasource.password: {cipher}FKSAJDFGYOS8F7GLHAKERGFHLSAJ
您可以安全地将此纯文本推送到共享的 git 存储库,并且密钥密码仍然受到保护。
服务器还会公开 sandendpoint(假设这些端点是安全的,并且只能由授权代理访问)。 如果编辑远程配置文件,则可以使用配置服务器通过 POST 到端点来加密值,如以下示例所示:/encrypt
/decrypt
/encrypt
$ curl localhost:8888/encrypt -s -d mysecret
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
如果您使用 curl 进行测试,请使用(而不是)并作为要加密的值添加前缀(curl 需要这个)或设置显式以确保 curl 在有特殊字符时正确编码数据(“+”特别棘手)。 |
确保不要在加密值中包含任何 curl 命令统计信息,这就是示例使用选项将它们静音的原因。将值输出到文件有助于避免此问题。 |
反向操作也可以通过(前提是服务器是 配置了对称密钥或完整密钥对),如以下示例所示:/decrypt
$ curl localhost:8888/decrypt -s -d 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
在将加密值放入 YAML 或属性文件之前,以及在提交并将其推送到远程(可能不安全)存储之前,获取加密值并添加前缀。{cipher}
Theand端点还都接受以下形式的路径,当客户端调用主环境资源时,这些路径可用于控制每个应用程序(名称)和每个配置文件的加密。/encrypt
/decrypt
/*/{application}/{profiles}
若要以这种精细方式控制加密,还必须提供 aof 类型,该类型为每个名称和配置文件创建不同的加密器。 默认情况下提供的加密不会这样做(所有加密都使用相同的密钥)。 |
命令行客户端(带有 Spring Cloud CLI 扩展) 已安装)也可用于加密和解密,如以下示例所示:spring
$ spring encrypt mysecret --key foo
682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
$ spring decrypt --key foo 682bc583f4641835fa2db009355293665d2647dade3375c0ee201de2a49f7bda
mysecret
要使用文件中的密钥(如用于加密的 RSA 公钥),请在前面加上前缀 带有“@”的键值,并提供文件路径,如以下示例所示:
$ spring encrypt mysecret --key @${HOME}/.ssh/id_rsa.pub
AQAjPgt3eFZQXwt8tsHAVv/QHiY5sI2dRcR+...
参数是强制性的(尽管有前缀)。 |
密钥管理
配置服务器可以使用对称(共享)密钥或非对称密钥(RSA 密钥对)。 非对称选择在安全性方面更胜一筹,但使用对称键通常更方便,因为它是要在其中配置的单个属性值。application.properties
要配置对称密钥,您需要设置为机密字符串(或使用环境变量将其排除在纯文本配置文件之外)。encrypt.key
ENCRYPT_KEY
如果在类路径或 setas 中包含系统属性,则需要设置。 |
不能使用配置非对称密钥。 |
要配置非对称密钥,请使用密钥库(例如 由 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
使用 JDK 11 或更高版本时,使用上述命令时可能会收到以下警告。在这种情况下 您可能希望确保与值匹配。 |
Warning: Different store and key passwords not supported for PKCS12 KeyStores. Ignoring user-specified -keypass value.
例如,将文件放在类路径中,然后在 对于配置服务器,创建以下设置:server.jks
bootstrap.yml
encrypt:
keyStore:
location: classpath:/server.jks
password: letmein
alias: mytestkey
secret: changeme
使用多个密钥和密钥轮换
除了加密属性值中的前缀外,配置服务器还会在 (Base64 编码) 密文开始之前查找零个或多个前缀。 密钥被传递给 a,它可以执行它需要为密码定位的任何逻辑。 如果已配置密钥库 (),那么缺省定位器将查找带有前缀提供的别名的密钥,其密文如下所示:{cipher}
{name:value}
TextEncryptorLocator
TextEncryptor
encrypt.keystore.location
key
foo:
bar: `{cipher}{key:testkey}...`
定位器查找名为“testkey”的键。 还可以通过在前缀中使用 avalue 来提供机密。 但是,如果未提供,那么缺省情况下使用密钥库密码(这是您在构建密钥库时获得的密钥库,并且不指定密钥)。 如果确实提供了机密,则还应使用自定义对机密进行加密。{secret:…}
SecretLocator
当密钥仅用于加密几个字节的配置数据(即,它们未在其他地方使用)时,出于加密原因,几乎不需要密钥轮换。 但是,您可能偶尔需要更改密钥(例如,在发生安全漏洞时)。 在这种情况下,所有客户端都需要更改其源配置文件(例如,在 git 中),并在所有密码中使用 new前缀。 请注意,客户端需要首先检查密钥别名在配置服务器密钥库中是否可用。{key:…}
如果要让配置服务器处理所有加密和解密,还可以将前缀添加为发布到终结点的纯文本。 |
提供加密属性
有时,您希望客户端在本地解密配置,而不是在服务器中解密配置。 在这种情况下,如果您提供配置来查找密钥,您仍然可以拥有 andendpoints,但您需要通过放置来显式关闭传出属性的解密。 如果不关心终结点,则在未配置密钥或启用标志时,它应该可以工作。encrypt.*
/encrypt
/decrypt
spring.cloud.config.server.encrypt.enabled=false
bootstrap.[yml|properties]
提供替代格式
来自环境端点的默认JSON格式非常适合Spring应用程序使用,因为它直接映射到抽象上。 如果您愿意,可以通过向资源路径添加后缀(“.yml”、“.yaml”或“.properties”)来使用与 YAML 或 Java 属性相同的数据。 这对于不关心 JSON 端点的结构或它们提供的额外元数据的应用程序的使用非常有用(例如,不使用 Spring 的应用程序可能会从这种方法的简单性中受益)。Environment
YAML 和属性表示形式有一个附加标志(作为调用的布尔查询参数提供),以指示源文档(在标准 Springform 中)中的占位符应在呈现之前在输出中解析(如果可能)。 对于不了解 Spring 占位符约定的消费者来说,这是一个有用的功能。resolvePlaceholders
${…}
使用 YAML 或属性格式存在限制,主要与元数据丢失有关。 例如,JSON 的结构为属性源的有序列表,其名称与源相关。 YAML 和属性窗体合并到单个映射中,即使值的源具有多个源,并且原始源文件的名称也会丢失。 此外,YAML 表示形式也不一定是后备存储库中 YAML 源的忠实表示形式。它是从平面属性源列表构造的,并且必须对密钥的形式做出假设。 |
提供纯文本
应用程序可能需要针对其环境定制的通用纯文本配置文件,而不是使用抽象(或 YAML 或属性格式的替代表示形式之一)。 配置服务器通过位于 where,的附加终结点提供这些内容,并且与常规环境终结点具有相同的含义,但是是文件名(例如)的路径。 此终端节点的源文件的位置与环境终端节点的源文件相同。 属性和 YAML 文件使用相同的搜索路径。 但是,不会聚合所有匹配的资源,而是仅返回第一个匹配的资源。Environment
/{application}/{profile}/{label}/{path}
application
profile
label
path
log.xml
找到资源后,将使用 validfor 提供的应用程序名称、配置文件和标签解析正常格式 () 的占位符。 通过这种方式,资源终结点与环境终结点紧密集成。${…}
Environment
与环境配置的源文件一样,用于解析文件名。 因此,如果您想要一个特定于配置文件的文件,可以通过调用(优先)的文件来解决。 |
如果不想提供并让服务器使用默认标签,则可以提供 arequest 参数。 因此,前面的配置文件示例可能是。 |
目前,Spring Cloud Config可以为git,SVN,本机后端和AWS S3提供明文。 对 git、SVN 和原生后端的支持是相同的。AWS S3 的工作方式略有不同。 以下各节显示了每个工作原理:
- Git、SVN 和原生后端
- 亚马逊云服务器 S3
Git、SVN 和原生后端
考虑以下 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
来源可能如下:/sample/default/master/nginx.conf
server {
listen 80;
server_name example.com;
}
/sample/development/master/nginx.conf
可能如下所示:
server {
listen 80;
server_name develop.com;
}
亚马逊云服务器 S3
要为 AWS s3 启用纯文本服务,配置服务器应用程序需要包含对 Spring Cloud AWS 的依赖关系。 有关如何设置该依赖项的详细信息,请参阅Spring Cloud AWS 参考指南。 然后,您需要配置 Spring Cloud AWS,如Spring Cloud AWS 参考指南中所述。
解密纯文本
默认情况下,不会解密纯文本文件中的加密值。为了启用纯文本文件的解密,setandinspring.cloud.config.server.encrypt.enabled=true
spring.cloud.config.server.encrypt.plainTextEncrypt=true
bootstrap.[yml|properties]
解密纯文本文件仅支持 YAML、JSON 和属性文件扩展名。 |
如果启用此功能,并且请求不受支持的文件扩展,则不会解密文件中的任何加密值。
嵌入配置服务器
配置服务器作为独立应用程序运行效果最佳。 但是,如果需要,您可以将其嵌入到另一个应用程序中。 为此,请使用注释。 在这种情况下,名为 name 的可选属性可能很有用。 它是一个标志,指示服务器是否应从其自己的远程存储库配置自身。 默认情况下,该标志处于关闭状态,因为它可能会延迟启动。 但是,当嵌入到另一个应用程序中时,以与任何其他应用程序相同的方式进行初始化是有意义的。 设置时,还必须使用复合环境存储库配置。 例如@EnableConfigServer
spring.cloud.config.server.bootstrap
spring.cloud.config.server.bootstrap
true
spring:
application:
name: configserver
profiles:
active: composite
cloud:
config:
server:
composite:
- type: native
search-locations: ${HOME}/Desktop/config
bootstrap: true
如果使用引导标志,则配置服务器需要配置其名称和存储库 URI。 |
若要更改服务器终结点的位置,可以(可选)设置(例如,)在前缀下提供资源。 前缀应以 a 开头,但不以 a 结尾。 它应用于配置服务器(即在 Spring 引导和前缀下)。spring.cloud.config.server.prefix
/config
/
@RequestMappings
server.servletPath
server.contextPath
如果要直接从后端存储库(而不是从配置服务器)读取应用程序的配置,则可以 基本上想要一个没有端点的嵌入式配置服务器。 您可以通过不使用注释 (set) 来完全关闭端点。@EnableConfigServer
spring.cloud.config.server.bootstrap=true
推送通知和春云总线
许多源代码存储库提供商(如Github,Gitlab,Gitea,Gitee,Gogs或Bitbucket)通过webhook通知您存储库中的更改。 您可以通过提供程序的用户界面将 Webhook 配置为 URL 和一组您感兴趣的事件。 例如,Github使用一个POST到webhook,其JSON正文包含一个提交列表和一个标头()设置为。 如果添加对库的依赖关系并在配置服务器中激活 Spring 云总线,则会启用端点。X-Github-Event
push
spring-cloud-config-monitor
/monitor
激活 webhook 后,配置服务器会针对它认为可能已更改的应用程序发送目标。 可以制定策略更改检测。 但是,默认情况下,它会查找与应用程序名称匹配的文件中的更改(例如,面向应用程序,而针对所有应用程序)。 要重写行为时使用的策略是,它接受请求标头和正文作为参数,并返回已更改的文件路径列表。RefreshRemoteApplicationEvent
foo.properties
foo
application.properties
PropertyPathNotificationExtractor
默认配置开箱即用,适用于Github,Gitlab,Gitea,Gitee,Gogs或Bitbucket。 除了来自 Github、Gitlab、Gitee 或 Bitbucket 的 JSON 通知之外,您还可以通过 POST 到 RELEASE 来触发更改通知,其中包含模式中的形式编码的正文参数。 这样做会广播到与模式匹配的应用程序(可以包含通配符)。/monitor
path={application}
{application}
仅当在配置服务器和客户端应用程序中都激活时,才会传输。 |
默认配置还会检测本地 git 存储库中的文件系统更改。在这种情况下,不使用网络钩子。但是,一旦编辑配置文件,就会广播刷新。 |
春云配置客户端
Spring 引导应用程序可以立即利用 Spring 配置服务器(或应用程序开发人员提供的其他外部属性源)。 它还选取了一些与更改事件相关的其他有用功能。Environment
Spring 引导配置数据导入
Spring Boot 2.4引入了一种通过属性导入配置数据的新方法。现在,这是绑定到配置服务器的默认方式。spring.config.import
要选择性地连接到配置服务器,请在 application.properties 中设置以下内容:
应用程序属性
spring.config.import=optional:configserver:
这将连接到默认位置“http://localhost:8888”的配置服务器。删除前缀将导致配置客户端在无法连接到配置服务器时失败。要更改配置服务器的位置,设置或将 url 添加到语句中,例如,。导入属性中的位置优先于 uri 属性。optional:
spring.cloud.config.uri
spring.config.import
spring.config.import=optional:configserver:http://myhost:8888
导入方式的 Spring 引导配置数据方法不需要文件(属性或 yaml)。 |
配置优先引导
要使用传统的引导方式连接到配置服务器,必须通过属性或启动器启用引导。该物业是。必须将其设置为系统属性或环境变量。 启用引导程序后,类路径上具有Spring Cloud Config Client的任何应用程序都将连接到配置服务器,如下所示: 当配置客户端启动时,它会绑定到配置服务器(通过引导配置属性)并使用远程属性源初始化 Spring。spring-cloud-starter-bootstrap
spring.cloud.bootstrap.enabled=true
spring.cloud.config.uri
Environment
此行为的最终结果是,所有想要使用配置服务器的客户端应用程序都需要一个(或环境变量)并设置了服务器地址(默认为“http://localhost:8888”)。bootstrap.yml
spring.cloud.config.uri
发现首次查找
除非您使用配置优先引导程序,否则您需要在配置属性中具有带有前缀的属性。 例如。 |
如果您使用实现,例如Spring Cloud Netflix和Eureka Service Discovery或Spring Cloud Consul,则可以让配置服务器向Discovery Service注册。DiscoveryClient
如果您希望使用来定位配置服务器,可以通过设置(默认值为)来实现。 例如,对于Spring Cloud Netflix,您需要定义Eureka服务器地址(例如,in)。 使用此选项的代价是在启动时进行额外的网络往返,以查找服务注册。 好处是,只要发现服务是固定点,配置服务器就可以更改其坐标。 默认服务 ID 为 ,但您可以在客户端上通过设置(以及在服务器上,以服务的常规方式更改它,例如通过设置)。DiscoveryClient
spring.cloud.config.discovery.enabled=true
false
eureka.client.serviceUrl.defaultZone
configserver
spring.cloud.config.discovery.serviceId
spring.application.name
发现客户端实现都支持某种元数据映射(例如,我们有 Eureka)。 可能需要在其服务注册元数据中配置配置服务器的某些其他属性,以便客户端可以正确连接。 如果配置服务器使用 HTTP Basic 进行保护,则可以将凭据配置为 asand。 此外,如果配置服务器具有上下文路径,则可以设置。 例如,以下 YAML 文件适用于作为 Eureka 客户端的配置服务器:eureka.instance.metadataMap
user
password
configPath
eureka:
instance:
...
metadataMap:
user: osufhalskjrtl
password: lviuhlszvaorhvlo5847
configPath: /config
使用 Eureka 和 WebClient 的 Discovery First Bootstrap
如果您使用 Eurekafrom Spring Cloud Netflix 并且还想使用代替泽西岛或, 您需要包含在类路径中以及设置中。DiscoveryClient
WebClient
RestTemplate
WebClient
eureka.client.webclient.enabled=true
配置客户端快速失败
在某些情况下,如果服务无法连接到配置服务器,则可能需要使服务启动失败。 如果这是所需的行为,请设置引导程序配置属性以使客户端停止并出现异常。spring.cloud.config.fail-fast=true
要使用类似的功能,只需省略前缀即可。 |
配置客户端重试
如果您预计配置服务器在应用程序启动时偶尔可能不可用,则可以让它在失败后继续尝试。 首先,您需要设置。 然后,您需要添加到类路径中。 默认行为是重试六次,初始退避间隔为 1000 毫秒,后续退避的指数乘数为 1.1。 您可以通过设置配置属性来配置这些属性(和其他属性)。spring.cloud.config.fail-fast=true
spring-retry
spring-boot-starter-aop
spring.cloud.config.retry.*
若要完全控制重试行为并使用旧版引导程序,请添加 ID 为 of 的 aof 类型。 Spring Retry 有一个支持创建一个。 |
配置客户端重试 spring.config.import
重试适用于 Spring 引导语句,并且正常属性有效。但是,如果导入语句位于配置文件中,例如,则需要使用其他方法来配置重试。配置需要作为 url 参数放置在导入语句上。spring.config.import
application-prod.properties
应用程序产品属性
spring.config.import=configserver:http://configserver.example.com?fail-fast=true&max-attempts=10&max-interval=1500&multiplier=1.2&initial-interval=1100"
这设置(注意上面缺少的前缀)和所有可用的配置属性。spring.cloud.config.fail-fast=true
spring.cloud.config.retry.*
查找远程配置资源
配置服务提供属性源,其中客户端应用中的默认绑定如下所示:/{application}/{profile}/{label}
- “应用程序” =
${spring.application.name}
- “配置文件” =(实际上
${spring.profiles.active}
Environment.getActiveProfiles()
) - “标签”=“主控”
设置属性时不要在应用名称前面加上保留字,以防止在解析正确的属性源时出现问题。 |
您可以通过设置(whereis,or)覆盖所有这些。 这对于回滚到以前版本的配置很有用。 使用默认的配置服务器实现,它可以是 git 标签、分支名称或提交 ID。 标签也可以以逗号分隔的列表形式提供。 在这种情况下,将逐个尝试列表中的项目,直到成功为止。 在处理功能分支时,此行为可能很有用。 例如,您可能希望将配置标签与分支对齐,但使其可选(在这种情况下,使用)。spring.cloud.config.*
*
name
profile
label
label
spring.cloud.config.label=myfeature,develop
为配置服务器指定多个 URL
为了确保在部署了多个配置服务器实例并预计一个或多个实例不时不可用时高可用性,您可以指定多个 URL(作为属性下的逗号分隔列表)或让所有实例在 Eureka 等服务注册表中注册(如果使用发现优先引导模式)。请注意,这样做仅在配置服务器未运行(即应用程序退出时)或发生连接超时时确保高可用性。例如,如果配置服务器返回 500(内部服务器错误)响应,或者配置客户端从配置服务器收到 401(由于凭据错误或其他原因),则配置客户端不会尝试从其他 URL 提取属性。此类错误表示用户问题,而不是可用性问题。spring.cloud.config.uri
如果在配置服务器上使用 HTTP 基本安全性,则当前仅当您在属性下指定的每个 URL 中嵌入凭据时,才可以支持每个配置服务器的身份验证凭据。如果使用任何其他类型的安全机制,则(当前)无法支持每个配置服务器的身份验证和授权。spring.cloud.config.uri
配置超时
如果要配置超时阈值:
- 可以使用该属性配置读取超时。
spring.cloud.config.request-read-timeout
- 可以使用该属性配置连接超时。
spring.cloud.config.request-connect-timeout
安全
如果在服务器上使用 HTTP 基本安全性,则客户端需要知道密码(如果不是默认值,则需要知道用户名)。 您可以通过配置服务器 URI 或通过单独的用户名和密码属性指定用户名和密码,如以下示例所示:
spring:
cloud:
config:
uri: https://user:[email protected]
以下示例显示了传递相同信息的替代方法:
spring:
cloud:
config:
uri: https://myconfig.mycompany.com
username: user
password: secret
和值将覆盖 URI 中提供的任何内容。spring.cloud.config.password
spring.cloud.config.username
如果您在 Cloud Foundry 上部署应用程序,则提供密码的最佳方式是通过服务凭据(例如在 URI 中,因为它不需要位于配置文件中)。 以下示例适用于本地,适用于 Cloud Foundry 上名为 的 Cloud Foundry 上的用户提供的服务:configserver
spring:
cloud:
config:
uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}
如果配置服务器需要客户端 TLS 证书,则可以通过属性配置客户端 TLS 证书和信任存储,如以下示例所示:
spring:
cloud:
config:
uri: https://myconfig.myconfig.com
tls:
enabled: true
key-store: <path-of-key-store>
key-store-type: PKCS12
key-store-password: <key-store-password>
key-password: <key-password>
trust-store: <path-of-trust-store>
trust-store-type: PKCS12
trust-store-password: <trust-store-password>
需要为 true 才能启用配置客户端 TLS。省略时,将使用 JVM 缺省信任存储区。默认值为 PKCS12。省略密码属性时,将假定密码为空。spring.cloud.config.tls.enabled
spring.cloud.config.tls.trust-store
spring.cloud.config.tls.key-store-type
spring.cloud.config.tls.trust-store-type
如果您使用另一种形式的安全性,则可能需要提供RestTemplate(例如,通过在引导上下文中抓取它并注入它)。ConfigServicePropertySourceLocator
健康指示器
配置客户端提供了一个 Spring 引导运行状况指示器,用于尝试从配置服务器加载配置。 可以通过设置禁用运行状况指示器。 出于性能原因,还会缓存响应。 默认缓存生存时间为 5 分钟。 若要更改该值,请设置属性(以毫秒为单位)。health.config.enabled=false
health.config.time-to-live
提供自定义 RestTemplate
在某些情况下,您可能需要自定义从客户端向配置服务器发出的请求。 通常,这样做涉及传递特殊标头以对服务器的请求进行身份验证。 要提供自定义,请执行以下操作:Authorization
RestTemplate
- 创建一个实现为 的新配置 Bean,如以下示例所示:
PropertySourceLocator
CustomConfigServiceBootstrapConfiguration.java
@Configuration
public class CustomConfigServiceBootstrapConfiguration {
@Bean
public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
ConfigClientProperties clientProperties = configClientProperties();
ConfigServicePropertySourceLocator configServicePropertySourceLocator = new ConfigServicePropertySourceLocator(clientProperties);
configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
return configServicePropertySourceLocator;
}
}
对于添加标头的简化方法,可以改用属性。 |
- 在中,创建一个调用的文件并指定自定义配置,如以下示例所示:
resources/META-INF
spring.factories
弹簧工厂
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration
库
使用 Vault 作为配置服务器的后端时,客户端需要为服务器提供令牌才能从 Vault 检索值。 可以通过 setin 在客户端中提供此令牌,如以下示例所示:spring.cloud.config.token
bootstrap.yml
spring:
cloud:
config:
token: YourVaultToken
保管库中的嵌套密钥
保管库支持将密钥嵌套在存储在保管库中的值中,如以下示例所示:
echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -
此命令将 JSON 对象写入保管库。 要在 Spring 中访问这些值,请使用传统的 dot() 注释,如以下示例所示。.
@Value("${appA.secret}")
String name = "World";
前面的代码会将变量的值设置为 。name
appAsecret