SpringCloud学习笔记 - 消息总线 - Spring Cloud Bus

1. 消息总线简介

消息代理中间件构建了一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。

消息代理又是什么?消息代理是一个消息验证、传输、路由的架构模式,主要用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它在微服务之间起到通信调度作用,减少了服务之间的依赖。

什么是 Spring Cloud Bus
在这里插入图片描述

Spring Cloud Bus 是 Spring Cloud 体系内的消息总线,用来连接分布式系统的所有节点。

Spring Cloud Bus 将分布式的节点用轻量的消息代理(RibbitMQ、Kafka)连接起来。可以通过消息代理广播配置文件的更改,或服务之间的通讯,也可以用于监控。解决了微服务数据变更,及时同步的问题。

什么时候使用 Spring Cloud Bus

微服务一般都采用集群方式部署,而且在高并发下经常需要对服务进行扩容、缩容、上线、下线的操作。比如我们需要更新配置,又或者需要同时失效所有服务器上的某个缓存,需要向所有相关的服务器发送命令,此时就可以选择使用 Spring Cloud Bus 了。

总的来说,就是在我们需要把一个操作散发到所有后端相关服务器的时候,就可以选择使用 Spring Cloud Bus 了。

2. rabbitMQ环境配置

1. 安装ErIong

下载Windows安装包,并双击安装
https://www.erlang.org/downloads
在这里插入图片描述

安装完成后配置环境变量
在这里插入图片描述
在这里插入图片描述

使用cmd命令,输入 erl -version 验证:
在这里插入图片描述

2. 安装rabbitMQ

在RabbitMQ的gitHub项目中,下载window版本的服务端安装包。
https://www.rabbitmq.com/install-windows.html#installer
在这里插入图片描述
接着到双击安装,一直点下一步安装即可,安装完成后,找到安装目录:D:\Program Files\RabbitMQ Server\rabbitmq_server-3.10.6\sbin
在这里插入图片描述
在此目录下打开cmd命令,输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件:

然后双击rabbitmq-server.bat启动脚本,然后打开服务管理可以看到RabbitMQ正在运行:

这时,打开浏览器输入http://localhost:15672,账号密码默认是:guest/guest
在这里插入图片描述
到这一步,安装就大功告成了!
在这里插入图片描述

3. Bus动态刷新全局广播的设计思想和选型

演示广播效果,增加复杂度,再以3355为模板再制作一个3366微服务模块

  1. 新建cloud-config-client-3366
  2. 添加pom依赖
  3. 修改bootstrap.yaml
  4. 创建主启动类
  5. 编写业务类,简单起见只使用controller
@RestController
@RefreshScope
public class ConfigClientController {
    @Value("${server.port}")
    private String serverPort;
    @Value("${config.info}")
    private String configInfo;
    @GetMapping("/configInfo")
    public String configInfo(){
        return "serverPort: "+serverPort+"\t\n\n configInfo: "+configInfo;
    }
}
bus消息总线实现的两种设计思想
  1. 利用消息总线触发一个客户端/bus/refresh,而刷新所有客户端的配置
    在这里插入图片描述

  2. 利用消息总线触发一个服务端ConfigServer的/bus/refresh端点,而刷新所有客户端的配置
    在这里插入图片描述

图二的架构显然更加适合,图—不适合的原因如下:

  • 打破了微服务的职责单一性,因为微服务本身是业务模块,它本不应该承担配置刷新的职责。

  • 破坏了微服务各节点的对等性。

  • 有一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,那就会增加更多的修改。

4. Bus动态刷新全局广播配置实现

1. 给配置中心服务端(cloud-config-center-3344)添加消息总线支持

1. 引入消息总线rabbitMQ支持

<!--添加消息总线RabbitNQ支持-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2. 在yaml配置文件中添加rabbitMQ相关配置

#rabbitmq相关配置
rabbitmq:
  host: localhost
  port: 5672
  username: guest
  password: guest
  
#rabbitmq相关配置,暴露bus刷新配置的端点
management:
  endpoints:
    web:
      exposure:
        include: "bus-refresh"
2. 给配置中心客户端(cloud-config-client-3355/3366)添加消息总线支持

1. 引入消息总线rabbitMQ支持

<!--添加消息总线RabbitNQ支持-->
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2. 在yaml配置文件中添加rabbitMQ相关配置

#rabbitmq相关配置
rabbitmq:
  host: localhost
  port: 5672
  username: guest
  password: guest
3. 测试配置修改及更新
  1. 启动7001(注册中心)、3344(配置中心-服务端)、3355(配置中心-客户端)、3366(配置中心-客户端)
  2. 修改配置文件信息,并发送POST刷新请求
curl -X POST "http://localhost:3344/actuator/bus-refresh"
  1. 获取信息,查看是否生效
  • 配置中心:http://config-3344.com:3344/config-dev.yml
  • 客户端:http://localhost:3355/configlnfo、http://localhost:3366/configInfo

广播通知,—次修改,处处生效

5. 动态刷新定点通知

不想全部通知,只想定点通知:只通知3355,不通知3366,指定具体某一个实例生效而不是全部

公式:http://localhost:port/actuator/bus-refresh/{destination}

localhost:配置中心-服务端的IP地址或域名
port:配置中心-服务端的端口号
destination:需要通知的目标服务(配置中心-客户端)${服务名-端口号}
例:curl -X POST http://localhost:3344/actuator/bus-refresh/{config-client:3355}" ,这样就只会通知3355客户端刷新配置。
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值