什么是总线

在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都链接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称他为消息总线。

常见的总线有哪些

Bus

Bus支持两种消息代理:RabbitMQ和Kafka

RabbitMQ配置

  • 安装Erlang
  • 安装RabbitMQ
  • 在RabbitMQ的sbin文件下,输入命令rabbitmq-plugins enable rabbitmq_management启动管理后,可以在开始那找到相应的启动、停止、删除等可视化图标,进行操作
  • 访问localhpst:15672查看是否成功
  • 输入默认账号和密码:guest guest

    Bus的通知方式

  • 动态刷新全局广播

    • 利用消息总线触发一个客户端/bus/refresh,刷新所有客户端配置
    • 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,刷新所有客户端的配置

第一个的不合适的原因如下,因此采用第二种方式

  1. - 打破了微服务的职责单一性,因为微服务本身使业务模块,它本不应该承担配置刷新的职责。
  2. - 破坏了微服务各节点的对等性。
  3. - 有一定的局限性。例如,微服务在迁移时,它的网络地址常常发生变化,此时如果想要做到自动刷新,那就会增加更多的修改。
  • 相关配置
    • 服务端
      • pom增加spring-cloud-starter-bus-amqp(消息总线rabbitmq支持)、spring-boot-starter-actuator(监控)
      • yml增加rabbitmq配置

image.pngimage.png

  - 客户端
     - pom增加spring-cloud-starter-bus-amqp(消息总线rabbitmq支持)、spring-boot-starter-actuator(监控)
     - yml增加rabbitmq配置

image.pngimage.png
修改配置后,发送POST请求更新配置文件(命令:curl -X POST “http://localhost:配置中心的端口号/actuator/bus-refresh"),从而刷新所有客户端的配置
为什么服务端与客户端不需要其他配置就能处于同一线路中?
总线的基本原理:ConfigClient实例都监听MQ中同一个topic(默认是SpringCloudBus),当一个服务刷新数据时,它会把这个信息发到相应topic中,其他监听同一个topic的服务就能得到通知,去更新自身配置。

  • 动态刷新定点通知

参照全局的原理,仅在修改配置后,发送POST命令时,命令处增加一个destination
公式http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}
http://localhost:配置中心的端口号/actuator/bus-refresh/config-client:3355,这里为仅通知端口号为3355名称为config-client的客户端
存疑:能否简单的进行范围通知?

Nacos