介绍
Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。Spring cloud使用git或svn存放配置文件,默认情况下使用git。
Spring Cloud Config主要功能:
- 集中管理各环境、各个服务的配置文件
- 提供服务端和客户端支持
- 配置文件修改后,可以快速生效
- 配置文件通过git/svn进行管理,天然支持版本回退功能
- 支持高并发查询,也支持各种开发语言
接下来以git为例做一个示例。
git示例
准备
github创建一个名为configRepoTest的仓库。将准备的文件上传到仓库,文件内容看仓库(https://github.com/xiaoxiaoshou/configRepoTest)。
server端
创建一个springboot项目。
1.依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
2.启动类添加注解
@SpringBootApplication
@EnableConfigServer
public class ConfigserverApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigserverApplication.class, args);
}
}
3.配置文件application.yml
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/xiaoxiaoshou/configRepoTest
search-paths: client1 # 仓库中配置文件的目录
username: github用户名
password: github密码
server:
port: 8081
search-paths对应的值也可以用占位符配置search-paths: {application}
4.启动测试
输入http://localhost:8081/config-server/dev获取dev配置信息。如果直接查看dev配置文件中的配置信息可访问http://localhost:8081/client1-dev.properties。
实际上访问地址如下规则:
- /{application}/{profile}[/{label}]
- /{application}-{profile}.yml
- /{label}/{application}-{profile}.yml
- /{application}-{profile}.properties
- /{label}/{application}-{profile}.properties
application表示配置文件名
profile表示配置文件profile,例如test、dev、prod
label表示git分支,参数可选默认就是master
Client端
1.依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.配置文件
- application.yml
spring:
application:
name: config-client
server:
port: 8082
- bootstrap.yml
spring:
cloud:
config:
name: client1
profile: dev
label: master
uri: http://localhost:8081
注意:上面这些与Springcloud相关的属性必须配置在bootstrap.yml,config部分内容才能被正确加载。因为config的相关配置会先于application.yml,而bootstrap.yml的加载也是先于application.properties。
3.控制层提供测试接口
@RestController
public class HelloController {
@Value("${pikachues}")
String pikachues;
@GetMapping("/hello")
public String hello(){
return this.pikachues;
}
}
注意上面配置的pikachues这个名称是github上配置的key名称,如果不是启动会报错。
启动项目访问:http://localhost:8082/hello即可看到你github上配置key对应的值,我这里是返回dev。
扩展
虽然在实际开发中,配置文件一般都是放在git仓库中,但是,Config-server也支持将文件放在classpath下。
配置文件添加如下配置即可实现:
spring:
profiles:
active: native # 表示让config-server从classpath下查找配置,而不是去github查找
cloud:
config:
server:
native:
search-locations: file:/E:/properties/ # 指定配置文件的位置
动态刷新
在上面git示例中你会发现,当github中的配置文件发生变化时,server端获取的是最新的信息,而client端获取的是旧的配置信息,也就是说server端可以及时感知到配置信息的变化,而client不能及时感知到配置文件的变化。默认情况下client端只有重启才能加载到最新的配置文件。要实现动态刷新步骤如下:
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.application.yml中添加如下配置,使refresh端点暴露出来
management:
endpoints:
web:
exposure:
include: refresh
3.在client端使用了配置文件的地方加上@RefreshScope注解
加上注解后,当配置文件改变后只要调用refresh端点,client端中的配置就可以刷新。
@RestController
@RefreshScope
public class HelloController {
@Value("${pikachues}")
String pikachues;
@GetMapping("/hello")
public String hello(){
return this.pikachues;
}
}
配置成功后重启client端,以后只要配置文件发生变化,发送post请求调用http://localhost:8082/actuator/refresh接口配置文件就会自动刷新。
请求失败重试
client端在调用server端时,可能发生调用失败的情况,那么我们可以配置一个请求重试的功能。
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
</dependency>
2.配置文件
spring:
cloud:
config:
# 开启快速响应(主要)
fail-fast: true
retry:
# 请求重试的初始间隔时间
initial-interval: 1000
# 最大重试次数
max-attempts: 6
# 重试时间间隔
multiplier: 1.1
# 最大间隔时间
max-interval: 2000
配置完成后重启,以上配置完成后即可实现请求失败重试。