一文透析SpringCloud,关于Bus消息总线,总算梳理清楚了

SpringCloud之Bus消息总线 目录`bus` 简介`bus` 工作架构 bus 简介 从 上一篇 文章可以得知 config client 服务从 config server 端获取自己对应的配置文件,但是目前的问题是:当远程 git 仓库配置文件发生改变时,每次都是需要重启 config client 服务,如果有上百上千个微服务呢? 我想我们不会一个个去重启每个微服务,也就是说如何让 config server 端通知到 config client 端? 即 config client 端如何感知到配置发生更新? 这时候就该 bus 阅读详情

什么是消息总线

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

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

什么是 Spring Cloud Bus

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

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

官方文档:https://cloud.spring.io/spring-cloud-static/spring-cloud-bus/2.2.1.RELEASE/reference/html/

什么时候使用 Spring Cloud Bus

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

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

接下来我们通过 Spring Cloud Bus 实现微服务架构的配置刷新。

环境准备

RibbitMQ v3.8.2 地址:192.168.10.101

bus-demo 聚合工程。SpringBoot 2.2.4.RELEASE、Spring Cloud Hoxton.SR1。

  • eureka-server:注册中心
  • eureka-server02:注册中心
  • config-server:配置中心服务端
  • config-server02:配置中心服务端
  • order-service:订单服务(配置中心客户端)
  • order-service02:订单服务(配置中心客户端)

配置文件 order-service-prod.yml

spring:  application:    name: order-service # 应用名称# 配置 Eureka Server 注册中心eureka:  instance:    prefer-ip-address: true       # 是否使用 ip 地址注册    instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:port  client:    service-url:                  # 设置服务注册中心地址      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/# 自定义配置name: order-service-prodpassword: root

Spring Cloud Bus 实现配置刷新

客户端发起通知

点击链接观看:客户端发起通知视频(获取更多请关注公众号「哈喽沃德先生」)

消息总线(Bus)的典型应用场景就是配置中心客户端刷新。

我们在学习 Spring Cloud Config 配置中心时给大家讲了基于 Actuator 的配置刷新,当时的案例只有一个 Config Client,我们可以使用 Webhook,设置手动刷新都不算太费事,但是如果客户端比较多的情况下,一个一个去手动刷新未免有点复杂,这种方案就不太适合了。使用 Spring Cloud Bus 可以完美解决这一问题。

借助 Spring Cloud Bus 的广播功能,让 Config Client 都订阅配置更新事件,当配置更新时,触发其中一个端的更新事件,Spring Cloud Bus 就把此事件广播到其他订阅客户端,以此来达到批量更新。

  1. Webhook 监听被触发,给 ConfigClient A 发送 bus-refresh 请求刷新配置
  2. ConfigClient A 读取 ConfigServer 中的配置,并且发送消息给 Bus
  3. Bus 接收消息后广播通知其他 ConfigClient
  4. 其他 ConfigClient 收到消息重新读取最新配置

添加依赖

Config Client 添加 spring cloud starter bus amqp 依赖。

<!-- spring cloud starter bus amqp 依赖 --><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>

配置文件

配置文件需要配置 消息队列 和 bus-refresh 自动刷新端点。/actuator/bus-refresh 端点会清除 @RefreshScope 缓存重新绑定属性。

Config Client 的 bootstrap.yml 核心配置。

spring:  cloud:    config:      name: order-service # 配置文件名称,对应 git 仓库中配置文件前半部分      label: master # git 分支      profile: prod # 指定环境      discovery:        enabled: true # 开启        service-id: config-server # 指定配置中心服务端的 service-id  # 消息队列  rabbitmq:    host: 192.168.10.101    port: 5672    username: guest    password: guest    virtual-host: /# 度量指标监控与健康检查management:  endpoints:    web:      base-path: /actuator    # 访问端点根路径,默认为 /actuator      exposure:        include: bus-refresh  # 需要开启的端点        #exclude:             # 不需要开启的端点

测试

查看端点

访问:http://localhost:9091/actuator 可以看到已经开启了 bus-refresh 自动刷新端点。

访问:http://localhost:9091/name 和 http://localhost:9092/name 结果如下:

修改 Git 仓库配置

修改Git 仓库配置信息如下:

# 自定义配置name: order-service-prod-1.0

自动刷新

