1.开篇

上一篇文章说到SpringCloud中的Config服务配置,最后遗留下了一个问题:我们可以使用curl -X POST命令为配置客户端发送请求,使得客户端此时实现了动态刷新,能够拿到最新的配置数据;倘若有多个客户端呢?每次手动写curl命令太麻烦了。而解决的方法就是利用Bus服务消息总线!!!

在微服务架构的系统中,通常会使用轻量级的消息代理来构建一个共用的消息主题,并让系统中所有微服务实例都连接上来。由于该主题中产生的消息会被所有实例监听和消费,所以称它为消息总线。在总线上的各个实例,都可以方便地广播一些需要让其他连接在该主题上的实例都知道的消息。
 
基本原理:ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。

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

Spring Clud Bus目前支持RabbitMQ和Kafka。

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

主要有以下两种消息通知方式,第一张图是利用消息总线触发某一个客户端 /bus/refresh,再由这个客户端触发其他的客户端进行通知,达到动态刷新,更新配置信息。

第二张图是利用消息总线触发一个服务端 /bus/refresh,再由服务端直接推送给相关的所有的客户端,实现动态刷新,更新配置信息。

PS: 显然第二张图更符合逻辑思想。因为第一张图描述的情况打破了微服务的职责单一性,客户端这里本身是业务模块,就不应该承担动态刷新配置的职责,同时也破坏了微服务各节点的对等性,也有一定的局限性。


2.项目源码

github源码地址:https://github.com/2656307671/SpringCloud-Hoxton-Bus

gitee源码地址:https://gitee.com/szh-forever-young/SpringCloud-Hoxton-Bus

首先在上一篇文章(Config服务配置)的基础上,再新建一个3366客户端模块。(等于说现在有7001服务注册中心、3344服务端、3355和3366两个客户端)

在这里Bus服务消息总线,我使用的是RabbitMQ,所以在pom文件中要添加相关的依赖、yml中要添加RabbitMQ的相关配置信息。

在启动测试之前,首先要确保你的RabbitMQ成功跑起来!!!在浏览器中输入:虚拟机IP:15672,即可访问RabbitMQ的web管理界面窗口。(这里说一下:15672是RabbitMQ Web管理界面的端口;5672是RabbitMQ访问的端口)

下面启动测试(顺序:7001、3344、3355、3366),首先可以看到Eureka服务注册中心中已经有了3344、3355、3366这三个微服务信息。

然后我们到gitee的springcloud-config仓库中将config-dev.yml文件做个小修改,将version改为4。

仓库地址:https://gitee.com/szh-forever-young/springcloud-config

修改完之后,到浏览器中测试,url:本机IP + 端口号 / git仓库分支 / 仓库中的某个文件。这里不需要写仓库名是因为3344的yml中已经配置了仓库地址。

可以看到3344正确无误的拿到了最新的配置数据,version=4。

下面,我们仍然使用curl来发送请求。

这里注意:上一篇文章Config服务配置中,实现动态刷新的命令是:curl -X POST "http://localhost:3355/actuator/refresh",这仅仅是针对3355一个客户端的。

现在我们做了改进,直接 curl -X POST "http://localhost:3344/actuator/bus-refresh" 向3344服务端发送请求,那么它将更新所有与自己相连的客户端的配置信息。也就是:一次发送,处处生效。

从上图可以看到,我们只向3344服务端发送了一次请求,它下面的3355、3366客户端全部实现了对配置信息的动态刷新。

此时我们可以在RabbitMQ的web管理界面窗口中看到多了一个交换机springCloudBus,而这个交换机其实就是:ConfigClient实例都监听MQ中同一个topic(默认是springCloudBus)。当一个服务刷新数据的时候,它会把这个信息放入到Topic中,这样其它监听同一Topic的服务就能得到通知,然后去更新自身的配置。

最后再说一下,上面的案例是实现了利用消息总线触发了3344服务端下所有的客户端(3355、3366),实现了动态刷新。

当然也可以实现定点通知,就是说,我们只通知3355,不通知3366。公式:http://localhost:配置中心服务端的端口号/actuator/bus-refresh/{destination}。

例如:http://localhost:3344/actuator/bus-refresh/config-client:3355。

只所以是 config-client:3355,是因为我在3355微服务模块中将它的微服务名称定义为了config-client。

