Spring Cloud 配置客户端

Spring Boot 应用程序可以立即利用 Spring 配置服务器(或应用开发者提供的其他外部属性源)。 它还增加了一些相关的额外实用功能环境改变事件。spring-doc.cadn.net.cn

Spring Boot Config Data Import

Spring Boot 2.4 引入了一种通过spring.config.import财产。这现在是绑定配置服务器的默认方式。spring-doc.cadn.net.cn

要选择性地连接到配置服务器,请在application.properties中设置以下内容:spring-doc.cadn.net.cn

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

这会连接到默认位置“http://localhost:8888”的配置服务器。移除自选:如果配置客户端无法连接到配置服务器,前缀会导致失败。要更改配置服务器的位置,可以设置以下任一Spring.cloud.config.uri或者将URL添加到spring.config.import例如,Spring.config.import=optional:configserver:http://myhost:8888.导入属性中的位置优先于uri属性。spring-doc.cadn.net.cn

Spring Boot 配置数据通过两步流程解决配置。首先它会用默认值轮廓。这允许 Spring Boot 收集所有可能激活额外配置文件的配置。 收集完所有激活的配置文件后,它会加载所有激活配置文件的额外配置。 因此,你可能会看到多次请求 Spring Cloud 配置服务器获取配置。这 这是正常现象,是 Spring Boot 在使用 Spring Boot 时加载配置时的副作用spring.config.import.在之前 Spring Cloud Config版本中只有一个请求,但这意味着你无法激活配置文件 来自配置服务器的配置。附加请求仅仅是默认值现在的简介 这可能。spring-doc.cadn.net.cn

一个启动文件(属性或 yaml)对于 Spring Boot 配置数据方法的导入方式spring.config.import.

配置优先引导

要使用传统引导方式连接配置服务器,必须通过属性或Spring-cloud-starter-bootstrap起动机。该性质为spring.cloud.bootstrap.enabled=true.它必须设置为系统属性或环境变量。 一旦启用引导,任何在类路径上运行 Spring Cloud 配置客户端的应用程序都会按如下方式连接到配置服务器: 当配置客户端启动时,它会绑定到配置服务器(通过Spring.cloud.config.uribootstrap 配置属性)并初始化 Spring环境利用远程地产来源。spring-doc.cadn.net.cn

