SpringCloud入门实战-Spring Cloud Stream消息驱动概述

❤️ 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。项目demo:源码地址
❤️ 作者:一只IT攻城狮。关注我,不迷路。
❤️ 再小的收获x365天都会成就不一样的自己,一起学习,一起进步。

一、Spring Cloud Stream概述

1、Spring Cloud Stream是什么?

Spring Cloud Stream官网:SpringCloud Stream官网

Spring Cloud Stream是构建消息驱动的微服务应用程序的框架。Spring Cloud Stream基于Spring Boot建立独立的生产级Spring应用程序,并使用Spring Integration提供与消息代理的连接。SpringCloud Stream 为一些供应商的消息中间件产品提供了个性化的自动化配置实现,引用了发布-订阅消费组分区的三个核心概念。

2、Spring Cloud Stream可以帮我们解决什么?

当微服务系统越来越复杂,以及调用的系统之间可能采用不同的中间件处理时,都会面临中间件技术切换、维护、开发等等复杂的工作。例如RabbitMQ 和 Kafka 两个消息中间件在架构上不同。例如 RabbitMQ 有 exchange,Kafka 有 Topic 和 Partitions分区,所以二者不能够直接互通。

而Spring Cloud Stream通过定义绑定器 Binder 作为中间层,向应用程序暴露统一的 channel通道实现了应用程序与消息中间件细节之间的隔离。屏蔽了各种MQ的底层差异而达到对MQ的统一管理,让我们不再关注具体的MQ的细节,只需要通过交互SpringCloud Stream,就能操作各种MQ,降低切换、维护、开发工作

小结:Spring Cloud Stream可以帮我们屏蔽底层消息中间件的差异,降低切换维护成本,统一消息的编程模型(声明和绑定频道),另外同Spring Cloud Bus一样Stream目前仅支持RabbitMQ、Kafka。

3、Spring Cloud Stream标准流程

  • Source/Sink:Source 输入消息,Sink 输出消息
  • Channel:通道,是队列 Queue 的一种抽象,在消息通讯系统中就是实现存储和转发的媒介,通过Channel 对队列进行配置;
  • Binder:很方便的 连接中间件,屏蔽 MQ 之间的差异

二、主要概念

Spring Cloud Stream提供了一些简化了消息驱动的微服务应用程序编写的抽象和原语:

  • Spring Cloud Stream的应用模型
  • Binder抽象
  • 持续的发布 - 订阅支持
  • 消费者群体支持
  • 分区支持
  • 一个可插拔的Binder API

1、Spring Cloud Stream的应用模型

一个Spring Cloud Stream应用程序由一个中间件中立的核心组成。该应用程序通过Spring Cloud Stream注入到其中的输入和输出通道与外界进行通信。应用程序通过 inputs 或者 outputs 来与 SpringCloud Stream 中的 binder(绑定器) 对象交互。通过我们配置来 binding(绑定),而SpringCloud Stream 的 binder 对象负责与消息中间件交互。


应用模型各组成应用模型中各组成说明
Middleware中间件,目前只支持 RabbitMQ 和 Kafka
BinderBinder 是应用于消息中间件之间的封装,可以动态的改变消息类型
@Input注解标识输入通道,通过改输入通道接收到的消息进入应用程序
@Output注解标识输出通道,发布的消息通过该通道离开应用程序
@StreamListener监听队列,用于消费者队列的消息接收
@EnableBinding指信道 channel 和 exchange 绑定在一起

2、Binder抽象

Binder 是应用于消息中间件之间的封装,目前实现了 RabbitMQ 和 Kafka 的Binder。

Spring Cloud Stream使用Spring Boot进行配置,Binder抽象使得Spring Cloud Stream应用程序可以灵活地连接到中间件。例如,部署者可以在运行时动态地选择通道连接的目的地(例如,Kafka主题或RabbitMQ交换)。可以通过外部配置属性和Spring Boot(包括应用程序参数,环境变量和application.yml或application.properties文件)支持的任何形式提供此类配置。

Spring Cloud Stream自动检测并使用类路径中找到的binder。您可以使用相同的代码轻松使用不同类型的中间件:在构建时只包含不同的绑定器。对于更复杂的用例,您还可以在应用程序中打包多个绑定器,并在运行时选择绑定器,甚至是否为不同的通道使用不同的绑定器。

3、持续的发布 - 订阅支持

应用之间的通信遵循发布订阅模式,其中通过共享主题广播数据。

发布订阅通信模型降低了生产者和消费者的复杂性,并允许将新应用程序添加到拓扑中,而不会中断现有流。例如,在平均计算应用程序的下游,您可以添加一个计算显示和监视的最高温度值的应用程序。然后,您可以添加另一个解释相同的故障检测平均流程的应用程序。通过共享主题而不是点对点队列进行所有通信可以减少微服务之间的耦合。


4、消费者群体支持(消费者组)

