3.7 Spring Cloud Config Client 客户端
一个Spring Boot能够很方便的使用Config Server,仅需要改改配置就行。而且开启Config Server后还可以通过
Environment
事件机制获得一些额外的功能。
3.7.1 Config First Bootstrap 首先配置Bootstrap
对于classpath中任何一个Config Server 客户端应用来说,Bootstrap是一个默认的机制。基于Bootstrap机制,客户端在启动时会自动绑定Config Server(通过
spring.cloud.config.uri
配置项),然后,加载远程资源来初始化Environment
。
所有的客户端想要去使用Config Server,需要通过
bootstrap.yml
(或者环境变量)配置一个spring.cloud.config.uri
来指定服务端地址(默认:http://localhost:8888
)
3.7.2 Discovery First Bootstrap 服务发现
如果使用了
DiscoveryClient
实现,如Spring Cloud Netflix / Eureka 的服务发现,或者是Spring Cloud Consul(Spring Cloud Zookeeper 暂不支持此功能),那么可以把你想要的Config Server注册到Discovery Service。但是,对于默认情况第一次加载配置时,客户端还是享用不了注册的服务,所以基本配置信息还是按照传统的方式被加载。
如果你比较喜欢用
DiscoveryClient
来使用Config Server,那你可以通过配置spring.cloud.config.discovery.enabled=true
(默认false)来开启此功能。这样的结果就是,所有的客户端都会从发现的配置服务加载一个bootstrap.yml
或者环境变量。
例如:在Spring Cloud Netflix实现中,需要顶一个Eureka服务地址,如:
eureka.client.serviceUrl.defaultZone
。这样的代价就是在启动时产生一次额外的网络请求,用于注册本地服务。带来的好处是,只要Discovery Service不变,那 Config Server 可以随意迁移。可以为客户端指定一个id:spring.cloud.config.discovery.serviceId
,服务通常通过spring.application.name
来指定服务名,默认的配置服务ID:"configserver"
Discovery客户端实现基本都支持一些元数据。如Eureka :
eureka.instance.metadataMap
。有的时候Config Server会有一些额外的配置信息需要加入到服务注册的元数据中,来让客户端能够正确的建立连接。如果Config Server 使用了HTTP的基础安全策略,那可以配置'username'和'password'。还可以通过"configPath"为Config Server指定一个context path。 例如:Eureka客户端
bootstrap.yml
eureka:
instance:
...
metadataMap:
user: osufhalskjrtl
password: lviuhlszvaorhvlo5847
configPath: /config
3.7.3 Config Client Fail Fast 客户端Fail-Fast
有的时候,需要当Config Server 连接不上的时直接启动失败。如果需要这个特性可以设置bootstrap配置项:
spring.cloud.config.failFast=true
来开启。
3.7.4 Config Client Retry 客户端重试
对于客户端,除了上一节所说的直接失败,还可以在Config Server不可用时,让客户端重试。可以通过设置
spring.cloud.config.failFast=false
;在classpath中增加spring-retry
、spring-boot-starter-aop
依赖。默认情况下会重试6次,每次间隔(1000 * 1.1^n)ms。也可以通过spring.cloud.config.retry.*
系列配置来修改相关配置。
提示: 要完全控制重试策略,可以自己实现一个
RetryOperationsInterceptor
指定Bean ID:"configServerRetryInterceptor"。Spring提供了一个RetryInterceptorBuilder
可以快速构建一个RetryOperationsInterceptor。
3.7.5 Locating Remote Configuration Resources 查找远程配置资源
Config Service配置的属性:
/{name}/{profile}/{label}
,默认会被绑定到客户端:
- "name" = ${spring.application.name}
- "profile" = ${spring.profiles.active} (相当于 Environment.getActiveProfiles())
- "label" = "master"
这些都可以通过
spring.cloud.config.*
(* 可以包括:"name", "profile", "label")配置项进行覆盖。 "label"会被用于配置信息版本回滚,按默认实现"label"相对于git的label,branch名,或者commit id。"label"可以用逗号分隔,这种情况,会一个接一个的尝试,直到成功。这种比较适合针对多环境进行配置管理服务时,例如:spring.cloud.config.label=myfeature,develop
3.7.6 Security 安全
基于HTTP Basic安全策略,可以这样配置:
bootstrap.yml
spring:
cloud:
config:
uri: https://user:secret@myconfig.mycompany.com
或者:
bootstrap.yml
spring:
cloud:
config:
uri: https://myconfig.mycompany.com
username: user
password: secret
spring.cloud.config.password
和spring.cloud.config.username
会覆盖URI中的用户名和密码。
如果应用发布到Cloud Foundry的话,那最佳的方式就是通过服务证书的方式提供密码。例如:
bootstrap.yml
spring:
cloud:
config:
uri: ${vcap.services.configserver.credentials.uri:http://user:password@localhost:8888}
也可以自己来实现安全策略,可以自己提供一个
RestTemplate
到ConfigServicePropertySourceLocator中