Bus
概述
1、Spring Cloud Bus 将分布式系统的节点与一个轻量级的消息代理联系起来,这个代理可以用来广播状态变化(如:配置变化)或其他管理指令
2、总线就像 Spring Boot 应用的一个分布式执行器,是可以扩展的,它也可以被用作应用程序之间的通信渠道
3、这个项目提供 AMQP 代理(RabbitMQ)或 Kafka 作为传输的启动器
4、总线
(1)在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来
(2)由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线
(3)在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息
5、基本原理
(1)客户端都监听 MQ 中同一个 Topic(默认 Spring Cloud Bus)
(2)当一个服务刷新数据时,它会把这个信息放入到 Topic 中,这样其它监听同一 Topic 的服务就能得到通知,然后去更新自身的配置
全局更新的动态更新
1、消息总线触发一个客户端 /bus/refresh,刷新所有客户端配置
(1)破坏微服务的职责单一性
(2)破坏微服务各节点的对等性
2、消息总线触发一个服务端 /bus/refresh,刷新所有客户端配置
3、消息总线依赖
(1)Kafka
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
(2)RabbitMQ
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
4、yaml 配置消息队列
(1)服务端
#省略config、注册配置
server:
port: 3344
spring:
application:
name: cloud-config-center
rabbitmq:
host: localhost
#访问端口,而非Web图形管理界面
port: 5672
username: guest
password: guest
#暴露bus刷新配置的端点,以下配置依赖actuator
management:
endpoints:
web:
exposure:
include: 'bus-refresh'
(2)客户端
#省略config、注册配置
server:
port: 3355
spring:
application:
name: config-client
rabbitmq:
host: localhost
#访问端口,而非Web图形管理界面
port: 5672
username: guest
password: guest
#暴露bus刷新配置的端点,以下配置依赖actuator
management:
endpoints:
web:
exposure:
include: '*'
5、发生 POST 请求到服务端:curl - X POST "http://localhost:3344/actuator/bus-refresh/"
定点通知的动态刷新
1、通知具体实例,而非全部
2、curl - X POST "http://localhost:3344/actuator/bus-refresh/{destination}"
(1)destination 指定更新的服务实例
(2)如:curl - X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"