这种行为的最终结果是,所有想要调用配置服务器的客户端应用程序都需要bootstrap.yml(或环境变量),其中服务器地址设置为Spring.cloud.config.uri(默认为“http://localhost:8888”)。spring-doc.cadn.net.cn

发现首次查询

除非你使用配置优先引导程序,否则你需要有spring.config.import在你的配置中,属性具有自选:前缀。 例如spring.config.import=optional:configserver:.

如果你使用发现客户端实现方式,如 Spring Cloud Netflix 和 Eureka Service Discovery 或 Spring Cloud Consul,你可以让配置服务器注册到 Discovery Service。spring-doc.cadn.net.cn

如果你更喜欢使用发现客户端要找到配置服务器,可以通过设置来实现spring.cloud.config.discovery.enabled=true(默认为false). 例如,使用 Spring Cloud Netflix,你需要定义 Eureka 服务器地址(例如,在eureka.client.serviceUrl.defaultZone). 使用该选项的费用是启动时额外往返网络,以查找服务注册地址。 优点是,只要发现服务是固定点,配置服务器就可以更改坐标。 默认服务ID为配置服务器但你可以通过设置在客户端上更改spring.cloud.config.discovery.serviceId(以及服务器端,通常服务的方式,例如设置spring.application.name).spring-doc.cadn.net.cn

发现客户端的实现都支持某种元数据映射(例如,我们有eureka.instance.metadataMap为尤里卡)。 配置服务器的服务注册元数据中可能需要配置一些额外的属性,以确保客户端能够正确连接。 如果配置服务器用HTTP Basic加密,你可以配置凭证如下用户密码. 另外,如果配置服务器有上下文路径,你可以设置configPath. 例如,以下 YAML 文件是针对 Eureka 客户端的配置服务器:spring-doc.cadn.net.cn

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

使用 Eureka 和 WebClient 的 Discovery First Bootstrap

如果你用Eureka的话发现客户端Spring Cloud Netflix,也想使用Web客户端而非Jersey或Rest模板, 你需要包含Web客户端在你的类路径上以及集合Eureka.client.webclient.enabled=true.spring-doc.cadn.net.cn

配置客户端故障快速

在某些情况下,如果服务无法连接到配置服务器,你可能想让它启动失败。 如果这是期望的行为,设置引导配置属性Spring.cloud.config.fail-fast=true让客户端以例外方式停止。spring-doc.cadn.net.cn

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

配置客户端重试

如果你预计配置服务器在应用启动时偶尔无法使用,可以让它在失败后继续尝试。 首先,你需要设置Spring.cloud.config.fail-fast=true. 然后你需要添加春季重试Spring Boot启动 AOP去你的班级路径。 默认行为是重试六次,初始退回间隔为1000毫秒,后续退避时乘数指数倍数为1.1。 你可以通过设置spring.cloud.config.retry.*配置属性。 使用随机指数退避策略集spring.cloud.config.retry.useRandomPolicytrue.spring-doc.cadn.net.cn

什么时候spring.cloud.config.retry.useRandomPolicytrue最大尝试次数,初始区间,最大区间乘数性质将 即使使用随机指数退回策略,这些策略仍然有效。关于它们如何使用的详细信息可见指数随机退避政策指数退让政策春季重试中。
如果要完全控制重试行为并使用遗留的bootstrap,请添加一个@Bean类型重试拦截行动其标识为configServerRetryInterceptor. 春季重试有重试拦截器构建器这支持创建一个。

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

重试适用于Spring靴spring.config.import语句和法向性质都有效。然而,如果导入语句存在于配置文件中,例如application-prod.properties(应用-生产)属性然后你需要另一种方式来配置重试。配置需要作为导入语句中的 URL 参数。spring-doc.cadn.net.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=true(注意上方缺少前缀)以及所有可用的spring.cloud.config.retry.*配置属性。spring-doc.cadn.net.cn

定位远程配置资源

配置服务服务的属性源来自以下/{application}/{profile}/{label},其中客户端应用中的默认绑定如下:spring-doc.cadn.net.cn

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

你可以通过设置来覆盖所有这些spring.cloud.config.*(其中为*名称,轮廓标签). 这标签对于回滚到之前版本配置非常有用。 默认的配置服务器实现中,它可以是 git 标签、分支名或提交 ID。 标签也可以作为逗号分隔列表提供。 这种行为在处理功能分支时非常有用。 例如,你可能想将配置标签与分支对齐,但设置为可选(在这种情况下,使用Spring.cloud.config.label=myfeature,develop).spring-doc.cadn.net.cn

请求多个唱片公司

在 Spring Cloud 配置 4.2.0 之前,如果你设置Spring.cloud.config.label配置客户端将 通过向配置服务器请求每个标签,直到找到合适的。这意味着如果找到了第一个标签,后续标签就不会被尝试。spring-doc.cadn.net.cn

从 Spring Cloud 配置 4.2.0 开始,如果你设置了Spring.cloud.config.label到一个逗号分隔的标签列表 AND 集合spring.cloud.config.send-all-labels配置客户端会向配置服务器发送一个请求,使用逗号分隔的标签列表 如果配置服务器使用4.2.0或更高版本,它会返回一个包含所有标签属性源的响应。spring-doc.cadn.net.cn

设置Spring.cloud-config.send-all-labelstrue设置Spring.cloud.config.label对于逗号分隔的标签列表, 使用4.2.0之前的配置服务器版本会导致异常行为,因为配置服务器会尝试寻找标签 它与逗号分隔的列表值匹配,且不会尝试拆分标签。

通过一次性发送所有标签,可以减少发送到配置服务器的请求数量。spring-doc.cadn.net.cn

spring.cloud.config.send-all-labels设置为false默认情况下,旧的行为仍然是默认的,而且它也会保持 与旧版本配置服务器的兼容性。spring-doc.cadn.net.cn

为配置服务器指定多个URL。

为了确保高可用性,当你部署了多个配置服务器实例,并且预计有一个或多个实例无法使用或无法响应请求时(比如Git服务器宕机),你可以指定多个URL(作为逗号分隔的列表,位于Spring.cloud.config.uri属性)或让你的所有实例注册在服务注册表中,比如Eureka(如果使用Discovery-First Bootstrap模式)。spring-doc.cadn.net.cn

以下列出的网址Spring.cloud.config.uri按列出的顺序审理。默认情况下,配置客户端会尝试从每个 URL 获取属性,直到尝试成功以确保高可用性。spring-doc.cadn.net.cn

不过,如果你想确保只有在配置服务器未运行(即应用程序退出)或连接超时时才能实现高可用性,请设置Spring.cloud.config.multiple-uri-strategy仅连接超时.(默认值为Spring.cloud.config.multiple-uri-strategy总是.)例如,如果配置服务器返回500(内部服务器错误)响应,或者配置客户端收到配置服务器的401(因凭证错误或其他原因),配置客户端不会尝试从其他URL获取属性。400错误(可能404除外)表示是用户问题,而非可用性问题。注意,如果配置服务器设置为使用 Git 服务器,且调用 Git 服务器失败,可能会发生 404 错误。spring-doc.cadn.net.cn

多个位置可以归结于单一spring.config.importSpring.cloud.config.uri.地点将按定义顺序处理,后续导入优先。然而,如果spring.cloud.config.fail-fasttrue,如果第一次配置服务器调用因任何原因失败,配置客户端将失败。如果失效快递false它会尝试所有URL,直到有一次调用成功,无论失败原因如何。(Spring.cloud.config.multiple-uri-strategy在指定 URL 时不适用spring.config.import.)spring-doc.cadn.net.cn

如果你在配置服务器上使用 HTTP 基础安全,目前只有在你指定的每个 URL 中嵌入凭证时,才能支持每个配置服务器的认证凭证Spring.cloud.config.uri财产。如果你使用任何其他类型的安全机制,目前无法支持每个配置服务器的认证和授权。spring-doc.cadn.net.cn

配置超时

如果你想配置超时阈值:spring-doc.cadn.net.cn

  • 读取超时可以通过以下属性进行配置Spring.cloud.config.request-read-timeout.spring-doc.cadn.net.cn

  • 连接超时可以通过以下属性进行配置spring.cloud.config.request-connect-timeout.spring-doc.cadn.net.cn

字符集配置

如果你想配置某个特定的字符集,资源应该由服务器提供,你需要通过字符集应用它。spring-doc.cadn.net.cn

spring:
  cloud:
    config:
      charset: UTF-8

字符集配置性质定义为java.nio.charset.Charsetspring-doc.cadn.net.cn

安全

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

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

以下示例展示了传递相同信息的另一种方式:spring-doc.cadn.net.cn

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

Spring.cloud.config.passwordspring.cloud.config.username值覆盖URI中提供的任何内容。spring-doc.cadn.net.cn

如果你在Cloud Foundry上部署应用,提供密码的最佳方式是通过服务凭证(比如在URI中,因为不需要在配置文件里)。 以下示例可在本地运行,适用于名为 Cloud Foundry 的用户提供的服务配置服务器:spring-doc.cadn.net.cn

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

如果配置服务器需要客户端TLS证书,可以通过属性配置客户端TLS证书和信任存储,如下示例所示:spring-doc.cadn.net.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>

spring.cloud.config.tls.enabled必须为真,才能启用配置客户端TLS。什么时候spring.cloud.config.tls.trust-store省略,则使用JVM默认信任存储。默认值spring.cloud.config.tls.key店型spring.cloud.config.tls.trust-store-type是PKCS12。当密码属性被省略时,则假设密码为空。spring-doc.cadn.net.cn

如果你使用其他类型的安全措施,可能需要提供一个Rest模板前往ConfigServicePropertySourceLocator(例如,在引导框架上下文中抓取并注入它)。spring-doc.cadn.net.cn

健康指标

配置客户端提供一个Spring Boot健康指示器,尝试从配置服务器加载配置。 健康指示器可以通过设置来禁用管理.health.config.enabled=false. 响应也会被缓存以提升性能。 默认缓存存活时间是5分钟。 要更改该值,设置health.config.time-to-live属性(以毫秒计)。spring-doc.cadn.net.cn

提供自定义休息模板

在某些情况下,你可能需要自定义客户端向配置服务器发出的请求。 通常,这需要通过特殊考试授权用于认证服务器请求的头部。spring-doc.cadn.net.cn

利用配置数据提供自定义 RestTemplate

提供一个定制Rest模板使用配置数据时:spring-doc.cadn.net.cn

  1. 创建一个实现BootstrapRegistryInitializerspring-doc.cadn.net.cn

    CustomBootstrapRegistryInitializer.java
    public class CustomBootstrapRegistryInitializer implements BootstrapRegistryInitializer {
    
    	@Override
    	public void initialize(BootstrapRegistry registry) {
    		registry.register(RestTemplate.class, context -> {
    			RestTemplate restTemplate = new RestTemplate();
    			// Customize RestTemplate here
    			return restTemplate;
    		});
    	}
    
    }
  2. 资源/元步兵,创建一个名为Spring。工厂并指定您的自定义配置,如下示例所示:spring-doc.cadn.net.cn

    Spring。工厂
    org.springframework.boot.BootstrapRegistryInitializer=com.my.config.client.CustomBootstrapRegistryInitializer

使用 Bootstrap 提供自定义 RestTemplate

提供一个定制Rest模板使用 Bootstrap 的话:spring-doc.cadn.net.cn

  1. 创建一个新的配置豆,实现为PropertySourceLocator如下例所示:spring-doc.cadn.net.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;
        }
    }
    为了简化加法方法授权头部,该spring.cloud.config.headers.*也可以用房产代替。
  2. 资源/元步兵,创建一个名为Spring。工厂并指定您的自定义配置,如下示例所示:spring-doc.cadn.net.cn

    Spring。工厂
    org.springframework.cloud.bootstrap.BootstrapConfiguration = com.my.config.client.CustomConfigServiceBootstrapConfiguration

