springcloud-消息总线Bus(九)
概述
- SpringCloud Bus配合Config使用可以实现配置的动态刷新.
- 是什么
- Bus支持两种消息代理: RabbitMQ和Kafka
- Bus是用来将分布式系统的节点与轻量级消息系统链接起来的框架, 它整合了Java的事件处理机制和消息中间件的功能.
- 作用
- Bus能管理和传播分布式系统间的消息, 就像一个分布式执行器, 可用于广播状态更改, 事件推送等. 也可以当作服务间的通信通道.
- 什么是总线
- 在微服务架构的系统中, 通常会使用轻量级的消息代理来构建一个共用的消息主题, 并让系统中所有微服务实例都连接上来, 由于该主题中产生的消息会被所有实例监听和消费, 所以称它为消息总线. 在总线上的各个实例, 都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息.
- 基本原理
- ConfigClient实例都监听MQ中同一个topic(默认为Bus),, 当一个服务刷新数据的时候, 他会把这个信息放入到Topic中, 这样其他监听同一个Topic的服务就得到通知, 然后去更新自身的配置.
RabbitMQ环境配置
- 安装Erlang
- 安装RabbitMQ
- 进入RabbitMQ安装目录下的sbin目录
- 在cmd下输入以下命令开启管理功能
- rabbitmq-plugins enable rabbitmq_management
- 之后就增加了一些可视化插件
- 在cmd下输入以下命令开启管理功能
- 开启RabbitMQ, 访问地址是否安装成功
- http://localhost:15672/
- 输入账户密码: guest guest
Bus动态刷新全局广播
- 必须先具备良好的RabbitMQ环境
- 以3355微服务为模板再制作一个3366微服务
- 设计思想
- 方式一: 利用消息总线触发一个客户端bus/refresh, 而刷新所有客户端的配置.
- 方式二: 利用消息总线触发一个服务端ConfigServer的bus / refresh端点, 而刷新所有客户端的配置(更推荐)
- 显然, 方式二的架构比方式二更合适, 那么方式一不合适在哪?
-
- 打破了微服务的职责单一性, 因为微服务本身是业务模块, 它本不应该承担配置刷新职责.
- 破坏了微服务各个节点的对等性.
- 有一定的局限性, 如微服务迁移的时候, 它的网络地址常常变化, 此时要想做到自动刷新, 就会增加更多的修改.
-
- 给cloud-config-center-3344配置中心服务端添加消息总线支持
- 添加如下pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
- yml
#rabbitmq相关配置 spring.rabbitmq: host: localhost port: 5672 username: guest password: guest #rabbitmq相关配置 management: endpoints: #暴露bus刷新配置的端点 web: exposure: include: 'bus-refresh'
- 给cloud-config-center-3355客户端添加消息总线支持
- pom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency>
- yml
#rabbitmq相关配置, 15672是web管理界面的端口, 5672是MQ访问的端口 spring.rabbitmq: host: localhost port: 5672 username: guest password: guest
- 3366类似
- 测试
- 修改github上的配置文件
- 运维工程师发送POST请求: curl -X POST "http://localhost:3344/actuator/bus-refresh"
- 即实现一次修改, 广播通过, 处处生效
Bus动态刷新定点通知
- 不想全部通知, 只想定点通知, 只通知3355, 不通知3366.
- 简单一句话
- 制定具体某一个实力生效而不是全部
- 公式: http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
- /bus/refresh请求不再发送到具体的服务实例上, 而是发给config server并通过destination参数类指定需要更新配置的服务或实例.
- 例子
- 修改github配置文件后发送POST请求:
- curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"
- 即3355微服务更新, 而3366不更新.
- 修改github配置文件后发送POST请求:
通知总结