Spring Cloud Config 统一配置中心

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,实现自动获取最新配置。

至此两种消息代理:

  • RabbitMQ
  • Kafka

WebHook

WebHook 是当某个事件发生时,通过发送 http post 请求的方式来通知信息接收方。

通过创建 WebHook 即可自动触发 POST 请求,让客户端动态刷新配置。