刷新页面发现结果并未改变,没事正常。

通过 Post 方式调用**「任意客户端」**的自动刷新端点:http://localhost:9091/actuator/bus-refresh 再次访问结果如下:

查看队列

再来观察一下消息队列的 UI 界面,发现多了一个 springCloudBus 的交换机。

该交换机下绑定了两个队列对应我们的两个 Config Client。

客户端发起通知缺陷

  • 打破了微服务的职责单一性。微服务本身是业务模块,它本不应该承担配置刷新的职责。
  • 破坏了微服务各节点的对等性。
  • 存在一定的局限性。例如,微服务在迁移时,它的网络地址常常会发生变化,此时如果想要做到自动刷新,就不得不修改Webhook 的配置。

服务端发起通知

为了解决客户端发起通知缺陷,我们改用服务端发起通知。

  1. Webhook监听被触发,给 ConfigServer 发送 bus-refresh 请求刷新配置
  2. ConfigServer 发送消息给 Bus
  3. Bus 接收消息后广播通知所有 ConfigClient
  4. 各 ConfigClient 收到消息重新读取最新配置

添加依赖

Config Server 添加 spring cloud starter bus amqp 依赖。

<!-- spring cloud starter bus amqp 依赖 --><dependency>    <groupId>org.springframework.cloud</groupId>    <artifactId>spring-cloud-starter-bus-amqp</artifactId></dependency>

配置文件

配置文件需要配置 消息队列 和 bus-refresh 自动刷新端点。/actuator/bus-refresh 端点会清除 @RefreshScope 缓存重新绑定属性。

Config Server 的 application.yml 核心配置。

spring:  application:    name: config-server # 应用名称  cloud:    config:      server:        git:          uri: https://github.com/imrhelloworld/config-repo # 配置文件所在仓库地址          #username:             # Github 等产品的登录账号          #password:             # Github 等产品的登录密码          #default-label: master # 配置文件分支          #search-paths:         # 配置文件所在根目录  # 消息队列  rabbitmq:    host: 192.168.10.101    port: 5672    username: guest    password: guest    virtual-host: /# 配置 Eureka Server 注册中心eureka:  instance:    prefer-ip-address: true       # 是否使用 ip 地址注册    instance-id: ${spring.cloud.client.ip-address}:${server.port} # ip:port  client:    service-url:                  # 设置服务注册中心地址      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/# 度量指标监控与健康检查management:  endpoints:    web:      base-path: /actuator    # 访问端点根路径,默认为 /actuator      exposure:        include: bus-refresh  # 需要开启的端点        #exclude:             # 不需要开启的端点

测试

查看端点

访问:http://localhost:8888/actuator 可以看到已经开启了 bus-refresh 自动刷新端点。

访问:http://localhost:9091/name 和 http://localhost:9092/name 结果如下:

修改 Git 仓库配置

修改 Git 仓库配置信息如下:

# 自定义配置name: order-service-prod-2.0

自动刷新

刷新页面发现结果并未改变,没事正常。

通过 Post 方式调用**「任意服务端」**的自动刷新端点:http://localhost:8888/actuator/bus-refresh 再次访问结果如下:

查看队列

再来观察一下消息队列的 UI 界面,发现多了一个 springCloudBus 的交换机。

该交换机下绑定了四个队列对应我们的两个 Config Server 和两个 Config Client。

局部刷新

假设有这样一种场景,我们开发了一个新的功能,此时需要对该功能进行测试。我们只希望其中一个微服务的配置被更新,等功能测试完毕,正式部署线上时再更新至整个集群。但是由于所有微服务都受 Spring Cloud Bus 的控制,我们更新了其中一个微服务的配置,就会导致其他服务也被通知去更新配置。这时候局部刷新的作用就体现出来了。

刷新指定服务

修改 Git 仓库配置信息如下:

# 自定义配置name: order-service-prod-3.0

通过 Post 方式调用**「任意服务端」**的自动刷新端点:http://localhost:8888/actuator/bus-refresh/order-service:9091 再次访问结果如下:

9091 端口的客户端已经更新配置。

9092 端口的客户端没有更新配置。

刷新指定集群

假设现在功能测试完毕,需要正式部署线上更新至整个集群。但是由于 Spring Cloud Bus 控制着多个微服务集群(订单微服务、商品微服务等),而我们只想更新指定集群下的配置,这个时候就可以使用 Bus 提供的通配符更新方案。

