此文章主要讲解springcloud中的消息总线Bus(不推荐)的相关知识。

Spring Cloud Bus

Spring Cloud Bus是什么?

  • Spring Cloud Bus配置Spring Cloud Config使用可以实现配置的动态刷新。

springcloud 不使用 Consul_微服务

  • Spring Cloud Bus是用来分布式系统的节点和轻量级消息系统连接起来的框架,它整合了Java事件处理机制和消息中间件的功能。
  • Spring Cloud Bus目前支持RabbitMQKafka

Spring Cloud Bus能干嘛?

Spring Cloud Bus能管理和传播分布式系统间的消息,就像一个分布式执行器,可用于广播状态更改、事件推送等,也可以当做微服务间的通信通道。

springcloud 不使用 Consul_客户端_02

为什么称为总线?

什么是总线

  • 在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称其为消息总线。
  • 在总线上的各个实例,都可以方便的传播一些需要让其他连接在该主题上的实例都知道的消息。

基本原理

  • Config Client实例都监听MQ中的同一个Topic(默认是SpringCloudBus)。当一个服务刷新数据的时候,其他监听到这个主题的服务就会得到通知,然后去更新自身的配置。

设计思想

springcloud 不使用 Consul_Cloud_03

springcloud 不使用 Consul_分布式_04

根据上图我们可以看出Spring Cloud Bus做配置更新的步骤:

  1. 提交代码触发POST请求给bus/refresh。
  2. Server端接收到请求并发送给Spring Cloud Bus。
  3. Spring Cloud Bus接收到消息并通知给其他客户端。
  4. 其他客户端接收到通知,请求Server端获取最新配置。
  5. 全部客户端获取到最新的配置。

安装RabbitMQ

windows安装

  1. 安装RabbitMQ的依赖环境 Erlang 下载地址: http://erlang.org/download/otp_win64_21.3.exe
  2. 安装RabbitMQ,下载地址: http://dl.bintray.com/rabbitmq/all/rabbitmq-server/3.7.14/rabbitmq-server-3.7.14.exe
  3. 进入 rabbitMQ安装目录的sbin目录下,打开cmd窗口,执行以下命令,启动管理功能:
rabbitmq-plugins enable rabbitmq_management
  1. 访问【 http://localhost:15672/ 】,输入账号和密码:默认都为 guest
  2. 在电脑服务列表里,将RabbitMQ启动方式改为手动

docker方式安装

docker run -d  --name rabbit -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=root -p 15672:15672 -p 5672:5672 rabbitmq:management # 这里设置了默认账号密码都是root,可以自定义

动态刷新全局广播

必须先具备良好的RabbitMQ环境

还是在之前的 3344(config server)和 3355(config client)两个项目来改进。

新建模块

以 3355 为模板新建一个模块:cloud-config-client-3366

服务端修改

cloud-config-center3344

POM添加依赖
<!-- 添加rabbitMQ的消息总线支持包 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML配置

application.yml 增加如下内容

# rabbitMq的相关配置
rabbitmq:
  host: localhost
  port: 5672 # # 15672是管理界面端口,5672是连接端口
  username: guest
  password: guest
# rabbitmq 的相关配置2 暴露bus刷新配置的端点
management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'

客户端修改

POM添加依赖
<!-- 添加rabbitMQ的消息总线支持包 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
YML配置

bootstrap.yml

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    # config 客户端配置
    config:
      label: master # 分支名称
      name: config # 应用名称,需要对应git中配置文件名称的前半部分
      profile: dev # 开发环境,需要对应git中配置文件名称的后半部分
      uri: http://config-3344.com:3344  # config Server 的请求地址
      # 综合上面四个 即读取配置文件地址为: http://config-3344.com:3344/master/config-dev.yml
  # rabbitMq的相关配置,注意缩进
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
    
# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka/

测试

启动相关微服务,7001/3344/3355/3366。

修改Github或Gitee上的yml文件,并提交。

config server 发送POST请求

curl -X POST "http://localhost:3344/actuator/bus-refresh"

注意,之前是向 config client 一个个发送请求,但是这次是向 config server 发送请求,而所有的config client 的配置也都全部更新,一次发送,处处生效

动态刷新定点通知

概述

有的时候,不需要在刷新服务端的时候,将与之对应的所有客户端都动态刷新,而是只需要刷新具体的某个客户端即可。

方法

发送POST请求到http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}即可。

{destination}为 客户端微服务名称:端口号 ,微服务名称小写。

springcloud 不使用 Consul_微服务_05

springcloud 不使用 Consul_微服务_06

总结

springcloud 不使用 Consul_微服务_07