6.提供替代格式
来自环境端点的默认JSON格式非常适合Spring应用程序使用,因为它直接映射到Environment
抽象上。如果您愿意,可以通过向资源路径添加后缀(“.yml”,“。yaml”或“.properties”)来使用与YAML或Java属性相同的数据。对于不关心JSON端点结构或它们提供的额外元数据的应用程序来说,这可能很有用(例如,不使用Spring的应用程序可能会受益于此方法的简单性)。
YAML和属性表示有一个额外的标志(作为一个布尔查询参数提供resolvePlaceholders
),表示源文档中的占位符(在标准的Spring ${…}
表单中)应该在渲染之前在输出中解析,如果可能的话。对于不了解Spring占位符约定的消费者而言,这是一个有用的功能。
![]() |
使用YAML或属性格式存在限制,主要与元数据丢失有关。例如,JSON的结构为属性源的有序列表,其名称与源相关。即使值的来源具有多个源,并且原始源文件的名称丢失,YAML和属性表单也会合并为单个映射。此外,YAML表示不一定是支持存储库中YAML源的忠实表示。它由一系列扁平的财产来源构成,并且必须对钥匙的形式做出假设。 |
7.提供纯文本
Environment
您的应用程序可能需要根据其环境定制的通用纯文本配置文件,而不是使用抽象(或YAML或属性格式中的替代表示之一)。Config Server通过一个额外的端点提供这些端点/{name}/{profile}/{label}/{path}
,其中name
,profile
和,label
具有与常规环境端点相同的含义,但它path
是一个文件名(例如log.xml
)。此端点的源文件的位置与环境端点的方式相同。相同的搜索路径用于属性和YAML文件。但是,不是聚合所有匹配的资源,而是仅返回要匹配的第一个。
找到资源后,${…}
通过使用Environment
提供的应用程序名称,配置文件和标签的有效来解析普通格式()中的占位符。通过这种方式,资源端点与环境端点紧密集成。请考虑以下GIT或SVN存储库示例:
<span style="color:#000000">application.yml
nginx.conf</span>
这里nginx.conf
看起来是这样的:
<span style="color:#000000">服务器{
听80;
server_name $ {nginx.server.name};
}</span>
和application.yml
这样:
<span style="color:#000000"><span style="color:#7f007f">nginx</span>:
<span style="color:#7f007f"> server</span>:
<span style="color:#7f007f"> name</span>:example.com
<span style="color:#3f5f5f"><em>--- </em></span>
<span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> profiles</span>:development
<span style="color:#7f007f">nginx</span>:
<span style="color:#7f007f"> server</span>:
<span style="color:#7f007f"> name</span>:develop.com</span>
该/foo/default/master/nginx.conf
资源可能如下:
<span style="color:#000000">服务器{
听80;
server_name example.com;
}</span>
和/foo/development/master/nginx.conf
这样:
<span style="color:#000000">服务器{
听80;
server_name develop.com;
}</span>
![]() |
与环境配置的源文件一样, |
![]() |
如果您不想提供
|
8.嵌入配置服务器
Config Server作为独立应用程序运行最佳。但是,如果需要,您可以将其嵌入另一个应用程序中。为此,请使用@EnableConfigServer
注释。spring.cloud.config.server.bootstrap
在这种情况下,名为的可选属性很有用。它是一个标志,指示服务器是否应该从自己的远程存储库配置自己。默认情况下,该标志处于关闭状态,因为它可能会延迟启动。但是,当嵌入到另一个应用程序中时,以与任何其他应用程序相同的方式初始化是有意义的。设置时spring.cloud.config.server.bootstrap
,true
还必须使用复合环境存储库配置。例如
<span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> application</span>:
<span style="color:#7f007f"> name</span>:configserver
<span style="color:#7f007f"> profiles</span>:
<span style="color:#7f007f"> active</span>:composite
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> server</span>:
<span style="color:#7f007f"> composite</span>:
<span style="color:#7f007f"> - type</span>:native
<span style="color:#7f007f"> search-locations</span>:$ {HOME} / Desktop / config
<span style="color:#7f007f"> bootstrap</span>:<span style="color:#7f0055"><strong>true</strong></span></span>
![]() |
如果使用bootstrap标志,则配置服务器需要配置其名称和存储库URI |
要更改服务器端点的位置,您可以(可选)设置spring.cloud.config.server.prefix
(例如/config
),以便在前缀下提供资源。前缀应该开始但不以a结尾/
。它应用于@RequestMappings
Config Server中(即Spring Boot server.servletPath
和server.contextPath
前缀下面)。
如果要直接从后端存储库(而不是从配置服务器)读取应用程序的配置,您基本上需要一个没有端点的嵌入式配置服务器。您可以通过不使用@EnableConfigServer
注释(set spring.cloud.config.server.bootstrap=true
)完全关闭端点。
9.推送通知和Spring Cloud Bus
许多源代码存储库提供程序(例如Github,Gitlab,Gitea,Gitee,Gogs或Bitbucket)通过webhook通知您存储库中的更改。您可以通过提供程序的用户界面将webhook配置为URL以及您感兴趣的一组事件。例如,Github使用POST给webhook,其中JSON正文包含一个提交列表和一个header(X-Github-Event
)设置为push
。如果在spring-cloud-config-monitor
库中添加依赖项并在Config Server中激活Spring Cloud Bus,则会/monitor
启用端点。
激活webhook后,Config Server会RefreshRemoteApplicationEvent
针对它认为可能已更改的应用程序发送目标。可以制定变化检测策略。但是,默认情况下,它会查找与应用程序名称匹配的文件中的更改(例如,foo.properties
针对foo
应用程序,而application.properties
针对所有应用程序)。要覆盖行为时使用的策略是PropertyPathNotificationExtractor
,它接受请求标头和正文作为参数,并返回已更改的文件路径列表。
默认配置与Github,Gitlab,Gitea,Gitee,Gogs或Bitbucket开箱即用。除了来自Github,Gitlab,Gitee或Bitbucket的JSON通知之外,您还可以通过POST来/monitor
使用模式中的表单编码的body参数来触发更改通知path={name}
。这样做会广播到匹配{name}
模式的应用程序(可以包含通配符)。
![]() |
该 |
![]() |
默认配置还检测本地git存储库中的文件系统更改。在这种情况下,不使用webhook。但是,只要编辑配置文件,就会广播刷新。 |
10. Spring Cloud Config客户端
Spring Boot应用程序可以立即利用Spring Config Server(或应用程序开发人员提供的其他外部属性源)。它还提供了一些与Environment
更改事件相关的其他有用功能。
10.1配置第一个引导程序
在类路径上具有Spring Cloud Config Client的任何应用程序的默认行为如下所示:当配置客户端启动时,它将绑定到Config Server(通过spring.cloud.config.uri
引导程序配置属性)并Environment
使用远程属性源初始化Spring 。
此行为的最终结果是,所有想要使用Config Server的客户端应用程序都需要一个bootstrap.yml
(或环境变量)设置的服务器地址spring.cloud.config.uri
(默认为“http:// localhost:8888”)。
10.2 Discovery First Bootstrap
如果您使用DiscoveryClient
Spring Cloud Netflix和Eureka Service Discovery或Spring Cloud Consul等实施,则可以将Config Server注册到Discovery Service。但是,在默认的“ Config First ”模式下,客户端无法利用注册。
如果您更喜欢使用DiscoveryClient
以找到配置服务器,可以通过设置spring.cloud.config.discovery.enabled=true
(默认值为false
)来实现。这样做的最终结果是客户端应用程序都需要bootstrap.yml
具有适当发现配置的(或环境变量)。例如,使用Spring Cloud Netflix,您需要定义Eureka服务器地址(例如,in eureka.client.serviceUrl.defaultZone
)。使用此选项的价格是启动时额外的网络往返,以查找服务注册。好处是,只要发现服务是固定点,配置服务器就可以更改其坐标。默认服务ID是configserver
,但您可以通过设置spring.cloud.config.discovery.serviceId
(在服务器上,以通常的方式为服务,例如通过设置spring.application.name
)在客户端上更改它。
发现客户端实现都支持某种元数据映射(例如,我们eureka.instance.metadataMap
为Eureka提供)。可能需要在其服务注册元数据中配置Config Server的一些其他属性,以便客户端可以正确连接。如果使用HTTP Basic保护配置服务器,则可以将凭据配置为user
和password
。此外,如果Config Server具有上下文路径,则可以进行设置configPath
。例如,以下YAML文件用于作为Eureka客户端的Config Server:
bootstrap.yml。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">尤里卡</span>:
<span style="color:#7f007f"> 实例</span>:
...
<span style="color:#7f007f"> metadataMap</span>:
<span style="color:#7f007f"> user</span>:osufhalskjrtl
<span style="color:#7f007f"> 密码</span>:lviuhlszvaorhvlo5847
<span style="color:#7f007f"> configPath</span>:/ config</span></span>
10.3配置客户端快速失败
在某些情况下,如果服务无法连接到Config Server,您可能希望无法启动服务。如果这是所需的行为,请设置bootstrap配置属性spring.cloud.config.fail-fast=true
以使客户端停止并显示异常。
10.4配置客户端重试
如果您希望配置服务器在应用程序启动时偶尔可能不可用,您可以在失败后继续尝试。首先,你需要设置spring.cloud.config.fail-fast=true
。然后你需要添加spring-retry
和spring-boot-starter-aop
你的类路径。默认行为是重试六次,初始退避间隔为1000毫秒,指数乘数为1.1,以便后续退避。您可以通过设置spring.cloud.config.retry.*
配置属性来配置这些属性(和其他属性)。
![]() |
要完全控制重试行为,请添加ID为 |
10.5查找远程配置资源
Config Service提供属性源/{name}/{profile}/{label}
,其中客户端应用程序中的默认绑定如下:
- “名字”=
${spring.application.name}
- “个人资料”=
${spring.profiles.active}
(实际上Environment.getActiveProfiles()
) - “label”=“主人”
![]() |
设置属性时, |
您可以通过设置覆盖所有的人spring.cloud.config.*
(这里*
是name
,profile
或label
)。这label
对于回滚到以前版本的配置很有用。使用默认的Config Server实现,它可以是git标签,分支名称或提交ID。Label也可以以逗号分隔列表的形式提供。在这种情况下,列表中的项目将逐个尝试,直到成功为止。在处理功能分支时,此行为非常有用。例如,您可能希望将配置标签与您的分支对齐,但使其成为可选(在这种情况下,使用spring.cloud.config.label=myfeature,develop
)。
10.6为Config Server指定多个URL
为了确保在部署了多个Config Server实例并期望一个或多个实例不时不可用时的高可用性,您可以指定多个URL(作为逗号分隔列表下的spring.cloud.config.uri
或者让所有实例在Eureka等服务注册表中注册(如果使用Discovery-First Bootstrap模式)。请注意,只有在Config Server未运行时(即应用程序已退出时)或发生连接超时时,才能确保高可用性。例如,如果Config Server返回500(内部服务器错误)响应或Config Client从Config Server收到401(由于凭据错误或其他原因),则Config Client不会尝试从其他URL获取属性。这种错误表示用户问题而不是可用性问题。
如果在Config Server上使用HTTP基本安全性,则只有在您在spring.cloud.config.uri
属性下指定的每个URL中嵌入凭据时,才能支持每个Config Server身份验证凭据。如果使用任何其他类型的安全机制,则无法(当前)支持每个Config Server身份验证和授权。
10.7配置超时
如果要配置超时阈值:
- 可以使用属性配置读取超时
spring.cloud.config.request-read-timeout
。 - 可以使用属性配置连接超时
spring.cloud.config.request-connect-timeout
。
10.8安全
如果在服务器上使用HTTP Basic安全性,则客户端需要知道密码(如果不是默认密码,则需要知道用户名)。您可以通过配置服务器URI或单独的用户名和密码属性指定用户名和密码,如以下示例所示:
bootstrap.yml。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> uri</span>:https:// user:secret@myconfig.mycompany.com</span></span>
以下示例显示了传递相同信息的另一种方法:
bootstrap.yml。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:<span style="color:#7f007f"> uri</span>:https
:
<span style="color:#7f007f">//myconfig.mycompany.com </span><span style="color:#7f007f"> 用户名</span>:用户
<span style="color:#7f007f"> 密码</span>:secret</span></span>
该spring.cloud.config.password
和spring.cloud.config.username
值将覆盖在URI中提供的任何东西。
如果您在Cloud Foundry上部署应用程序,则提供密码的最佳方式是通过服务凭据(例如在URI中,因为它不需要位于配置文件中)。以下示例适用于本地以及Cloud Foundry上用户提供的服务,名为configserver
:
bootstrap.yml。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> uri</span>:$ {vcap.services.configserver.credentials.uri:http:// user:password @ localhost :8888 <span style="color:#7f0055"><strong>}</strong></span></span></span>
如果您使用安全的另一种形式,你可能需要提供RestTemplate
的ConfigServicePropertySourceLocator
(例如,通过在引导方面抓住它,并注入它)。
10.8.1健康指标
Config Client提供Spring Boot Health Indicator,尝试从Config Server加载配置。可以通过设置禁用运行状况指示器health.config.enabled=false
。出于性能原因,还会缓存响应。生存的默认缓存时间为5分钟。要更改该值,请设置health.config.time-to-live
属性(以毫秒为单位)。
10.8.2提供自定义RestTemplate
在某些情况下,您可能需要自定义从客户端向配置服务器发出的请求。通常,这样做涉及传递特殊Authorization
标头以验证对服务器的请求。提供自定义RestTemplate
:
- 创建一个具有实现的新配置bean
PropertySourceLocator
,如以下示例所示:
CustomConfigServiceBootstrapConfiguration.java。
<span style="color:#333333"><span style="color:#000000"><em><span style="color:gray">@Configuration</span></em>
<span style="color:#7f0055"><strong> public </strong></span> <span style="color:#7f0055"><strong>class</strong></span> CustomConfigServiceBootstrapConfiguration {
<em><span style="color:gray"> @Bean</span></em>
<span style="color:#7f0055"><strong> public</strong></span> ConfigServicePropertySourceLocator configServicePropertySourceLocator(){
ConfigClientProperties clientProperties = configClientProperties();
ConfigServicePropertySourceLocator configServicePropertySourceLocator = <span style="color:#7f0055"><strong>new</strong></span> ConfigServicePropertySourceLocator(clientProperties);
configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
<span style="color:#7f0055"><strong>return</strong></span> configServicePropertySourceLocator;
}
}</span></span>
- 在
resources/META-INF
,创建一个名为的文件spring.factories
并指定自定义配置,如以下示例所示:
spring.factories。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">org.springframework.cloud.bootstrap.BootstrapConfiguration</span> = com.my.config.client.CustomConfigServiceBootstrapConfiguration</span></span>
10.8.3保险柜
使用Vault作为配置服务器的后端时,客户端需要为服务器提供令牌以从Vault检索值。该令牌可以在客户端内设置被提供spring.cloud.config.token
在bootstrap.yml
,如显示在下面的例子:
bootstrap.yml。
<span style="color:#333333"><span style="color:#000000"><span style="color:#7f007f">spring</span>:
<span style="color:#7f007f"> cloud</span>:
<span style="color:#7f007f"> config</span>:
<span style="color:#7f007f"> token</span>:YourVaultToken</span></span>
10.9 Vault中的嵌套密钥
Vault支持将密钥嵌套在Vault中存储的值中,如以下示例所示:
echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -
此命令将JSON对象写入Vault。要在Spring中访问这些值,可以使用传统的dot(.
)注释,如以下示例所示
<span style="color:#333333"><span style="color:#000000"><em><span style="color:gray">@Value(“$ {appA.secret}”)</span></em>
String name =<span style="color:#2a00ff"> “World”</span> ;</span></span>
前面的代码会将name
变量的值设置为appAsecret
。