Spring Cloud 上手7-配置中心
文章目录
这是Spring Cloud上手系列的第七篇,代码放在GitHub上,随着本系列文章更新。
概述
通过Spring Cloud Config可以对各个系统的配置信息进行集中管理和维护。
Spring Cloud Config服务端读取git、svn或本地目录(包括classpath路径)中保存的配置信息。
将Spring Cloud Config服务作为Eureka客户端,则为Config Server提供高可用。Config Client程序可以通过Eureka获取Config Server的信息并读取配置。
Spring Cloud Config Server配置
添加依赖
Spring Config 服务相关的两个依赖是org.springframework.cloud:spring-cloud-config-server
和org.springframework.cloud:spring-cloud-config-client
,分别对应于配置服务的服务端和客户端。
我们先在根模块的build.gradle
中添加程序库依赖。
|
|
添加config模块
在根模块下添加新的config
,以它作为Config Server。将这个模块添加至根模块的settings.gradle
中。
|
|
在config
模块自己的build.gradle
中添加config-server
依赖,并配置好Main-Class
:
|
|
MainClass
添加配置服务程序的入口类Application:
|
|
这里我们直接做高可用配置,添加了@EnableEurekaClient
注解,这样配置服务的客户端就能通过Eureka注册中心获取配置服务器的信息。
如果不将配置服务注册至Eureka,配置中心的客户端程序仍然能通过完整的URL来访问配置服务。但无法提供高可用支持。
对服务程序进行配置
添加application.yml
配置文件。
|
|
这里将spring.profiles.active
配置为native
,是为了使用本地目录。spring.cloud.config.server.native
是针对native profile
的配置,在这个配置文件里可以配置多个profile
,由active
确定使用哪个profile
。可以创建多套不同的profile
,分别用于本机开发、测试、生产部署。
添加样例配置文件
根据application.xml
中指定的searchLocations
,我们在config
模块的src/resources
目录下添加config
目录来保存配置信息。在这个目录下添加以下两个配置文件:
config-for-client-dev.yml
|
|
config-for-client-test.properties
|
|
打包运行配置服务程序
在sc-cloud
根模块,执行gradle build
编译整个工程。然后运行
java -jar config/build/libs/sc-config-0.0.1.jar
启动配置服务程序。
启动完毕后,在Eureka注册中心中可以查看到这个新的服务。
也可以通过http://localhost:9002/config-for-client-dev.yml
和http://localhost:9002/config-for-client-test.properties
访问上节中的配置文件。
有几种方式可以访问到这些配置文件:
- {application}/{profile}[/{label}]
- {application}-{profile}.yml
- {label}/{application}-{profile}.yml
- {application}-{profile}.properties
- {label}/{application}-{profile}.properties
label
是版本库上的分支名称,使用本地文件时,可以用master
代替。application
是配置文件名,一般将它设置为相应的应用名称,在我们的例子中它是config-for-client
。按上述的第一条规则,通过http://localhost:9002/config-for-client/dev/master
我们能获取到以下信息:
|
|
按第五条规则,通过http://localhost:9002/master/config-for-client-dev.properties
可以获取到:
|
|
注意这里并不是访问的config-for-client-test.properties
,获取到的信息是config-for-client-dev.yml
中的内容。
Spring Cloud Config Client配置
接下来配置在provider-serveice
工程,为它添加从配置中心读取配置信息的能力。
配置provider-service
的依赖
在根模块的build.gradle
中添加Spring Cloud Config客户端程序库。
|
|
在provider-service
模块的build.gradle
中添加config-client
依赖。
|
|
添加测试端点
在sc-provider
的ProviderController
中添加从配置中心读取配置信息的测试端点。
|
|
通过/provider/config
可以读取到defaultName
属性,这个属性的值来源于配置中心配置文件中的sc.provider.defaultUser
,如果读取不到配置中心的值,则取默认值defaultName not found
。
调整配置文件
主要是添加配置中心相关的配置信息,让provider-service
从配置中心读取配置。这里有个较大的调整是需要将配置中心相关的配置信息移到bootstrap.yml
中,否则,应用在启动的时候会显示从http://localhost:8888
中加载配置。
这是因为bootstrap.yml
配置信息先于application.yml
加载,特别是在使用配置中心时,需要将相关的注册中心、配置中心的信息放在bootstrap.yml
中。参见官方文档。
调整完后的bootstrap.yml
:
|
|
application.yml
:
|
|
添加测试配置文件
在config
应用的resources/config/
目录下添加sc-provider-dev.yml
配置文件,默认情况下配置中心客户端应用,会从配置中心按应用名称和profile
读取配置文件,因此,这里的文件被命名为sc-provider-dev
,即sc-provider
和dev
profile的配置文件。
配置文件内容如下:
|
|
编译和测试
在sc-cloud
根模块下执行gradle build
,编译所有工程。按以下顺序,在不同的窗口中分别启动:registry、config、provider:service三个应用:
|
|
在启动provider:service
的过程中,显示完Spring
Logo后的下一行,就可以看到从配置中心加载的配置信息,如果这里显示的是默认地址localhost:8888
,则需要再仔细检查bootstrap.yml
中的配置信息了。
启动完毕后,从http://localhost:9002/sc-provider-dev.yml
检查配置信息是否能正常读取。再从http://localhost:9010/provider/config
看是否能显示出配置sc-provider-dev.yml
中配置的值。如果显示的值是defaultName not found
,那么读取也是失败的,这个值是在从配置中心读取失败后,读取的默认值。
读取快速失败和重试
快速失败
在上一步测试的过程中,可能会因为启动顺序、网络等多种原因,导致provider:service
启动时读取配置失败。默认情况下,读取失败并不会导致程序启动报错,有些情况下我们可能需要在从配置中心读取失败时及时给出提示。可以在配置中心客户端程序的bootstrap.yml
配置文件中添加spring.cloud.config.failFast=true
。
添加这项配置后,我们将配置中心应用停掉,并重启provider:service
应用,可以看到以下报错信息:
重试读取
当出现这种情况时,更多情况下我们是希望配置中心客户端程序能重试。这时我们可以需要添加spring-retry
和spring-boot-starter-aop
模块来支持重试读取。默认情况下会重试6次,6次后才会返回错误信息。这可以避免因启动顺序或偶发问题产生的配置信息读取失败。
我们需要在根模块的build.gradle
和ext.libs
中注册这两个依赖:
|
|
保持provider:service
应用的spring.cloud.config.failFast=true
,然后在其build.gradle
中添加依赖即可,程序本身不需要修改。需要注意的是在Edgware.SR3
中,如果应用启动的时候无法连接配置中心,不会像有些文章中提及的那样重试机制会起作用,这个时候重试机制不起作用,应用会直接挂掉。在我验证的过程中,重试机制只在配置中心可连接,但没有响应(发生了不可恢复的异常)的情况下,重试机制才起作用。
|
|
配置刷新
Actuator监控端点
配置的刷新是通过Spring Boot的监控端点来实现的。到目前为止,我们只有访问http://localhost:9002/beans
,即配置服务的监控端点才有响应,这是因为Spring Config Server依赖于actuator
,我们不需要显式的添加依赖。对于其它服务,我们需要添加spring-boot-starter-actuator
这个依赖。这个依赖除了可以用于刷新配置信息外,还带了很多监控Spring Boot服务状态的端点,因此我们把它添加到根模块的依赖中,并将它应用到除api
模块之外的所有应用上。
先调整ext.libs
:
|
|
自动添加至其它应用:
|
|
配置刷新方法
在刷新配置的测试中,由于需要测试修改配置中心的配置文件,我们需要先把配置中心的配置文件移至resources
目录的外面。即,将这些文件不进行打包。我们先将config
应用的src/main/resources/config
目录移至根模块下的support
目录下。然后,修改config
应用的application.yml
配置文件的spring.cloud.config.server.native.searchLocations
属性,将它的值修改为file:config目录路径
。
在ProviderController
上添加@RefreshScope
注解,当配置信息修改之后,我们可以通过发送POST
请求至http://localhost:9010/refresh
来刷新@Value
注解对应的配置信息。在refresh过程中,可以从控制台查看到重新从配置中心获取配置信息的日志。
比如,修改:support/sc-provider-dev.yml
里sc.provider.defaultUser
的值。之后发送请求至provider:service
应用(curl -X POST http://localhost:9010/refresh
)。再查看http://localhost:9010/provider/config
就能看到新的配置文件值。
文章作者 Jamsa
上次更新 2018-06-10