Config 结合 Bus 使用记录

4 minute

为何要使用 Config 和 Bus

Config 可以进行多个微服务下的全局配置,更加方便,易于管理。

当全局配置修改时,需要通知各个微服务,一个一个地通知是非常耗时的,如果可以通过广播的方式快速将消息传递出去就轻松多了,而通过 Bus 即可实现这一点。

操作方法

  1. 在 6996 端口通过 git 拉取全局配置,相当于一个 ConfigServer;
  2. 6886 和 6776 端口作为 ConfigClient;
  3. Bus 结合 RabbitMQ 实现,修改配置时,只通知 ConfigServer,达到消息广播的效果。

依赖引入

 1<!-- ConfigServer 端 -->
 2<dependency>
 3    <groupId>org.springframework.cloud</groupId>
 4    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
 5</dependency>
 6<dependency>
 7    <groupId>org.springframework.cloud</groupId>
 8    <artifactId>spring-cloud-config-server</artifactId>
 9</dependency>
10
11<!-- ConfigClient 端 -->
12<dependency>
13    <groupId>org.springframework.cloud</groupId>
14    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
15</dependency>
16<dependency>
17    <groupId>org.springframework.cloud</groupId>
18    <artifactId>spring-cloud-starter-config</artifactId>
19</dependency>

基础配置

 1# ConfigServer 端
 2# application.yaml
 3spring:
 4  cloud:
 5    config:
 6      server:
 7        git:
 8          # github 项目地址
 9          uri: https://github.com/akynazh/SpringCloud-Demo.git
10          # 指定搜索项目下 config 文件夹中的内容
11          search-paths:
12            - config
13          # 指定分支
14          default-label: master
15  rabbitmq:
16    host: localhost
17    port: 5672
18    username: guest
19    password: guest
20management:
21  endpoints:
22    web:
23      exposure:
24        # 通过 /actuator/bus-refresh 可进行事件通知
25        include: "bus-refresh"

以后,运维人员修改 config 时,即可通过 http://localhost:6996/actuator/bus-refresh 发送POST请求进行消息通知。

 1# ConfigClient 端
 2# bootstrap.yml | 可以加载全局配置
 3spring:
 4  application:
 5    name: cloud-config-client
 6  cloud:
 7    config:
 8      label: master # 分支
 9      name: config # 文件名
10      profile: dev # 环境
11      uri: http://localhost:6996 # 全局配置加载地址
12  rabbitmq:
13    host: localhost
14    port: 5672
15    username: guest
16    password: guest

值得注意的地方:

第一,config 文件名编写需要遵循一定规则,我选择的是 {name}-{profile}.yml 的格式,然后如上配置文件应该填写对应内容。

第二,application-name 可以用于后续选择性通知,如只想通知 6776,可通过 POST 请求访问如下地址:http://localhost:6996/actuator/bus-refresh/cloud-config-client:6776。

编写相关接口

在 ConfigServer 添加 @EnableConfigServer 注解,在 ConfigClient 端编写接口:

 1@RestController
 2@Slf4j
 3public class MyController {
 4
 5    @Resource
 6    private Environment env;
 7
 8    @Value("${server.port}")
 9    String port;
10
11    @GetMapping("/v")
12    public String getVersion() {
13        return "port: " + port + "\t " + env.getProperty("config.version");
14    }
15}

测试

启动 RabbitMQ

1.sbin\rabbitmq-service.bat start

默认启动在 5672 端口。(图形界面在 15672 端口)

加载配置测试

访问:http://localhost:6996/master/config-dev.yml

会从 github 加载得到:

1config:
2  label: master
3  profile: dev
4  version: 3.0

访问:http://localhost:6776/v,得到:

1port: 6776 3.0

6886 得到相同结果,证明成功加载全局配置。

修改配置测试

修改配置 version 为 3.6,提交,发送请求如下:

1curl -X POST "http://localhost:6996/actuator/bus-refresh"

发现三个端口 version 均改为 3.6,测试通过。

修改配置 version 为 3.9,提交,发送请求如下:

1curl -X POST "http://localhost:6996/actuator/bus-refresh/cloud-config-client:6776"

发现 6996 和 6776 的 version 为 3.9,而 6886 的 version 仍为 3.6,测试通过。