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

news2025/1/10 12:03:52

SpringCloud Bus概述

概述

Spring Cloud Bus是Spring Cloud生态系统中的一个组件,用于实现微服务架构中的消息总线。它利用了轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件,实现了在分布式系统中的消息传递和事件广播。

Spring Cloud Bus旨在简化微服务架构中的配置管理和状态同步。它允许将配置更改或状态更新广播到整个分布式系统中的各个微服务实例。通过使用消息总线,微服务可以轻松地获取最新的配置信息,并且能够了解其他微服务的状态变化。

作用

  • 配置的集中管理: Spring Cloud Bus与Spring Cloud Config(配置中心)集成,可以实现集中式的配置管理。当配置发生变化时,只需更新配置中心的配置,Spring Cloud Bus会将新的配置信息广播给所有订阅了消息总线的微服务。

  • 快速的配置更新: 通过使用消息总线,配置的更新可以迅速传播到整个分布式系统中的所有微服务实例,而无需每个微服务都主动去拉取配置。这样可以减少配置更新的延迟,提高系统的响应速度。

  • 系统状态的同步: Spring Cloud Bus不仅可以用于配置的更新,还可以用于系统状态的同步。当一个微服务的状态发生变化时,它可以通过消息总线广播给其他微服务,从而实现微服务之间的状态同步。

  • 可扩展的消息传递: Spring Cloud Bus提供了灵活的扩展机制,可以与其他Spring Cloud组件无缝集成。例如,可以与Spring Cloud Stream(消息驱动的微服务)集成,实现更高级的消息传递模式。

在这里插入图片描述

基本原理

Spring Cloud Bus的原理是基于消息代理和事件广播机制。

  • 消息代理: Spring Cloud Bus使用轻量级消息代理(如RabbitMQ或Kafka)作为通信中间件。消息代理负责接收和分发消息,并确保消息的可靠传递。微服务通过连接到消息代理,可以发送和接收消息。

  • 事件广播: 当一个微服务的配置发生变化或状态发生改变时,它会将这些变化作为消息发送到消息代理。消息代理将这些消息广播给所有订阅了消息总线的微服务。这样,其他微服务就能够接收到这些变化,并及时做出相应的响应。

安装RabbitMQ

  • *安装Erlang
    下载地址:http://erlang.org/download/otp_win64_21.3.exe,下载完成后点击安装即可。
  • 安装RabbitMQ
    下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.7.14/rabbitmq-server-3.7.14.exe​​​​​,下载完成后点击安装。

安装RabbitMQ后进入sbin目录下
在这里插入图片描述
执行命令rabbitmq-plugins enable rabbitmq_management
启动mq,如下图就启动成功
在这里插入图片描述
访问地址http://localhost:15672/ 如下图
在这里插入图片描述
账号密码都为,guest
在这里插入图片描述

Demo配置

新建模块cloud-config-client-3366

在这里插入图片描述

pom.xml

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

bootstrap.yml

server:
  port: 3366

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

#服务注册到eureka地址
eureka:
  instance:
    # 配置eureka的状态显示
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka

启动类

@EnableEurekaClient
@SpringBootApplication
public class ConfigClientMain3366 {

    public static void main(String[] args) {
        SpringApplication.run(ConfigClientMain3366.class, args);
    }

}

controller

@RestController
@RefreshScope //Spring Cloud 提供的用于动态刷新配置的注解,会在调用 /actuator/refresh 接口时重新加载配置并更新 configInfo 的值。
public class ConfigClientController {

    @Value("${spring.cloud.config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo() {
        return configInfo;
    }
}

配置中心3344添加消息总线支持

pom.xml

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

bootstrap.yml

##rabbitmq相关配置,暴露bus刷新配置的端点
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

客户端3355,3366添加消息总线支持

pom.xml

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

bootstrap.yml修改后

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址
  #rabbitmq相关配置 15672是Web管理界面的端口;5672是MQ访问的端口
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

# 暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"

#服务注册到eureka地址
eureka:
  instance:
    # 配置eureka的状态显示
    hostname: localhost
    instance-id: ${eureka.instance.hostname}:${spring.application.name}:${server.port}
  client: #服务提供者provider注册进eureka服务列表内
    service-url:
      register-with-eureka: true
      fetch-registry: true
      defaultZone: http://eureka7001.com:7001/eureka

测试

修改gitee上的配置,config info version由2改为3提交

