Loading...
墨滴

lyq

2021/11/19  阅读:59  主题:橙心

Spring Cloud Config配置详解(三)

Spring Cloud Config配置详解(三)

spring boot版本为:2.5.6

spring cloud版本为:2020.0.4

spring cloud config版本为:3.0.5


Spring Cloud Config Client

Spring Boot应用程序可以立即利用Spring Config Server(或应用程序开发人员提供的其他外部属性源)。它还获得了一些与Environment更改事件相关的其他有用特性。

Spring Boot配置数据导入

Spring Boot 2.4引入了一种通过spring .config.import属性导入配置数据的新方法。这是现在绑定到Config Server的默认方法。

要选择连接到配置服务器,请在application.properties中设置以下内容:

application.properties

spring.config.import=optional:configserver:

这将连接到配置服务器的默认位置“http://localhost:8888”。如果不能连接到配置服务器,删除optional:前缀将导致配置客户端失败。要更改配置服务器的位置,可以设置spring.cloud.config.uri或将url添加到spring.config.import语句中,例如,spring.config.import=optional:configserver:http://myhost:8888import属性中的位置优先于uri属性。

通过spring.config .import导入的Spring Boot配置数据方法不需要一个bootstrap文件(properties或yaml)。

Config First Bootstrap

要使用传统的bootstrap方式连接到Config Server,必须通过一个属性或spring-cloud-starter-bootstrapstarter。这个属性是spring.cloud.bootstrap.enabled=true。它必须设置为系统属性或环境变量。一旦启动了bootstrap,类路径上的任何带有Spring Cloud Config Client的应用程序都将连接到Config Server,如下所示:当一个配置客户端启动时,它绑定到Config Server(通过spring.cloud.config.uri引导配置属性),并使用远程属性源初始化Spring Environment。

这种行为的最终结果是,所有想要使用Config Server的客户端应用程序都需要一个bootstrap.yml(或一个环境变量)。在spring.cloud.config.uri中设置服务器地址(默认为“http://localhost:8888”)。

Discovery First Lookup

除非你使用Config First Bootstrap,否则你需要在你的配置属性中有一个带有optional:前缀的spring.config.import属性。例如,spring.config.import =optional:configserver:

如果您使用DiscoveryClient实现,例如Spring Cloud Netflix和Eureka Service Discovery或Spring Cloud Consul,您可以让配置服务器向Discovery Service注册。

如果您喜欢使用DiscoveryClient来定位配置服务器,可以通过设置spring.cloud.config.discovery.enabled=true(默认为false)来实现。例如,在Spring Cloud Netflix中,您需要定义Eureka服务器地址(例如,在eureka.client.serviceurl.defaultzone中)。使用此选项的代价是启动时额外的网络往返,以定位服务注册。这样做的好处是,只要Discovery Service是一个固定点,Config Server就可以更改它的坐标。默认的服务ID是configserver,但是你可以在客户端通过设置spring.cloud.config.discovery.serviceId来更改它(在服务器端,按照服务的通常方式,比如设置spring.application.name)。

发现客户端实现都支持某种类型的元数据映射(例如,Eureka有eureka.instance.metadataMap)。可能需要在其服务注册元数据中配置Config Server的一些附加属性,以便客户机能够正确连接。如果使用HTTP Basic保护配置服务器,则可以将凭据配置为userpassword。另外,如果配置服务器有上下文路径,您可以设置configPath。例如,下面的YAML文件是针对Eureka客户端的配置服务器:

eureka:
  instance:
    ...
    metadataMap:
      user: osufhalskjrtl
      password: lviuhlszvaorhvlo5847
      configPath: /config

Discovery First Bootstrap Using Eureka And WebClient

如果你使用Spring Cloud Netflix的Eureka DiscoveryClient,并且想要使用WebClient而不是Jersey或RestTemplate,你需要在类路径中包含WebClient,并设置eureka.client.Webclient .enabled=true

Config Client Fail Fast

在某些情况下,如果服务无法连接到配置服务器,您可能希望服务启动失败。如果这是想要的行为,设置bootstrap配置属性spring.cloud.config.fail-fast=true使客户端通过异常停止。

使用spring.config.import获得类似的功能。只需省略optional:前缀。

Config Client 重试

如果您预期在应用程序启动时配置服务器可能偶尔不可用,那么您可以在出现故障后让它继续尝试。首先,您需要设置spring.cloud.config.fail-fast=true。然后需要在类路径中添加spring-retryspring-boot-starter-aop。默认行为是重试6次,初始重试间隔为1000ms,后续重试间隔为指数乘以1.1。您可以通过设置spring.cloud.config.retry.*来配置这些属性(以及其他属性)

为了完全控制重试行为并使用遗留bootstrap,添加一个类型为RetryOperationsInterceptor@Bean,其ID为configServerRetryInterceptor。Spring Retry有一个RetryInterceptorBuilder,它支持创建一个。

使用spring.config.import配置客户端重试

Retry使用Spring Boot spring.config.import语句工作。但是,如果import语句在profile文件中,比如application-prod.properties,则需要使用不同的方法来配置重试。配置需要作为url参数放置在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},其中客户端应用程序中的默认绑定如下:

  • "application" = ${spring.application.name}

  • "profile" = ${spring.profiles.active} (实际上 Environment.getActiveProfiles())

  • "label" = "master"

当设置属性${spring.application.name}时,不要用保留字application-作为应用名称的前缀。以防止解决正确的属性源问题。

