目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

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}```

作者:Soulboy