SpringCloud Hoxton——Bus服务消息总线相关推荐

  1. 499、Java分布式和集群12 -【SpringCloud视图微服务 - 消息总线Bus】 2021.06.01

    目录 0.RabbitMQ 1.先运行,看到效果,再学习 2.pom.xml 3.bootstrap.yml 4.application.yml 5.ProductDataServiceApplica ...

  2. SpringCloud微服务(七)——Bus服务消息总线

    SpringCloud Bus动态刷新全局广播 SpringCloud Spring Cloud Bus配合Spring Cloud Config使用可以实现配置的动态刷新,通知一处,处处生效.而不用 ...

  3. 微服务-消息总线 SpringCloud Bus

    1. why 上篇中的配置中心服务端可以实现从远程仓库拉取实时变更的配置, 但是客户端无法直接实现配置更新, 需要向客户端发送一个post请求刷新配置(/actuator/refresh), 客户端微 ...

  4. SpringCloud Hoxton——OpenFeign服务接口调用

    1.开篇 github源码地址:https://github.com/2656307671/-SpringCloud-Hoxton-OpenFeign gite源码地址:https://gitee.c ...

  5. springcloud微服务架构开发实战:分布式消息总线

    消息总线的定义 前面在1.4.2节中强调过,在微服务架构中,经常会使用REST 服务或基于消息的通信机制. 在3.6节中也详细介绍了消息通信的实现方式.消息总线就是一种基于消息的通信机制. 消息总线是 ...

  6. 基于SpringCloud的微服务架构演变史?

    系统架构演变概述 在公司业务初创时期,面对的主要问题是如何将一个想法变成实际的软件实现,在这个时候整个软件系统的架构并没有搞得那么复杂,为了快速迭代,整个软件系统就是由"App+后台服务&q ...

  7. SpringCloud微服务架构,Config 分布式配置中心,Bus 消息总线, Stream 消息驱动,Sleuth+Zipkin 链路追踪

    Config分布式配置中心 Config 概述 概述 • Spring Cloud Config 解决了在分布式场景下多环境配置文件的管理和维护. • 好处: • 集中管理配置文件 • 不同环境不同配 ...

  8. SpringCloud config 配置中心集群配置以及整合消息总线BUS实现关联微服务配置自动刷新

    一.SpringCloud Config 基本配置中的问题 在上一章节<SpringCloud config 配置中心介绍与基本配置使用>中我们现实了配置中心的配置集中管理.调用微服务应用 ...

  9. SpringCloud教程-消息总线Bus 服务端(server)刷新(SpringCloud版本Greenwich.SR4)

    文章目录 项目示例 config-server-bug 代码地址:github-spring-cloud地址 前言:本篇文章在上一篇文章基础上进行修改,因为虽然我们做到了利用一个消息总线触发刷新,而刷 ...

  10. 原 史上最简单的SpringCloud教程 | 第八篇: 消息总线(Spring Cloud Bus)(Finchley版本)

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f8-bus/ 本文出自方志朋的博客 转载请标明出处: Spr ...

最新文章

  1. Codeforces Round #256 (Div. 2) D Multiplication Table
  2. 评价并不精辟,感觉没有什么深度
  3. html让元素纵向排列,html – 如何使元素排列到父元素的外边缘
  4. 1030 完美数列 (25 分)(c语言)
  5. 牛客题霸 [ 树的直径] C++题解/答案
  6. php 时间选择,PHP-在学说2中的日期之间选择条目
  7. 【LeetCode笔记 - 每日一题】373. 查找和最小的 K 对数字(Java、堆、优先队列)
  8. oracle创建主键开并行,Oracle并行添加主键
  9. mAP(mean Average Precision)应用(转)
  10. 使用青云主机的GPU主机教程(不完整版)
  11. python异常数据处理_python中如何处理异常值
  12. 有道单词本手机和电脑同步问题
  13. 基础网络连接及拓扑图
  14. 八爪鱼导出到mysql数据库_八爪鱼采集器怎么将数据导出数据库?
  15. 代码设计时应遵循哪些原则
  16. 你真的懂Java的ArrayList吗?
  17. L1 和 L2的区别
  18. 设计模式04—工厂模式
  19. 我读《写给大家看的设计书》
  20. 能量守恒matlab,仿真动画软件设计作品--理想情况下能量守恒定律

热门文章

  1. VsCode设置一行代码固定长度
  2. 怎样快速开发属于自己的微信小程序?
  3. 远程服务RMI源码解析(二)
  4. 《2022女程序员人群洞察报告》
  5. 如何用公式编辑器编辑直角三角形符号
  6. 服务器系统测试,服务器系统整合测试
  7. 无源贴片晶振四角引脚_四脚贴片晶振有方向之分吗
  8. i7 1165g7和i7 10510u哪个好
  9. 华北电力计算机类哪个专业好,华北电力大学哪个专业好就业
  10. ls只显示文件名/只显示文件夹名