Spring Cloud Stream消费者组与Kafka消费者组相似:
每个消费者绑定可以使用spring.cloud.stream.bindings.<channelName>.group属性来指定组名称。对于下图所示的消费者,此属性将设置为spring.cloud.stream.bindings.<channelName>.group=hdfsWrite或spring.cloud.stream.bindings.<channelName>.group=average。



订阅给定目标的所有组都会收到已发布数据的副本,但每个组中只有一个成员从该目的地接收给定的消息。默认情况下,当未指定组时,Spring Cloud Stream将应用程序分配给与所有其他消费者组发布 - 订阅关系的匿名独立单个成员消费者组。

持久化:符合Spring Cloud Stream的有意义的应用模式,消费者群体订阅是持久的。也就是说,绑定实现确保组预订是持久的,一旦已经创建了一个组的至少一个订阅,即使组中的所有应用程序都被停止,组也将接收消息。

通常,当将应用绑定到给定目的地时,最好始终指定消费者组。在扩展Spring Cloud Stream应用程序时,必须为每个输入绑定指定一个使用者组。这样可以防止应用程序的实例收到重复的消息。

匿名订阅本质上是不耐用的。对于某些binder实现(例如RabbitMQ),可以具有非持久组的订阅。

5、分区支持

Spring Cloud Stream提供对给定应用程序的多个实例之间的分区数据的支持。在分区场景中,物理通信介质(例如,代理主题)被视为被构造成多个分区。一个或多个生产者应用程序实例将数据发送到多个消费者应用程序实例,并确保由共同特征标识的数据由相同的消费者实例处理。

Spring Cloud Stream提供了统一方式实现分区处理用例的通用抽象。因此,无论代理本身是否自然分区(例如Kafka)(例如RabbitMQ),分区可以被使用。

6、编程模型

Spring Cloud Stream提供了许多预定义的注释,用于声明绑定的输入和输出通道,以及如何收听频道。

  • 自定义频道名称
    使用@Input和@Output注释,您可以指定频道的自定义频道名称
  • 预定义接口:
    为了方便寻址最常见的用例,涉及输入通道,输出通道或两者,Spring Cloud Stream提供了开箱即用的三个预定义接口:Source(出站通道),Sink(入站通道)和Processor

简单理解从Stream发布消息就是输出,接受消息就是输入。

最后编辑于:2024-11-12 20:16:46


喜欢的朋友记得点赞、收藏、关注哦!!!

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

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

相关文章

【初级测试常用的sql命令及实例解析】

连接数据库 命令行语句&#xff08;以MySQL为例&#xff09;&#xff1a;mysql -u username -p。其中-u表示指定用户名&#xff0c;-p表示需要输入密码。解析&#xff1a;这是登录MySQL数据库服务器的基本命令。执行后&#xff0c;系统会提示输入密码&#xff0c;正确输入密码后…

Flink 安装与入门:开启流式计算新时代

在当今大数据蓬勃发展的时代&#xff0c;数据处理的时效性愈发关键。传统基于先存储再批量处理的数据方式&#xff0c;在面对诸如网站实时监控、异常日志即时分析等场景时&#xff0c;显得力不从心。随着 5G、物联网等技术的兴起&#xff0c;海量数据如潮水般涌来&#xff0c;且…

【科研绘图】Matplotlib 中文字符乱码(debug)

在使用 Matplotlib 绘图时&#xff0c;如果图中包含中文字符&#xff0c;可能会遇到中文无法正常显示的问题。这通常是因为默认的字体不支持中文。为了解决这个问题&#xff0c;你可以通过以下几种方法来设置 Matplotlib 使用支持中文的字体。 1. 设置 Matplotlib 使用支持中文…

如何在CodeIgniter中添加或加载模型

在CodeIgniter框架中&#xff0c;模型&#xff08;Model&#xff09;是用于与数据库进行交互的重要组件。模型通常包含数据库查询、业务逻辑以及与数据库表相关的函数。以下是如何在CodeIgniter中添加或加载模型的步骤&#xff1a; 1. 创建模型文件 首先&#xff0c;你需要在…

神经网络归一化方法总结

在深度学习中&#xff0c;归一化 是提高训练效率和稳定性的关键技术。以下是几种常见的神经网络归一化方法的总结&#xff0c;包括其核心思想、适用场景及优缺点。 四种归一化 特性Batch NormalizationGroup NormalizationLayer NormalizationInstance Normalization计算维度…

设计理念与数据反馈:面向火星熔岩管探索的跳跃机器人

随着人类对火星探索的深入&#xff0c;熔岩管作为潜在资源和居住地的科学价值受到广泛关注。然而&#xff0c;这些复杂且规模宏大的地下空间&#xff0c;对传统探测技术提出了严峻挑战。因此&#xff0c;本文介绍了一款专为火星熔岩管探索设计的跳跃机器人&#xff0c;其核心设…

MTK 展锐 高通 sensorhub架构