当使用 Vault 作为配置服务器的后端时,客户端需要提供一个Tokens,让服务器从 Vault 获取值。 该Tokens可以在客户端内通过设置提供spring.cloud.config.tokenbootstrap.yml如下例所示:spring-doc.cadn.net.cn

spring:
  cloud:
    config:
      token: YourVaultToken

Vault 中的嵌套密钥

Vault 支持将密钥嵌套在存储于 Vault 中的值中,如下示例所示:spring-doc.cadn.net.cn

echo -n '{“appA”: {“secret”: “appAsecret”}, “bar”: “baz”}' |Vault Write Secret/MyApp -spring-doc.cadn.net.cn

这个命令会写入一个 JSON 对象到你的 Vault。 要在 Spring 中访问这些值,你需要使用传统的 dot(.)注释,如下例所示spring-doc.cadn.net.cn

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

前述代码将设定名称变量为应用秘密.spring-doc.cadn.net.cn

AOT与原生图像支持

因为4.0.0Spring Cloud 配置客户端支持 Spring AOT 转换和 GraalVM 原生镜像。spring-doc.cadn.net.cn

AOT 和原生镜像支持不支持配置优先引导(Spring.config.use-legacy-processing=true).
原生图像不支持刷新范围。如果你打算将配置客户端应用作为原生镜像运行,务必设置spring.cloud.refresh.enabled属性到false.
在构建包含 Spring Cloud 配置客户端的项目时,必须确保它连接的配置数据源(如 Spring Cloud 配置服务器、Consul、Zookeeper、Vault 等)可用。例如,如果你从 Spring Cloud 配置服务器获取配置数据,确保其实例运行并可在配置客户端设置中指定的端口使用。这是必要的,因为应用上下文在构建时正在优化,需要解决目标环境。
由于在AOT和原生模式下,配置正在处理,上下文在构建时被优化,任何会影响豆创建的属性(比如引导式上下文中使用的属性)都应在构建时和运行时设置为相同的值,以避免意外行为。
由于配置客户端在从原生映像启动时连接到正在运行的数据源(如配置服务器),启动时间会因网络通信所需的时间而变慢。