在这里插入图片描述

发送POST请求来触发刷新

http://localhost:3344/actuator/bus-refresh

在这里插入图片描述

查看客户端结果

3355和3366均已成功更新
在这里插入图片描述
在这里插入图片描述

动态刷新定点通知

不想全部通知,只想定点通知:只通知3355,不通知3366

简单一句话:指定具体某一个实例生效而不是全部

公式:http://localhost:配置中心的端口号/actuator/bus-refresh/{destination}

案例:

我们这里以刷新运行在3355端口上的config-client为例:只通知3355,不通知3366

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/999545.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

FOXBORO FBM230 P0926GU通讯卡

通信接口&#xff1a;FBM230 P0926GU 通讯卡通常支持多种通信接口&#xff0c;如以太网、Modbus、Profibus、DeviceNet 等&#xff0c;以便与其他设备和控制系统进行数据通信和集成。 数据传输&#xff1a;它们用于在自动化系统中传输数据&#xff0c;包括监测和控制数据、传感…

网安周报|Chaes恶意软件的新Python变种针对银行和物流行业

1、Chaes恶意软件的新Python变种针对银行和物流行业 银行和物流业正受到名为Chaes的恶意软件的重新设计变种的冲击。Chaes于2020年首次出现&#xff0c;它的目标是拉丁美洲&#xff08;尤其是巴西&#xff09;的电子商务客户&#xff0c;以窃取敏感的财务信息。该恶意软件的最新…

Xcode 真机调试之Unable to install “xxx“,Code: -402653103

背景 Xcode14.0&#xff0c;使用Cocoapods引入三方库后编译成功运行项目报无法安装 Details DetailsUnable to install "HHTestGenerate" Domain: com.apple.dt.MobileDeviceErrorDomain Code: -402653103 User Info: {DVTErrorCreationDateKey "2023-09-11 0…

Pytorch框架详解

文章目录 引言1. 安装与配置1.1 如何安装PyTorch1.2 验证安装 2. 基础概念2.1 张量&#xff08;Tensors&#xff09;2.1.1 张量的基本特性2.1.2 创建张量2.1.3 张量操作 2.2 自动微分&#xff08;Autograd&#xff09;2.2.1 基本使用2.2.2 计算梯度2.2.3 停止追踪历史2.2.4 自定…

uniapp h5 微信缓存,解决版本更新还是旧版本

文章目录 一、微信缓存是什么&#xff1f;二、如何解决1.打包入口文件解决2.给请求url加时间戳3.给打包的js文件添加时间戳并修改打包后的css文件夹 总结 一、微信缓存是什么&#xff1f; 微信缓存是指微信客户端为了提高用户的使用体验&#xff0c;会在用户使用微信过程中将一…

张量的连续性、contiguous函数

在pytorch中&#xff0c;tensor的实际数据以一维数组&#xff08;storage&#xff09;的形式存储于某个连续的内存中&#xff0c;以“行优先”进行存储。 tensor的连续性 tensor连续&#xff08;contiguous&#xff09;是指tensor的storage元素排列顺序与其按行优先时的元素排…

非科班菜鸡算法学习记录 | 代码随想录算法训练营完结!

这俩月终于结束了233333&#xff0c;之后就是反复复习和背八股了吧&#xff0c;然后整整项目春招再投投投&#xff0c;感觉大部分题都有思路了但是做过的题也会没思路&#xff0c;还是要复习 总结 数组&#xff1a; 双指针用的很多&#xff0c;一般一个指向遍历位置&#xff0…

解决微信开发者工具企业微信小程序模式下模拟器白屏问题

前一天晚上没有关电脑&#xff0c;第二天发现电脑自己重启了&#xff0c;然后微信开发者工具就出了问题&#xff0c;在企业微信小程序模式下&#xff0c;模拟器出现了白屏&#xff0c;只有上方title可以正常显示。点击模拟器右上角三个点都不出弹出菜单&#xff0c;并且在调试器…

VPS使用环境受限?亚马逊云科技Amazon Lightsail为开发者提供更多选择

对于开发者而言&#xff0c;当你想构建系统架构时&#xff0c;你的面前就出现了两种选择&#xff0c;选择一是花时间去亲手挑选每个亚马逊云科技组件&#xff08;云服务器、存储、IP地址等&#xff09;&#xff0c;然后自己组装起来&#xff1b;选择二是只需要一个预先配置且预…

