SpringCloud微服务组件-消息总线bus
- 一 定义
- 二 配置实现消息统一发送
一 定义
前面我们使用SpringCloud Config之后可以动态的为项目提供配置,但是有一些遗留问题,如下:
手动刷新与业务耦合
N个微服务端需要N次手动刷新
所以就引出了SpringCloud Bus这一组件,他是消息总线。使用bus可以实现config的自动刷新配置,也是config的增益buff,一般都是共同使用的。
从字面意思上就能看的出来,消息总线是和消息相关的,那么他是支持RabbitMQ的
结合SpringCloud Bus后的架构图
其实本质上就是原先我们人工手动刷新配置的操作,交给了mq,mq可以向所有订阅者发送消息,通知他们去自动刷新,这么一来,不论有多少台微服务,那么我只需要发送一个通知信息给config,虽然config去通知其他微服务去实现配置刷新即可。
简单来说,springcloud为我们封装了一个bus组件,这个bus组件又是对rabbitmq的代理,可以很方便的构建消息传播到其他的微服务,让这些微服务监听并消费。
二 配置实现消息统一发送
bus支持RabbitMQ,也支持Kafka,我们这里以RMQ为演示。
我们会实现config server来通知其他的服务端(也就是zuul),所以在config端和zuul网关我们都需要配置bus消息总线。
1.在config端引入bus依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.在config端配置rabbitmq:
spring:
rabbitmq:
host: 192.168.1.204
port: 5672
username: admin
password: admin
virtual-host: imooc-news
3.配置暴露的bus动态刷新端点路径请求:
# 开启bus动态刷新的路径请求
management:
endpoints:
web:
exposure:
include: "*"
4.在客户端配置pom:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
5.在客户端配置rabbitmq
spring:
rabbitmq:
host: 192.168.1.204
port: 5672
username: admin
password: admin
virtual-host: imooc-news
6.上述配置结束以后,install并且重启服务。随后进行测试:
修改git上的配置
通过postman发送post访问 http://192.168.1.2:7080/actuator/bus-refresh 来刷新config-server,从而刷新客户端配置
如此一来,有N个微服务的话,那么只需要刷新配置中心即可。
精确通知:可以通过配置具体的客户端地址,来达道精确通知的目的:
http://192.168.1.2:7080/actuator/bus-refresh/{服务实例id}:{端口号}