附录

可观测性元数据

可观测性 - 指标

以下是该项目宣布的所有指标列表。spring-doc.cadn.net.cn

环境仓库

围绕环境仓库创建的观察。spring-doc.cadn.net.cn

公制名称 spring.cloud.config.environment.find(由约定类定义org.springframework.cloud.config.server.environment.ObservationEnvironmentRepositoryObservationConvention).类型 定时器.spring-doc.cadn.net.cn

公制名称 spring.cloud.config.environment.find.active(由约定类定义org.springframework.cloud.config.server.environment.ObservationEnvironmentRepositoryObservationConvention).类型 长任务计时器.spring-doc.cadn.net.cn

启动观察后添加的KeyValue可能缺失在*.active指标中。
微米内部用途纳 秒为基单元。然而,每个后端都决定了实际的基单元。(即普罗米修斯用秒)

包围类别的完全限定名称org.springframework.cloud.config.server.environment.DocumentedConfigObservation.spring-doc.cadn.net.cn

所有标签必须以Spring.cloud.config.environment前缀!
表1。低基数密钥

spring.cloud.config.environment.application (必填)spring-doc.cadn.net.cn

查询的房产名称。spring-doc.cadn.net.cn

spring.cloud.config.environment.class (必填)spring-doc.cadn.net.cn