修改 Git 仓库配置信息如下:

# 自定义配置name: order-service-prod-4.0

通过 Post 方式调用**「任意服务端」的自动刷新端点:http://localhost:8888/actuator/bus-refresh/order-service: 再次访问结果如下:

至此 Bus 消息总线所有的知识点就讲解结束了。

SpringCloud核心组件Bus消息总线 Spring Cloud Bus 作为 Spring Cloud 的核心组件之一,为微服务架构提供了一个轻量级的消息总线实现。它不仅能够实现微服务之间的实时通信,还能够与 Spring Cloud 的其他组件结合,提供更加完整和强大的微服务通信解决方案。通过 Spring Cloud Bus,微服务架构可以变得更加灵活、稳定和可用。注意:上述代码示例仅为教学目的而简化,实际应用中可能需要更复杂的配置和错误处理。 阅读详情

相关推荐

ESP-IDF 利用ESP32构建智能音乐播放器(一)---------- 实现SD卡MP3文件的解码与播放

本文详细介绍了如何利用ESP32和ESP-IDF开发框架,从零开始构建一个智能音乐播放器。文章重点讲解了如何通过SD卡模块读取MP3文件,并集成Helix MP3解码库进行软件解码,最终通过I2S接口驱动音频模块实现播放。内容涵盖硬件连接、软件环境搭建、核心解码与输出逻辑,为嵌入式音频开发提供了完整的实战指南。

weixin_29163797的博客 234

SpringCloud-消息总线BUS

  本文我们来介绍下SpringCloud中消息总线BUS。 一、什么是消息总线bus   SpringCloud Bus集成了市面上常用的消息中间件(rabbit mq,kafka等),连接微服务系统中的所有的节点,当有数据变更的时候,可以通过消息代理广播通知微服务及时变更数据,例如微服务的配置更新。 二、bus解决了什么问题?   解决了微服务数据变更,及时同步的问题。 刷新客户端服务 刷新...

波波烤鸭的博客 8841

Ubuntu22.04下,用Fast-LIVO2+3DGS重建桌面小物件:从点云到高清模型的保姆级避坑实录

本文详细介绍了在Ubuntu22.04环境下,使用Fast-LIVO2与3DGS技术进行桌面小物件三维重建的完整流程。从环境配置、数据采集到点云-图像对齐和3DGS训练,提供了针对小物件优化的参数设置和避坑指南,帮助用户实现媲美商业扫描仪的高清模型重建效果。

weixin_30897233的博客 400

Spring Cloud Bus

Spring Cloud Bus 简介 Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播状态更改(例如配置中心配置更改)或其他管理指令,本文将对其用法进行详细介绍。 我们通常会使用消息代理来构建一个主题,然后把微服务架构中的所有服务都连接到这个主题上去,当我们向该主题发送消息时,所有订阅该主题的服务都会收到消息并进行消费。使用 Spring Cloud Bus 可以方便地构建起这套机制,所以 Spring Cloud Bus 又被称为消息总线。...

半桶水的博客 1万+

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查)

本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。

weixin_29214199的博客 547

手把手教你搞定EMC EFT测试:从电源线到信号线的完整整改实战(附常见失败原因)

本文详细解析了EMC EFT测试中的常见问题及整改措施,从电源线到信号线的完整实战方案。通过四步定位法和成本最优整改策略,帮助工程师有效应对电快速脉冲群干扰,提升产品通过率并降低成本。

weixin_30920597的博客 499

什么是Spring Cloud Bus?

Spring Cloud Bus 提供了一种在分布式系统中进行事件传播和配置更新的机制,帮助微服务之间保持同步和协调。它利用消息中间件实现事件的广播,支持多种消息传递场景。通过与 Spring Cloud Config 和 Spring Cloud Stream 等组件的集成,Spring Cloud Bus 能够有效地提升微服务架构的灵活性和响应能力。

weixin_45990682的博客 1284

【两方演化博弈代码复现】:双方演化博弈的原理、概率博弈仿真、相位图、单个参数灵敏度演化

演化博弈论是研究个体在特定环境中如何通过策略选择与其他个体进行互动的学科。这一理论在生物学、经济学和社会科学等多个领域都有广泛应用。本文将深入探讨双方演化博弈的原理及其过程,并解读一段 MATLAB 代码,展示如何模拟这一过程。

