Spring Cloud Config
Spring Cloud Config 是一个解决分布式系统的配置管理方案。
- Server
- 提供配置文件的存储,以接口的形式提供配置文件的内容
- Client
Config Server
新建一个 git 仓库
在 git 服务器上创建一个仓库,用来存放配置文件。
并在仓库中添加相应的配置文件。
- user-dev.yml
- user-test.yml
- user-prod.yml
具体实现
添加依赖
1
2
3
4
5
6
| <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
</dependencies>
|
添加注解
1
2
3
4
5
6
7
8
| @EnableConfigServer
@EnableDiscoveryClient
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
|
配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| spring:
application:
name: config
cloud:
config:
server:
git:
uri: http://github.com/xxx/confg # 配置文件仓库地址
username: ...
password: ...
searchpath: config-repo # git仓库地址下的相对地址,可配置多个
server:
port: 8000
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
|
通过接口查看配置
仓库中的配置文件会被转换成web接口,启动应用后,可在浏览器中查看配置文件(若配置文件的格式有错误,将无法访问)。
如访问 http://localhost:8000/user/dev
即可返回 user-dev.yml 的配置信息。
/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
profile:配置环境,label:仓库分支。
Config Client
在项目中创建 bootstrap.yml
在项目中,bootstrap.yml 会优先于 application.yml 加载。
application.yml 应用场景
主要用于 Spring Boot 项目的自动化配置。
bootstrap.yml 应用场景
- 从额外的资源加载配置信息(如使用 Spring Cloud Config 时)
- 一些固定不能被覆盖的属性(具有高优先级,一般不会被本地配置或application中同名配置覆盖)
- 一些 加密/解密 的场景
具体实现
添加依赖
1
2
3
4
| <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
|
配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| spring:
application:
name: user # 该应用获取之前配置好的 user-dev.yml
cloud:
config:
url: http://localhost:8000/
profile: dev
label: master
---
spring:
cloud:
config:
discovery:
enable: true # 启用服务发现 (Eureka)
service-id: config # spring cloud config server 应用名称
profile: dev
label: master
|
启动服务
启动服务时,即会先去 git 仓库获取配置信息。
配置信息自动更新
当 git 仓库中的配置信息更新后,使用配置的客户端并不会自动更新配置。所以我们需要一些机制去触发配置的更新。
actuator
添加依赖
1
2
3
4
| <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
|
添加注解,打开更新机制
通过在需要加载更新配置的类上添加 @RefreshScope
,当客户端通过触发 POST 方式的 /refresh
时,会自动将新的配置更新到相应的字段中。
1
2
3
4
5
6
7
8
9
10
| @RefreshScope // 该类中配置相关会自动刷新
@RestController
public class ActuatorController {
@Value("${env}")
private String env;
@RequestMapping("/env")
public String env {
return this.env;
}
}
|
配置文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # server 端添加
management:
endpoints:
web:
exposure:
include: "*"
---
# client 端添加
management:
endpoints:
web:
exposure:
include: refresh
|
测试自动刷新
当 git 仓库中配置文件更新后,通过发送 POST 请求到 /refresh
后,客户端会自动获取最新配置。
1
| curl -v -X POST http://localhost:8080/actuator/refresh
|
Spring Cloud Bus (推荐)
通过 spring cloud bus,通过 POST 请求 /bus-refresh
,实现自动获取最新配置。
至此两种消息代理:
WebHook
WebHook 是当某个事件发生时,通过发送 http post 请求的方式来通知信息接收方。
通过创建 WebHook 即可自动触发 POST 请求,让客户端动态刷新配置。