Spring Cloud Document翻译(四)--Spring Cloud Config 2

https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/multi/multi__serving_alternative_formats.html

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},其中nameprofile和,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>
[注意]

与环境配置的源文件一样,profile它用于解析文件名。因此,如果您想要一个特定于配置文件的文件,/*/development/*/logback.xml可以通过一个名为logback-development.xml(优先logback.xml)的文件来解析。

[注意]

如果您不想提供label并让服务器使用默认标签,则可以提供useDefaultLabel请求参数。因此,前面的default配置文件示例可能是/foo/default/nginx.conf?useDefaultLabel

 

 

8.嵌入配置服务器

Config Server作为独立应用程序运行最佳。但是,如果需要,您可以将其嵌入另一个应用程序中。为此,请使用@EnableConfigServer注释。spring.cloud.config.server.bootstrap在这种情况下,名为的可选属性很有用。它是一个标志,指示服务器是否应该从自己的远程存储库配置自己。默认情况下,该标志处于关闭状态,因为它可能会延迟启动。但是,当嵌入到另一个应用程序中时,以与任何其他应用程序相同的方式初始化是有意义的。设置时spring.cloud.config.server.bootstraptrue还必须使用复合环境存储库配置。例如

<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 bootstrap.yml

要更改服务器端点的位置,您可以(可选)设置spring.cloud.config.server.prefix(例如/config),以便在前缀下提供资源。前缀应该开始但不以a结尾/。它应用于@RequestMappingsConfig Server中(即Spring Boot server.servletPathserver.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}模式的应用程序(可以包含通配符)。

[注意]

RefreshRemoteApplicationEvent如果只传输spring-cloud-bus是在两个配置服务器和客户端应用程序激活。

[注意]

默认配置还检测本地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

如果您使用DiscoveryClientSpring 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保护配置服务器,则可以将凭据配置为userpassword。此外,如果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-retryspring-boot-starter-aop你的类路径。默认行为是重试六次,初始退避间隔为1000毫秒,指数乘数为1.1,以便后续退避。您可以通过设置spring.cloud.config.retry.*配置属性来配置这些属性(和其他属性)。

[小费]

要完全控制重试行为,请添加ID为@Bean的类型。Spring Retry有一个支持创建一个。RetryOperationsInterceptorconfigServerRetryInterceptorRetryInterceptorBuilder

10.5查找远程配置资源

Config Service提供属性源/{name}/{profile}/{label},其中客户端应用程序中的默认绑定如下:

  • “名字”= ${spring.application.name}
  • “个人资料”= ${spring.profiles.active}(实际上Environment.getActiveProfiles()
  • “label”=“主人”
[注意]

设置属性时,${spring.application.name}请不要在应用程序名称前加上保留字,application-以防止问题解决正确的属性源。

您可以通过设置覆盖所有的人spring.cloud.config.*(这里*nameprofilelabel)。这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:[email protected]</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.passwordspring.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>

 

如果您使用安全的另一种形式,你可能需要提供RestTemplateConfigServicePropertySourceLocator(例如,通过在引导方面抓住它,并注入它)。

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

  1. 创建一个具有实现的新配置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>

 

  1. 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.tokenbootstrap.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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章