当回首往事的时候,不会因虚度年华而悔恨,也不会因碌碌无为而羞愧。 6202

Java Spring Cloud Bus的作用和用法

Spring Cloud Bus 是Spring Cloud体系中的一个组件,它主要用于在集群环境中传播分布式系统的配置变更,以及提供事件驱动的通信机制。在分布式系统中,当配置信息发生变化时,Spring Cloud Bus 可以迅速将这些变更传播到所有相关的服务实例。:可以用于构建监控和报警系统,当特定的事件发生时,触发报警或执行特定的操作。

编程小弟的博客 689

树莓派4B之OpenCV人脸识别实战:从Haar Cascade到实时检测(保姆级教程)

本教程详细介绍了如何在树莓派4B上部署OpenCV,并利用Haar Cascade算法实现实时人脸识别。内容涵盖从系统环境搭建、算法原理解析到代码逐行讲解与实战调优,为嵌入式AI和计算机视觉初学者提供了一份完整的保姆级实践指南。

p8q9r0的博客 402

FPGA实战:AXI BRAM Controller写时序避坑指南(附Vivado配置步骤)

本文深入探讨了FPGA开发中AXI BRAM Controller的写时序实战要点与常见陷阱。文章聚焦于写地址与写数据通道的握手机制,详细解析了AWREADY、WVALID等关键信号的处理,并提供了Vivado中流水线深度、ECC等关键参数的配置步骤与优化建议,旨在帮助开发者有效规避时序问题,提升系统性能。

weixin_32306683的博客 173

spring cloud bus_一文透析SpringCloud,关于Bus消息总线,总算梳理清楚了

什么是消息总线消息代理中间件构建一个共用的消息主题让所有微服务实例订阅,当该消息主题产生消息时会被所有微服务实例监听和消费。消息代理又是什么?消息代理是一个消息验证、传输、路由的架构模式,主要用来实现接收和分发消息,并根据设定好的消息处理流来转发给正确的应用。它在微服务之间起到通信调度作用,减少了服务之间的依赖。什么是 Spring Cloud BusSpring Cloud Bus 是 Spri...

weixin_39599097的博客 124

YOLOv8【第十二章:数据增强与数据工程篇·第10节】主动学习(Active Learning):如何挑选最有价值的样本进行标注!

🏆 本文收录于 《YOLOv8实战:从入门到深度优化》 专栏。该专栏系统复现并梳理全网各类 YOLOv8 改进与实战案例(当前已覆盖分类 / 检测 / 分割 / 追踪 / 关键点 / OBB 检测等方向),坚持持续更新 + 深度解析,质量分长期稳定在 97 分以上,可视为当前市面上 覆盖较全、更新较快、实战导向极强 的 YOLO 改进系列内容之一。

**My Coding Family** 509

2022最新SpringCloud面试题附完整答案

微服务相关的面试题

波波烤鸭的博客 3511

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Cloud Bus-用法和意义

前言 Spring Cloud Bus用轻量级消息代理连接分布式系统的节点。然后可以使用此代理广播状态更改(如配置更改)或其他管理指令。一个关键的想法是,总线就像一个扩展的Spring引导应用程序的分布式执行器。不过,它也可以用作应用程序之间的通信通道。该项目为AMQP经纪人或Kafka提供启动器作为运输工具。 快速启动 如果Spring Cloud Bus检测到自己在类路径上,那么它通过添加Spring Boot autconfiguration来工作。要启用总线,请将A或B添加到依赖项管理中。其余的工作

ssehs的博客 5407

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

SpringCloud微服务架构开发实战:如何集成BuS?

如何集成 BuS Spring Cloud Bus致力于提供分布式消息总线的功能。目前,Spring Cloud Bus支持使用AMQP协议(如Kafka、Rabbit等)消息代理作为通道。 本节将演示如何集成Spring Cloud Bus。 初始化应用 首先在 micro-weather-config-client、micro-weather-config-server应用的基础上,重新创建一个新的应用micro-weather-config-client-bus 及micro-wea.

m0_63437643的博客 1670

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

SpringCloud:配置中心和消息总线(配置中心终结版)

