cationEvent。
注意 本地Git仓库默认检测文件系统变更(这种情况下不使用webhook,但一旦修改了配置文件,会广播刷新事件)。
10.Spring Cloud Config客户端
Spring Boot应用可以立即利用Spring Config服务端(或应用程序开发人员提供的其他外部属性源),并且还将获取与环境更改事件相关的一些其他有用功能。
配置第一个Bootstrap
这是任何在classpath中存在Spring Cloud Config客户端的应用的默认行为。当配置客户端启动时,它将绑定配置中心(通过bootstrap配置属性spring.cloud.config.uri)并使用远程属性源初始化Spring环境。
最终结果是所有希望消费配置中心的客户端应用都需要在bootstrap.yml(或环境变量)中存在一个服务器地址spring.cloud.config.uri(默认为"http://localhost:8888")。
发现第一个Bootstrap
如果使用DiscoveryClient实现,比如Spring Cloud Netflix和Eureka Service Discovery或者Spring Cloud Consul(Spring Cloud Zookeeper暂时不支持),那么可以按需将配置中心注册为Discovery Servcie,但是在默认的"Config First"模式中,客户端将不能利用这种注册。
如果希望使用DiscoveryClient来定位配置中心,开发人员可以通过设置spring.cloud.config.discovery.enabled=true(默认false)来实现。最终结果是客户端应用需要相应的服务发现配置的bootstrap.yml(或环境变量)。例如,使用Spring Cloud Netflix,需要定义Eureka服务器地址,例如在eureka.client.serviceUrl.defaultZone。这样做的代价是启动时一个额外的网络往返开销去定位服务注册,好处是只要发现服务是一个固定点,配置中心可以改变坐标。默认的服务ID为"configserver",开发人员可以通过spring.cloud.config.discovery.serviceId修改(在服务器上通常用spring.application.name修改)。
服务发现客户端实现全都支持某种元数据映射(例如Eureka的eureka.instance.metadataMap)。配置中心可能需要在注册元数据中配置一些额外的属性以便客户端能正确连接。如果配置中心使用HTTP Basic安全配置服务器,则可以将凭据配置为"username"和"password"。而且配置中心修改"confgPath"来设置context path。例子,对于一个身为Eureka客户端的配置中心:
bootstrap.yml
eureka: instance: ... metadataMap: user: osufhalskjrtl password: lviuhlszvaorhvlo5847 configPath: /config
配置客户端快速失败
某些情况下,如果客户端无法连接服务器,可能需要让启动失败。若需要这种行为,设置bootstrap配置属性spring.cloud.config.failFast=true,客户端就会停止并抛出异常。
配置客户端重试
如果配置中心在应用启动时偶尔不可用,那么可以让应用在失败后进行重试。首先需要设置spring.cloud.config.failFast=true,然后需要将spring-retry和spring-boot-starter-aop加入classpath。默认会重试6次,初始间隔为1000ms,后续间隔指数为1.1。这些属性在spring.cloud.config.retry.*中设置。
提示 完全控制重试功能,要添加一个类型为RetryOperationsInterceptor,id为"configServerRetryInterceptor"的Bean。Spring Retry提供了一个RetryInterceptorBuilder,可以轻松创建这个Bean。
Locating Remote Configuration Resources 定位远程配置资源
配置中心提供来自/{name}/{profile}/{label}的属性源,在客户端APP中默认绑定的是
- "name" = ${spring.application.name}
- "profile" = ${spring.profiles.active} (actually Environment.getActiveProfiles())
- "label" = "master"
以上都可以设置spring.cloud.config.*(星号就是"name","profile"和"label")来覆盖。"label"可以用来回滚到历史版本;使用默认的配置中心实现它可以是一个git label,branch名称或commit id。Label亦可用逗号分隔的列表形式提供,这种情况下列表值会一个一个试过来,直到成功为止。当在feature分支上工作时会比较有用,比方说,当开发人员需要将配置label和branch对齐时,同时又可选(例:spring.cloud.config.label=myfeature,develop)。
安全性
如果开发人员在服务端使用HTTP Basic安全,那么客户端只需要知道密码(用户名不是默认的话也需要)。开发人员可以通过config server URI或分离用户名和密码属性来实现,例:
bootstrap.yml
spring: cloud: config: uri: https:
or
bootstrap.yml
spring: cloud: config: uri: https:
spring.cloud.config.password和spring.cloud.config.username这两个属性值会覆盖任何URI提供的属性。
如果在Cloud Foundry开发APP的话,最好的方式是通过服务凭据来提供密码,比如在URI中,这样它甚至不需要在配置文件中存在。下面是一个在Cloud Foundry上用户提供的服务,本地运行,名为"configserver":
bootstrap.yml
spring: cloud: config: uri: ${vcap.services.configserver.credentials