Spring Cloud Config 客户端

Spring Boot 应用程序可以立即利用 Spring Config Server(或应用程序开发人员提供的其他外部属性源)。 它还选取了一些与 change 事件相关的其他有用功能。Environmentspring-doc.cn

Spring Boot Config 数据导入

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

要选择性地连接到 config server,请在 application.properties 中设置以下内容:spring-doc.cn

application.properties
spring.config.import=optional:configserver:

这将连接到默认位置 “http://localhost:8888” 的 Config Server。如果 Config Client 无法连接到 Config Server,则删除前缀将导致 Config Client 失败。要更改 Config Server 的位置,请在语句中设置或添加 url,例如 .import 属性中的位置优先于 uri 属性。optional:spring.cloud.config.urispring.config.importspring.config.import=optional:configserver:http://myhost:8888spring-doc.cn

通过 .bootstrapspring.config.import

Config First 引导

要使用传统的 bootstrap 方式连接到 Config Server,必须通过属性或 starter 启用 bootstrap。属性为 。它必须设置为 System Property 或 environment variable。 启用 bootstrap 后,在 Classpath 上具有 Spring Cloud Config Client 的任何应用程序都将连接到 Config Server,如下所示: 当 config client 启动时,它会绑定到 Config Server(通过 bootstrap 配置属性)并使用远程属性源初始化 Spring。spring-cloud-starter-bootstrapspring.cloud.bootstrap.enabled=truespring.cloud.config.uriEnvironmentspring-doc.cn

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

Discovery 首次查找

除非您使用 config first 引导,否则您需要在配置属性中有一个带前缀的属性。 例如。spring.config.importoptional:spring.config.import=optional:configserver:

如果使用 Spring Cloud Netflix 和 Eureka Service Discovery 或 Spring Cloud Consul 等实现,则可以让 Config Server 向 Discovery Service 注册。DiscoveryClientspring-doc.cn

如果您更喜欢使用来查找 Config Server,可以通过设置(默认为 )来实现。 例如,对于 Spring Cloud Netflix,您需要定义 Eureka 服务器地址(例如,in )。 使用此选项的价格是启动时的额外网络往返,以查找服务注册。 好处是,只要 Discovery Service 是一个固定点,Config Server 就可以更改其坐标。 默认服务 ID 为 ,但您可以通过设置在客户端上更改它(在服务器上,以服务的通常方式,例如 通过设置 )来更改它。DiscoveryClientspring.cloud.config.discovery.enabled=truefalseeureka.client.serviceUrl.defaultZoneconfigserverspring.cloud.config.discovery.serviceIdspring.application.namespring-doc.cn

发现客户端实现都支持某种元数据 Map(例如,我们为 Eureka 提供)。 可能需要在其服务注册元数据中配置 Config Server 的一些其他属性,以便 Client 端可以正确连接。 如果 Config Server 使用 HTTP Basic 进行保护,则可以将凭据配置为 和 。 此外,如果 Config Server 具有上下文路径,则可以设置 . 例如,以下 YAML 文件适用于作为 Eureka 客户端的 Config Server:eureka.instance.metadataMapuserpasswordconfigPathspring-doc.cn

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

使用 Eureka 和 WebClient 的 Discovery First Bootstrap

如果您使用 Spring Cloud Netflix 中的 Eureka,并且还想使用 Jersey 或 , 您需要包含在 Classpath 中,并设置 SET 。DiscoveryClientWebClientRestTemplateWebClienteureka.client.webclient.enabled=truespring-doc.cn

Config 客户端快速失败

在某些情况下,如果服务无法连接到 Config Server,您可能希望服务启动失败。 如果这是所需的行为,请设置 bootstrap 配置属性以使客户端停止并显示 Exception。spring.cloud.config.fail-fast=truespring-doc.cn

要使用 获得类似的功能,只需省略前缀即可。spring.config.importoptional:

Config 客户端重试

如果您预计 config server 在应用程序启动时可能偶尔不可用,则可以使其在失败后继续尝试。 首先,您需要设置 . 然后你需要将 and 添加到你的 classpath 中。 默认行为是重试六次,初始回退间隔为 1000 毫秒,后续回退的指数乘数为 1.1。 您可以通过设置配置属性来配置这些属性(和其他属性)。spring.cloud.config.fail-fast=truespring-retryspring-boot-starter-aopspring.cloud.config.retry.*spring-doc.cn

要完全控制重试行为并使用旧版引导程序,请添加 ID 为 的 type 。 Spring Retry 有一个支持创建一个。@BeanRetryOperationsInterceptorconfigServerRetryInterceptorRetryInterceptorBuilder

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

Retry 适用于 Spring Boot 语句,普通属性有效。但是,如果 import 语句位于配置文件中,例如 ,则需要另一种方式来配置重试。配置需要作为 url 参数放在 import 语句上。spring.config.importapplication-prod.propertiesspring-doc.cn

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=truespring.cloud.config.retry.*spring-doc.cn

查找远程配置资源

Config Service 提供来自 的属性源,其中客户端应用程序中的默认绑定如下:/{application}/{profile}/{label}spring-doc.cn

  • “应用程序” =${spring.application.name}spring-doc.cn

  • “profile” = (实际上${spring.profiles.active}Environment.getActiveProfiles())spring-doc.cn

  • “标签” = “主”spring-doc.cn

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