我们在springcloud(七):配置中心svn示例和refresh中讲到,如果需要客户端获取到最新的配置信息需要执行refresh,我们可以利用webhook的机制每次提交代码发送请求来刷新客户端,当客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了。使用Spring Cloud Bus可以完美解决这一问题。 ## Spring Cloud Bus Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Sp

如果频繁就私信一下呢 254

SpringCloud使用RabbitMQ

方式一:在RabbitMQ页面添加队列方式二:在消费者服务定义增加配置类在消费者服务定义增加配置类方式一、基于@Bean的方式方式二、基于注解方式@RabbitListener上声明,看4.2.2上已声明方式一、基于@Bean的方式方式二、基于注解方式@RabbitListener上声明,看4.3.2上已声明。

qq_22858799的博客 3200

SpringCloud系列:8

学习技术一定要制定一个明确的学习路线,这样才能高效的学习,不必要做无效功,既浪费时间又得不到什么效率,大家不妨按照我这份路线来学习。大家不妨直接在牛客和力扣上多刷题,同时,我也拿了一些面试题跟大家分享,也是从一些大佬那里获得的,大家不妨多刷刷题,为金九银十冲一波!《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!**

Z70czd的博客 968

SpringCloudBus之消息总线

文章目录1. 入门2. Bus 端点2.1 Bus Refresh 端点2.2 Bus Env 端点3. 定位一个实例4. 定位一个服务的所有实例5. 服务ID 必须唯一6. 自定义事件 写在前面 该文参考来自 程序猿DD 的Spring Cloud 微服务实战一书,该文是作为阅读了 spring cloud bus 一章的读书笔记。书中版本比较老,我选择了最新稳定版的 spring cloud...

我与风来 1353

十三 SpringCloud Config分布式配置中心

一、概述 1、分布式服务过程中面临的一些问题? 微服务意味着将单体应用中的业务拆分成一个个子服务,每个服务的粒度较小,因此系统会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。 SpringCloud提供了ConfigServer来解决这个问题,否则我们的每个微服务都带着自己的一个application.yml,上百个配置文件 的管理 o(╥﹏╥)o 2、SpringCloud-config是什么? 中心化的外部配置 ...

白羊座的橙子 308

spring cloud bus AMQP学习笔记

spring cloud bus AMQP 三种jar包 spring-cloud-bus 源包 spring-cloud-starter-bus-amqp 整合了RabbitMQ spring-cloud-starter-bus-kafka 整合了kafka pom.xml 我这里使用的是RabbitMQ做消息队列,所以我使用的是spring-cloud-starter-bus-amqp <!-- https://mvnrepository.com/artifac

qq_43203949的博客 2124

SpringCloud之Bus的基础使用

​ SpringCloud Bus俗称消息总线,是用来把轻量级消息系统与分布式系统的节点连接起来的框架;它整合了java的事件处理机制和消息中间件的功能;可用于广播状态更改(如,配置更改)或其它管理指令,事件推送,也可以当作微服务间的通信通道;目前支持RabbitMQ和Kafka。​ 可以借助消息总线来帮你扩散消息(指令),如SpringCloud Bus配合SpringCloud Config使用可以实现配置的大量动态刷新。

m0_65041486的博客 981

Spring cloud学习笔记10-消息总线Bus

消息总线Bus1. 概述2. 步骤2.1 安装rabbitmq2.2 改造config-client的pom2.3 改造config-client的配置文件2.4 改造config-client的启动类2.5 调用测试 1. 概述 Spring cloud bus通过轻量消息代理连接各个分布的节点。这会用在广播状态的变化(例如配置变化)或者其他的消息指令。Spring bus的一个核心思想是通过分......

代码让AI扣 590

什么是SpringCloud Bus

SpringCloud Bus是将分布式的节点用轻量的消息代理连接起来,用它可以用来广播配置文件的更新和服务的直接通讯,还有用于监控,如果配置文件一更新,只需要发送一次,就可以让客户端重新去读取配置文件 步骤: 1、配置pom; 2、搭建RabbitMQ; ...

qq_44909298的博客 403
上一篇: MySQL大无语事件:一次生产环境的死锁事故,看看我怎么排查
下一篇: 网易CEO重磅推荐,这本书带你了解SQL编程的奥秘,演绎SQL编程之美!
JavaCaiy
博客等级 码龄6年 1万+粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值