你可以通过设置spring.cloud.config.*来覆盖它们(其中*是name、profile或label)。label对于回滚到以前版本的配置很有用。对于默认的Config Server实现,它可以是一个git标签、分支名称或提交ID。标签也可以作为逗号分隔的列表提供。在这种情况下,将逐个尝试列表中的项目,直到其中一个成功。当处理一个特性分支时,这种行为很有用。例如,你可能想让配置标签与你的分支对齐,但让它是可选的(在这种情况下,使用spring.cloud.config.label=myfeature,develop)

为配置服务器指定多个url

当您部署了多个Config Server实例并偶尔有一个或多个实例不可用时,为了确保高可用性,你可以指定多个url(在spring.cloud.config.uri属性下以逗号分隔的列表),或者让你的所有实例在像Eureka这样的Service Registry中注册(如果使用Discovery-First Bootstrap模式)。注意,只有在Config Server未运行时(即应用程序退出时)或发生连接超时时,这样做才能确保高可用性。例如,如果配置服务器返回一个500(内部服务器错误)响应,或者配置客户端从配置服务器收到一个401(由于错误凭证或其他原因),配置客户端不会尝试从其他url获取属性。这类错误表明是用户问题,而不是可用性问题。

如果您在配置服务器上使用HTTP基本安全,那么目前只有在您在spring.cloud.config.uri属性下指定的每个URL中嵌入凭证时,才有可能支持每个配置服务器的身份验证凭证。如果使用任何其他类型的安全机制,则不能(目前)支持每个配置服务器的身份验证和授权。

配置超时

如果需要配置超时阈值:

  • 读取超时可以通过使用属性spring.cloud.config.request-read-timeout来配置。
  • 可以使用spring.cloud.config.request-connect-timeout属性配置连接超时。

安全

如果在服务器上使用HTTP基本安全性,客户端需要知道密码(如果不是默认值,则需要知道用户名)。您可以通过配置服务器URI或通过单独的用户名和密码属性指定用户名和密码,如下面的示例所示:

spring:
  cloud:
    config:
     uri: https://user:secret@myconfig.mycompany.com

下面的示例显示了传递相同信息的另一种方法:

spring:
  cloud:
    config:
     uri: https://myconfig.mycompany.com
     username: user
     password: secret

spring.cloud.config.passwordspring.cloud.config.username值覆盖URI中提供的任何内容。

如果你把你的应用部署在Cloud Foundry上,提供密码的最好方法是通过服务凭证(比如在URI中,因为它不需要在配置文件中)。下面的例子在本地工作,并且是针对一个名为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>

spring.cloud.config.tls.enabled需要为true才能启用配置客户端TLS。当spring.cloud.config.tls.trust-store被忽略,使用JVM默认的信任存储。spring.cloud.config.tls.key-store-typespring.cloud.config.tls.trust-store-type的默认值是PKCS12。当省略密码属性时,假设密码为空。

如果您使用另一种形式的安全性,您可能需要向ConfigServicePropertySourceLocator提供一个RestTemplate(例如,通过在引导上下文中获取它并注入它)。

健康指标

配置客户端提供一个Spring Boot运行状况指示器,该指示器试图从配置服务器加载配置。可以通过设置health.config.enabled=false禁用运行状况指标。由于性能原因,响应也被缓存。默认缓存存活时间为5分钟。要更改该值,请设置health.config.time-to-live属性(毫秒)。

提供自定义RestTemplate

在某些情况下,您可能需要自定义从客户端向配置服务器发出的请求。通常,这样做需要向服务器传递特殊的Authorization头来对请求进行身份验证。 提供一个自定义的RestTemplate:

  1. 创建一个带有PropertySourceLocator实现的新配置bean,如下面的示例所示:

CustomConfigServiceBootstrapConfiguration.java

@Configuration
public class CustomConfigServiceBootstrapConfiguration {
    @Bean
    public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
        ConfigClientProperties clientProperties = configClientProperties();
       ConfigServicePropertySourceLocator configServicePropertySourceLocator =  new ConfigServicePropertySourceLocator(clientProperties);
        configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
        return configServicePropertySourceLocator;
    }
}

对于添加Authorization头的简化方法,可以使用spring.cloud.config.headers.*属性可以代替。

  1. resources/META-INF中,创建一个名为spring.factories,并指定您的自定义配置,如下例所示:
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration

Vault

当使用Vault作为配置服务器的后端时,客户机需要为服务器提供一个令牌,以便从Vault检索值。这个令牌可以在客户端中通过在bootstrap.yml中设置spring.cloud.config.token来提供,如下例所示:

spring:
  cloud:
    config:
      token: YourVaultToken

Vault中的嵌套键

Vault支持在Vault中存储的值中嵌套键的能力,如下例所示:

echo -n '{"appA": {"secret": "appAsecret"}, "bar": "baz"}' | vault write secret/myapp -

这个命令将一个JSON对象写入到您的Vault。要在Spring中访问这些值,您可以使用传统的点(.)注释,如下面的示例所示

@Value("${appA.secret}")
String name = "World";

前面的代码将name变量的值设置为appAsecret

欢迎关注我的公众号:程序员L札记

更多原创文章,请扫码关注我的微信公众号
更多原创文章,请扫码关注我的微信公众号

lyq

2021/11/19  阅读:59  主题:橙心

作者介绍

lyq