NFTScan | 09.04~09.10 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.09.04~ 2023.09.10 NFT 热点资讯 01/ 数据&#xff1a;Blend 交易总额突破 20 亿美元&#xff0c;较六月底增长一倍 9 月 4 日&#xff0c;据数据显示&#xff0c;Blur 旗下 NFT 借…

Aztec的隐私抽象:在尊重EVM合约开发习惯的情况下实现智能合约隐私

1. 引言 Aztec的架构&#xff0c;不同于当前“通过EVM兼容执行环境”所实现的区块链水平扩容趋势。Aztec内部笑称其构建的为首个非zkEVM协议。 Aztec专注于实现&#xff1a; 成为理解和需要智能合约隐私的开发者的终极解决方案。 Aztec为开发者提供构建隐私优先app所需的网…

问道管理:怎么样才能看懂k线图?

跟着出资者越来越注重股票、期货等出资工具&#xff0c;k线图也被越来越多的人所重视。K线图是通过将商场的开盘价、最高价、最低价以及收盘价等信息绘制在同一张图上&#xff0c;然后协助出资者愈加直观和深入的了解商场状况&#xff0c;并进行出资决策。但关于一些新手来说&a…

618-基于FMC+的XCVU3P高性能 PCIe 载板 设计原理图

基于FMC的XCVU3P高性能 PCIe 载板 一、板卡概述 板卡主控芯片采用Xilinx UltraScale16 nm VU3P芯片&#xff08;XCVU3P-2FFVC1517I&#xff09;。板载 2 组 64bit 的DDR4 SDRAM&#xff0c;支持 IOX16或者 JTAG 口&#xff0c;支持PCIe X 16 ReV3.0以及 FMC 扩展接口。…

数据库数据恢复-Oracle数据库truncate的数据恢复案例

Oracle数据库故障&分析&#xff1a; 北京某单位Oracle 11g R2数据库误执行truncate table CM_CHECK_ITEM_HIS&#xff0c;表数据丢失&#xff0c;查询该表时报错。数据库备份无法使用&#xff0c;表数据无法查询。 Oracle数据库Truncate数据的机理&#xff1a;执行Trunca…

C++零碎记录(九)

15. 继承 15.1 继承简洁 ① 继承是面向对象的三大特性之一。 ② 定义类时&#xff0c;下级别的成员除了拥有上一级的共性&#xff0c;还有自己的特性。这个时候&#xff0c;就可以考虑利用继承技术&#xff0c;减少重复代码。 15.2 普通实现 #include <iostream> usi…

windows启动自动运行应用

运行winR命令输入 shell:startup回车&#xff0c;进入下面文件夹 将所要开机就运行的应用程序放入问价夹中间重新启动就可以了 按 windows键&#xff0c; 搜索startup&#xff0c;可以对所有程序是否需要开机运行进行设置

蓝桥杯打卡Day6

文章目录 N的阶乘基本算术整数查询 一、N的阶乘OI链接 本题思路&#xff1a;本题是关于高精度的模板题。 #pragma GCC optimize(3) #include <bits/stdc.h>constexpr int N1010;std::vector<int> a; std::vector<int> f[N];std::vector<int> mul(in…

集合框架1

目录 一、认识集合 二、Collection接口 三、Iterable接口 四、Queue接口 4.1Queue接口概述 4.2 Deque接口 五、List接口 5.1 使用ArrayList类动态存储数据 5.1.1 ArrayList定义类有两个私有属性 5.1.2 构造方法 5.1.3 操作数据 5.2 使用LinkedList类动态存储数据 …

props验证指的是什么?Vue组件的props验证

props验证指的是在封装组件时对外界传递过来的props 数据进行合法性的校验&#xff0c;从而防止数据不合法的问题。但使用数组类型的props节点有一个缺点&#xff0c;既无法为每个prop指定具体的数据类型。 1.对象类型的props节点 使用对象类型的props 节点&#xff0c;可以对每…

HCIE-HCS规划设计搭建

以实验环境为例&#xff1a;共计6台服务器2288H V5&#xff0c;1台存储 OceanStor 5110 V5&#xff0c;2台万兆48口交换机&#xff0c;1台千兆24口交换机。 Controller&#xff1a;3台控制节点&#xff0c;2颗cpu&#xff0c;每颗cpu24核心/48线程&#xff0c;每台内存1TB&…