Config 结合 Bus 使用记录
为何要使用 Config 和 Bus
Config 可以进行多个微服务下的全局配置,更加方便,易于管理。
当全局配置修改时,需要通知各个微服务,一个一个地通知是非常耗时的,如果可以通过广播的方式快速将消息传递出去就轻松多了,而通过 Bus 即可实现这一点。
操作方法
- 在 6996 端口通过 git 拉取全局配置,相当于一个 ConfigServer;
- 6886 和 6776 端口作为 ConfigClient;
- 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,测试通过。