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

2023-10-29

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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Cloud学习笔记【消息总线-SpringCloud Bus】 的相关文章

随机推荐

  • 微信小程序设置背景图铺满顶部

    由于微信小程序自带顶部导航栏 导致我们设置背景图时总是无法铺满顶部 其实想要铺满顶部只需要改变一个属性即可 将navigationStyle的默认属性修改为custom 在微信小程序需要设置背景图的文件下的 json文件中设置
  • VxWorks的环境配置

    转载请标记出处 http blog csdn net zgh1988 article details 7994538 1 准备工作 1 VMWare 2 一台安装Windows XP或Window 7系统的PC机 3 Tornado 2 2
  • 进阶训练技巧提升模型性能

    在深度学习的世界中 训练技巧的重要性不言而喻 进阶训练技巧 包括损失函数 学习率 模型微调和半精度训练 更是对提升模型性能和准确率有着关键作用 下面我们将对这些技巧进行详细的探讨 一 损失函数 Loss Function 损失函数 或者叫作
  • 遍历map

    keySet是键的集合 Set里面的类型即key的类型 entrySet是 键 值 对的集合 Set里面的类型是Map Entry 1 keySet Map map new HashMap Iterator it map keySet it
  • 代码审计之JAVA代码审计洞态IAST系统以及SecExample靶场

    目录 2 JAVA系列代码审计 2 1 工具介绍 2 2 SecExample靶场安装 2 3 洞态IAST安装 2 3 洞态IAST使用 2 JAVA系列代码审计 之前我们都是采用代码审计工具对PHP代码进行审计 但是在实际的工作中对于从
  • unipush2.0教程

    解释一下名词 透传消息 无论手机app 是否在运行 打开了 还是清了后台 关闭 都可以收到消息 通知消息 只能app打开了 才能收到 1 开通unipush 2 点击上图的unipush2 0下面的配置 进入以下页面 选择平台 将其余项配置
  • tidb存储基本原理

    tidb是什么 tidb是分布式关系型数据库 需要从两个方面来理解tidb 分布式数据库 关系型数据库 什么是分布式系统 集中式系统 计算和存储在同一个节点上 分布式系统 计算和存储位于不同的节点上 分布式系统把需要进行大量计算的工程数据分
  • Unity3D持久化存储(一) PlayerPrefabs

    文章目录 PlayerPrefabs介绍 常用方法 存储数据 读取数据 查看数据 删除数据 PlayerPrefabs介绍 PlayerPrefabs是Unity内置的持久化存储类 可存储Float Int和String类型的数据 数据存储
  • AJAX传中文参数乱码问题解决

    当利用XMLHttpRequest提交中文数据到服务器端时候 ajax默认编码为utf8 提交中文会发生乱码 为了解决这个问题 baidu了一天 研究了一天 现在把这些心得写下来 以备忘 我这人健忘 首先明确一点 要想彻底没有乱码的烦恼 那
  • [论文阅读]《Database Maanagement Systems》-第三章

    第三章 THE RELATIONAL MODEL 关系模型 P75 P112 synopsis 概要 大纲 supplanted 代替 排挤掉 by far 到目前为止 Prototype relational database 原型关系数
  • Jetpack学习之Navigation

    Jetpack提供了一个名为Navigation的组件 用来管理页面 Actvity和Fragment 以Fragment为主 和App bar Navigation的优势 可视化的页面导航图 便于理清页面间的关系 通过destinatio
  • Java基础:Java的优点和缺点

    优点 1 跨平台 可移植性 是Java的核心优势之一 Java的运行是通过JVM来实现的 只需要在操作系统上安装对应的虚找机即可运行 节省代码重复编写时间 2 面向对象 Java是完全的面向对象语言 非常适合大型软件的设计和开发 3 简单性
  • 使用Vue调用后台接口

    最近在学习使用vue 看完调接口之后 立马使用springboot作为后台 跃跃欲试 很尴尬 刚刚写完一个后台 vue调用就出错了 1 跨域的问题 我还以为是需要的接口和我的接口不一致 后来知道并不是端口问题 解决办法 前台vue的调用地址
  • 利用script标签实现的跨域名AJAX请求(ExtJS)

    在AJAX应用环境中 由于安全的原因 浏览器不允许XMLHttpRequest组件请求跨域资源 在很多情况下 这个限制给我来带来的诸多不便 很多同行 研究了各种各样的解决方案 1 通过修改document domain和隐藏的IFrame来
  • Java中常见的异常总结,Exception如何捕获和处理

    什么是异常 异常机制 异常机制是指当程序出现错误后 程序如何处理 具体来说 异常机制提供了程序退出的安全通道 当出现错误后 程序执行的流程发生改变 程序的控制权转移到异常处理器 通俗一点来说 就是为了让程序不被中断 继续执行 程序错误 1
  • 13-2_Qt 5.9 C++开发指南_线程同步_QMutex+QMutexLocker(目前较为常用)

    文章目录 1 线程同步的概念 2 基于互斥量的线程同步 3 QMutex实现线程同步源代码 3 1 qdicethread h 3 2 qdicethread cpp 3 3 dialog h 3 4 dialog cpp 4 QMutex
  • AI资讯--2017年资讯汇总

    九个研究方向 持续学习 Continual learning 可解读的决策 Explainable decisions 安全飞地 Secure enclaves 对抗学习 Adversarial learning 在保密数据上共享学习 Sh
  • Beanutils.copyProperties

    BeanUtils提供对Java反射和自省API的包装 其主要目的是利用反射机制对JavaBean的属性进行处理 使用效果 使用前 UserInfo userInfo UserInfo form User user new User use
  • 搭建菜谱应用微信小程序-前后端

    搭建菜谱应用微信小程序 前后端 框架简析 后端使用TP6框架 mysql 前端使用uni app 代码 框架简析 后端使用TP6框架 mysql 使用了这个项目来修改精简 https gitee com jameson512 novelap
  • Spring Cloud学习笔记【消息总线-SpringCloud Bus】

    SpringCloud Bus概述 概述 Spring Cloud Bus是Spring Cloud生态系统中的一个组件 用于实现微服务架构中的消息总线 它利用了轻量级消息代理 如RabbitMQ或Kafka 作为通信中间件 实现了在分布式