环境仓库的实现。spring-doc.cadn.net.cn

Spring.cloud.config.environment.label (必填)spring-doc.cadn.net.cn

标记被查询的属性。spring-doc.cadn.net.cn

spring.cloud.config.environment.profile (必填)spring-doc.cadn.net.cn

查询的房产名称。spring-doc.cadn.net.cn

可观测性——跨度

以下是该项目宣布的所有跨度列表。spring-doc.cadn.net.cn

环境仓库范围

围绕环境仓库创建的观察。spring-doc.cadn.net.cn

跨区名称 spring.cloud.config.environment.find(由约定类定义org.springframework.cloud.config.server.environment.ObservationEnvironmentRepositoryObservationConvention).spring-doc.cadn.net.cn

包围类别的完全限定名称org.springframework.cloud.config.server.environment.DocumentedConfigObservation.spring-doc.cadn.net.cn

所有标签必须以Spring.cloud.config.environment前缀!
表2。标签密钥

名称spring-doc.cadn.net.cn

描述spring-doc.cadn.net.cn

spring.cloud.config.environment.application (必填)spring-doc.cadn.net.cn

查询的房产名称。spring-doc.cadn.net.cn

spring.cloud.config.environment.class (必填)spring-doc.cadn.net.cn

环境仓库的实现。spring-doc.cadn.net.cn

Spring.cloud.config.environment.label (必填)spring-doc.cadn.net.cn

标记被查询的属性。spring-doc.cadn.net.cn

spring.cloud.config.environment.profile (必填)spring-doc.cadn.net.cn

查询的房产名称。spring-doc.cadn.net.cn