一、MTK平台 MTK框架可以分为两部分&#xff0c;AP和SCP。 AP是主芯片&#xff0c;SCP是协处理器&#xff0c;他们一起工作来处理sensor数据。 SCP 是用来处理sensor和audio相关功能和其他客制化需求的一个协处理理器&#xff0c;MTK SCP选择freeRTOS作为操作系统&#xff0c…

解决JWT解析CDN不稳定问题

最近在项目开发中&#xff0c;我遇到了一个令人头疼的问题&#xff1a;JWT解析所依赖的CDN源不稳定。这导致应用在某些情况下无法正常运行&#xff0c;严重影响了用户体验。经过一番探索和尝试&#xff0c;我最终通过手写解析函数的方式解决了这个问题。本文将分享我的解决过程…

SD NAND 的 SDIO在STM32上的应用详解

四.SDIO功能框图(重点) SDIO包含2个部分&#xff1a; ● SDIO适配器模块&#xff1a;实现所有MMC/SD/SD I/O卡的相关功能&#xff0c;如时钟的产生、命令和数据的传送。 ● AHB总线接口&#xff1a;操作SDIO适配器模块中的寄存器(由STM32控制SDIO外设)&#xff0c;并产生中断和…

深入解析:用Scala验证身份证号码的合法性

引言 身份证号码&#xff0c;这个由18位数字组成的唯一标识&#xff0c;不仅包含了个人的出生年月日&#xff0c;还隐藏着性别信息&#xff0c;并且通过特定的算法来确保其唯一性和正确性。今天&#xff0c;我们将通过Scala编程语言&#xff0c;一步步揭开身份证号码的神秘面纱…

C语言数据结构学习:循环队列

C语言 数据结构学习 汇总入口&#xff1a; C语言数据结构学习&#xff1a;[汇总] 1. 循环队列 队列的博客&#xff1a;C语言数据结构学习&#xff1a;队列 循环队列会预先定义最大队列空间&#xff0c;然后定义一个数组&#xff0c;通过队列头和队列尾指针分别指向开头和结尾&…

leetcode-18-四数之和

题解&#xff1a; 代码&#xff1a;

go 结构体方法

在 Go 语言中&#xff0c;结构体方法是指附加到结构体类型上的函数。这些方法可以通过结构体的实例来调用。方法的接收者&#xff08;receiver&#xff09;指定了该方法属于哪个结构体类型。接收者可以是一个值类型或指针类型。 定义结构体方法 下面是如何为一个结构体定义方…

MySQL45讲 第29讲 如何判断一个数据库是不是出问题了?——阅读总结

文章目录 MySQL45讲 第二十九讲 如何判断一个数据库是不是出问题了&#xff1f;——阅读总结一、检测数据库实例健康状态的重要性二、常见检测方法及问题分析&#xff08;一&#xff09;select 1 判断法&#xff08;二&#xff09;查表判断法&#xff08;三&#xff09;更新判断…

探索Python的HTTP之旅:揭秘Requests库的神秘面纱

文章目录 **探索Python的HTTP之旅&#xff1a;揭秘Requests库的神秘面纱**第一部分&#xff1a;背景介绍第二部分&#xff1a;Requests库是什么&#xff1f;第三部分&#xff1a;如何安装Requests库&#xff1f;第四部分&#xff1a;Requests库的五个简单函数使用方法第五部分&…

指针的奥秘:深入探索内存的秘密

前言 在计算机编程的广阔天地中&#xff0c;指针作为一种独特的数据类型&#xff0c;它不仅是C语言的核心&#xff0c;也是理解计算机内存管理的基石。指针的概念虽然强大&#xff0c;但对于初学者来说&#xff0c;它常常是学习过程中的一个难点。本文旨在揭开指针的神秘面纱&a…

ffmpeg.wasm 在浏览器运行ffmpeg操作视频

利用ffmpeg.wasm&#xff0c;可以在浏览器里运行ffmpeg,实现对音视频的操作 参考链接&#xff1a; https://blog.csdn.net/jchsgwbr/article/details/143252044 https://gitee.com/CXBalCai/ffmpeg-template 其他参考 https://github.com/ffmpegwasm/ffmpeg.wasm https://b…

理解clickhouse 里的分区和分片键区别

文章目录 分片分区两分片&#xff0c;0副本的cluster 分片 CREATE TABLE logs_distributed AS logs_local ENGINE Distributed(cluster_name, -- 集群名称database_name, -- 数据库名称logs_local, -- 本地表名cityHash64(user_id) -- 分片键&#xf…

试玩hudi docke demo

官网链接&#xff1a; https://hudi.apache.org/docs/docker_demo 编译时要添加-Dscala-2.12 -Dspark3.5 两个参数&#xff0c;不然会报错一些包找不到 /root/study/programs/apache-maven-3.9.9/bin/mvn package -Pintegration-tests -DskipTests -Dscala-2.12 -Dspark3.5 d…

shell脚本(二)

声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷羽sec团队无关&#…