您可以通过设置 (where is , or ) 来覆盖所有这些 这对于回滚到以前版本的配置很有用。 使用默认的 Config Server 实现,它可以是 git 标签、分支名称或提交 ID。 Label 也可以作为逗号分隔的列表提供。 在这种情况下,将逐个尝试列表中的项目,直到一个项目成功。 在功能分支上工作时,此行为可能很有用。 例如,您可能希望将 config 标签与分支对齐,但将其设置为可选(在这种情况下,请使用 )。spring.cloud.config.**nameprofilelabellabelspring.cloud.config.label=myfeature,developspring-doc.cn

为 Config Server 指定多个 URL

为了确保在部署了多个 Config Server 实例并预计一个或多个实例不时不可用时具有高可用性,您可以指定多个 URL(作为属性下的逗号分隔列表)或让所有实例在服务注册表中注册,如 Eureka (如果使用 Discovery-First Bootstrap 模式)。请注意,这样做仅在 Config Server 未运行时(即应用程序已退出)或发生连接超时时确保高可用性。例如,如果 Config Server 返回 500(内部服务器错误)响应或 Config Client 从 Config Server 收到 401(由于凭据错误或其他原因),则 Config Client 不会尝试从其他 URL 获取属性。此类错误表示用户问题,而不是可用性问题。spring.cloud.config.urispring-doc.cn

如果您在 Config Server 上使用 HTTP 基本安全性,则当前只有在将凭据嵌入到您在属性下指定的每个 URL 中时,才能支持每个 Config Server 身份验证凭据。如果您使用任何其他类型的安全机制,则(当前)无法支持每个 Config Server 的身份验证和授权。spring.cloud.config.urispring-doc.cn

配置超时

如果要配置超时阈值:spring-doc.cn

  • 可以使用属性 来配置读取超时 。spring.cloud.config.request-read-timeoutspring-doc.cn

  • 可以使用属性 配置连接超时 。spring.cloud.config.request-connect-timeoutspring-doc.cn

安全

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

spring:
  cloud:
    config:
     uri: https://user:[email protected]

以下示例显示了传递相同信息的另一种方法:spring-doc.cn

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

和 值将覆盖 URI 中提供的任何内容。spring.cloud.config.passwordspring.cloud.config.usernamespring-doc.cn

如果您在 Cloud Foundry 上部署应用程序,则提供密码的最佳方式是通过服务凭证(例如在 URI 中,因为它不需要位于配置文件中)。 以下示例在本地工作,并适用于名为 :configserverspring-doc.cn

spring:
  cloud:
    config:
     uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}

如果配置服务器需要客户端 TLS 证书,则可以通过属性配置客户端 TLS 证书和信任存储,如以下示例所示:spring-doc.cn

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>

要启用 config 客户端 TLS,需要为 true。如果省略,则使用 JVM 默认信任存储。和 的默认值为 PKCS12。如果省略 password 属性,则假定 password 为空。spring.cloud.config.tls.enabledspring.cloud.config.tls.trust-storespring.cloud.config.tls.key-store-typespring.cloud.config.tls.trust-store-typespring-doc.cn

如果你使用其他形式的安全性,你可能需要提供 RestTemplate (例如,通过在引导上下文中获取它并注入它)。ConfigServicePropertySourceLocatorspring-doc.cn

运行状况指示器

Config Client 提供了一个 Spring Boot Health Indicator,该指示器尝试从 Config Server 加载配置。 可以通过设置 来禁用运行状况指示器。 出于性能原因,也会缓存响应。 默认缓存生存时间为 5 分钟。 要更改该值,请设置属性(以毫秒为单位)。health.config.enabled=falsehealth.config.time-to-livespring-doc.cn

提供自定义 RestTemplate

在某些情况下,您可能需要自定义从 Client 端向 config server 发出的请求。 通常,这样做涉及传递特殊标头以对服务器请求进行身份验证。 要提供自定义 :AuthorizationRestTemplatespring-doc.cn

  1. 使用 的实现创建一个新的配置 Bean,如以下示例所示:PropertySourceLocatorspring-doc.cn

CustomConfigServiceBootstrapConfiguration.java
@Configuration
public class CustomConfigServiceBootstrapConfiguration {
    @Bean
    public ConfigServicePropertySourceLocator configServicePropertySourceLocator() {
        ConfigClientProperties clientProperties = configClientProperties();
       ConfigServicePropertySourceLocator configServicePropertySourceLocator =  new ConfigServicePropertySourceLocator(clientProperties);
        configServicePropertySourceLocator.setRestTemplate(customRestTemplate(clientProperties));
        return configServicePropertySourceLocator;
    }
}
对于添加标头的简化方法,可以改用该属性。Authorizationspring.cloud.config.headers.*
  1. 在 中,创建一个名为 并指定自定义配置的文件,如以下示例所示:resources/META-INFspring.factoriesspring-doc.cn

spring.factories
org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration

当使用 Vault 作为配置服务器的后端时,客户端需要为服务器提供一个令牌以从 Vault 中检索值。 可以通过在 中设置 在客户端中提供此令牌,如以下示例所示:spring.cloud.config.tokenbootstrap.ymlspring-doc.cn

spring:
  cloud:
    config:
      token: YourVaultToken

Vault 中的嵌套密钥

Vault 支持将键嵌套在 Vault 中存储的值中,如以下示例所示:spring-doc.cn

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

此命令将 JSON 对象写入您的 Vault。 要在 Spring 中访问这些值,您可以使用传统的 dot() 注释,如以下示例所示.spring-doc.cn

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

前面的代码会将变量的值设置为 .nameappAsecretspring-doc.cn