Bus
Bus 简介
Spring Cloud Bus(消息总线)通过一个轻量级的消息中间件可以连接分布式系统中的各个节点。可以使用该总线来广播某些状态的改变(比如配置信息发生变更)或其他管理指令,以下是 Bus 适用的场景:
- 一个事件,需要广播或者单独传递给某个接口。
- 配置更新了,但是其他系统不知道是否更新。
SpringCloud 默认使用 RabbitMQ 作为消息队列组件。
分布式配置中心 Config 结合 Bus
部署 MQ 服务
这里基于 Docker 部署 RabbitMQ
1docker pull rabbitmq:management #拉取镜像
2docker run -d --hostname rabbit-host --name="myrabbitmq" -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 5672:5672 -p 15672:15672 rabbitmq:3-management
访问控制台
http://192.168.31.210:15672/
config-client 配置
引入依赖
1<!--配置中心结合消息队列-->
2 <dependency>
3 <groupId>org.springframework.boot</groupId>
4 <artifactId>spring-boot-starter-actuator</artifactId>
5 </dependency>
6 <dependency>
7 <groupId>org.springframework.cloud</groupId>
8 <artifactId>spring-cloud-starter-bus-amqp</artifactId>
9 </dependency>
RabbitMQ 连接配置,并且暴露接口(这样 GitHub 才能通过 Hook 去出发 config client 去主动更新最新的配置)
1spring: #服务的名称
2 rabbitmq:
3 host: 192.168.31.210
4 port: 5672
5 username: admin
6 password: admin
7#暴露全部的监控信息
8management:
9 endpoints:
10 web:
11 exposure:
12 include: "*"
验证环节
在 product-server 项目调用方法中引入配置文件的 env 属性,并在方法上添加注解 @RefreshScope
1@RestController
2@RequestMapping("/api/v1/product")
3public class ProductController {
4
5 @Value("${server.port}")
6 private String port;
7
8 @Value("${env}")
9 private String env;
10
11 @Autowired
12 private ProductService productService;
13
14 /**
15 * 根据id查找商品详情
16 * @param id
17 * @return
18 */
19 @RequestMapping("find")
20 public Object findById(int id){
21
22 Product product = productService.findById(id);
23
24 Product result = new Product();
25 BeanUtils.copyProperties(product,result);
26 result.setName( result.getName() + " data from port="+port + " env ="+env);
27 return result;
28 }
29}
在 GitHub 中修改配置文件,将其中的 env 的值改为 test2
1server:
2 port: 8772
3
4env: test2
5branch: master
此时访问 config server(已同步)
1branch: master
2env: test2
3server:
4 port: 8772
此时 config client (env 依然为 test,未同步)
http://localhost:8772/product-service-test.yaml
1{
2 "id": 2,
3 "name": "冰箱 data from port=8772 evn =test",
4 "price": 5342,
5 "store": 19
6}
手动触发 config client 暴露的接口(GitHub 等可以设置自动触发 config client 的接口)
需要以 POST 的方式进行访问:http://192.168.31.230:8772/actuator/bus-refresh
再次观察 config client (已经同步,env 变为最新的 test2)
1{
2 "id": 2,
3 "name": "冰箱 data from port=8772 evn =test2",
4 "price": 5342,
5 "store": 19
6}```