Spring Cloud Stream绑定器架构解析与开发

news2025/7/21 21:54:35

Spring Cloud Stream绑定器架构解析与开发

在这里插入图片描述
根据不同的使用场景我们通常会选择相适应的消息中间件,例如对于日志收集场景可能会选择使用Kafka,对于订单场景通常会选择RocketMQ,不同消息中间件的客户端是不同的,我们需要针对不同消息中间件写不同的代码。对于TOC的产品,我们可以根据业务场景选择适当的消息中间件,但对于TOB的产品,不同客户对于消息中间件需求是不同的,我们需要方便的切换消息中间件,并且不需要重构代码

Spring Cloud Stream能很好的帮我们解决上面的问题。通过Binder解藕具体消息中间件,屏蔽不同消息中间件使用的差异,基于Binder Spring Cloud Stream提供统一的配置及使用方式,用于发送消息、消费消息。对于使用方而言,只需要了解如何使用Spring Cloud Stream发送、接收消息无需关心使用那种消息中间件。Binder则需要负责不通消息中间件如何去发送、接收消息及其它的高级特性,例如事务等。因此我们可以看到针对不通消息中间件的Binder,例如spring-cloud-stream-binder-kafka、spring-cloud-stream-binder-rabbit等,我们自己也可以根据规范开发符合自己需求的Binder,例如对于消息量不大的用户,可以使用基于redis的消息中间件,我们可以开发一个对应的Binder,对接到Spring Cloud Stream。下面我将介绍Binder的架构及如何开发一个Binder

Binder架构介绍及源码解析

在这里插入图片描述
从源码角度,我们来看Spring Cloud Stream是如何与Binder交互,Binder具体又干了什么事情

项目启动

项目启动会先去扫描项目下所有依赖的绑定器,并将绑定器信息存储到内存对象中,具体而言做了如下事情:

  • 扫描META-INF/spring.binders,获取绑定器类型及对应配置加载类,用于创建BinderTypeRegistry对象
    在这里插入图片描述

  • 根据BinderTypeRegistry构建BinderFactory。BinderFactory既包含绑定器的信息,也包含扫描yaml文件下配置的spring cloud steam相关的配置信息
    在这里插入图片描述

发送消息

项目启动之后,准备工作已经完成,我们下面从发送消息流程来看,Spring Cloud Stream如果与Binder协作,完成消息发送

BinderFactory获取绑定器实例

启动项目时,我们将绑定器的信息都放到了BinderFactory中,因此发送消息的第一步就是要根据绑定器的信息,创建绑定器实例,完成绑定器的初始工作

加载绑定器配置类

Spring Cloud Stream通过DefaultBinderFactory的initializeBinderContextSimple方法,加载绑定器对应的配置类,并创建AnnotationConfigApplicationContext
上下文对象
在这里插入图片描述
加载绑定器对应配置类之后将触发绑定器的初始化

  • 初始化Binder配置类、初始化Binding配置类
    在这里插入图片描述
  • 初始化绑定器目标提供者
    在这里插入图片描述
  • 初始化通道绑定器
    在这里插入图片描述
获取绑定器实例

通过上步创建的上下文对象即可获取绑定器实例,将获取的绑定器实例缓存在内存中
在这里插入图片描述

使用绑定器将输出通道与具体消息中间件绑定

输出通道是Spring Cloud Stream的概念,我们需要将输出通道关联到具体的发送消息客户端,而绑定器实例有构造发送消息客户端的方法。因此这一步需要创建具体的发送消息客户端,并将其关联到输出通道,具体情况如下:

  • 获取扩展生产者配置信息并与Spring Cloud Stream 生产者属性合并
    在这里插入图片描述
    在这里插入图片描述
  • 获取生产者发送目标提供者
    在这里插入图片描述
    在这里插入图片描述
  • 创建发送消息实例,并完成发送消息对象初始化
    在这里插入图片描述
    在这里插入图片描述
  • 将输出通道与发送消息实例绑定
    在这里插入图片描述
  • 创建binding并缓存到发送通道,用于之后解除绑定等操作
    在这里插入图片描述
    在这里插入图片描述

通过发送通道发送消息

完成发送通道与具体发送客户端绑定之后就可以发送消息,在下面方法中将使用具体消息中间件的客户端完成消息发送
在这里插入图片描述

总结

通过上述源码解析,我们可以清楚的看到,Spring Cloud Stream为用户提供了统一的发送消息、消费消息、及配置参数的管理。但在具体执行发送、消费时,则是由绑定器创建的生产者实例、消费者实例完成的。这些由绑定器创建生产者实例、消费者实例是与具体消息中间件关联的,因此不通的消息中间件会对应不同的绑定器。绑定器作为了Spring Cloud Steam与具体消息中间件的桥梁

开发实例

下面将具体说明我们怎样去写一个自己的绑定器

创建spring.binders

创建resources/META-INF/spring.binders,指名绑定器类型及对应的配置类
在这里插入图片描述

创建配置类

配置类需要扫描我们扩展的属性类,包括绑定器的配置参数类、Binding的配置参数类,注册目标提供者对象、消息通道绑定器对象
在这里插入图片描述

绑定器参数类

绑定器参数类用于存放与具体消息中间件连接相关的信息,例如地址、用户名、密码、端口等信息
在这里插入图片描述

Binding扩展属性配置类

这里包括生产者配置属性及消费者配置属性。对于发送、消费时需要的特殊参数可以放到这里,例如使用redis作为消息中间件,我们需要指定发送、消费的
DB是多少,因此需要将此参数放到生产、消费配置类中

  • 创建RedisMQExtendedBindingProperties并继承AbstractExtendedBindingProperties指定消费属性类、发送消息属性类、Binding属性类
    在这里插入图片描述

  • 创建RedisMQConsumerProperties消费消息配置类
    在这里插入图片描述

  • 创建RedisMQProducerProperties发送消息配置类

  • 创建RedisMQBindingProperties配置类,需要实现BinderSpecificPropertiesProvider。其中的属性既是消费消息属性类及发送消息属性类
    在这里插入图片描述

提供者

参数处理完成后,我们需要创建一个提供者。提供者记录了我们需要发送或消费消息的topic,以及分区。提供者需要实现ProvisioningProvider
在这里插入图片描述

消息通道绑定器

消息通道绑定器需要提供创建发送消息实例、消费消息实例、获取扩展生产者属性类、扩展消费者属性类及Binding属性类的Class。继承AbstractMessageChannelBinder实现ExtendedPropertiesBinder
在这里插入图片描述

具体生产者实现

具体生产者实现类,会完成具体的消息连接初始化工作、具体的发送消息等操作。需要继承AbstractMessageHandler,实现Lifecycle
在这里插入图片描述

具体消费者实现

完成具体消息消费、停止消息消费,需要继承MessageProducerSupport
在这里插入图片描述

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

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

相关文章

智慧城市面临的机遇与挑战

区域中心城市建设需要智慧城市支撑 建设区域中心城市,除了需要具备在公路、铁路、航空等区域中心城市的枢纽硬件设施外,更需要充分发挥信息化强有力的凝聚和辐射作用,提升区域中心城市在区域交通枢纽服务、区域金融商贸服务、区域物流集散服务…

百趣代谢组学文献分享:茶褐素可促进胆固醇降解

​ 为了解决大家每逢过节必长胖的历史性问题,小编今天给大家介绍一篇发表于Nature Communications 的针对于普洱茶促进减肥的研究。 百趣代谢组学文献分享,所谓药食同源,普洱茶是我国西南云南地区特有的一种传统名茶,因其具有治…

[激光原理与应用-18]:《激光原理与技术》-4- 粒子数反转与“光”强放大的基本原理

目录 一、热平衡&#xff1a; 受激辐射 < 受激接收 二、 “光”相干放大 三、粒子数反转&#xff08;population inversion&#xff09; 四、实现粒子数反转的装置&#xff1a;泵浦 五、实现粒子数反转的条件 六、实现粒子数反转的工作物质 七、实现粒子数反转的方式…

【菜菜的sklearn课堂笔记】逻辑回归与评分卡-用逻辑回归制作评分卡-重复值和缺失值处理

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 在银行借贷场景中&#xff0c;评分卡是一种以分数形式来衡量一个客户的信用风险大小的手段&#xff0c;它衡量向别人借钱的人&#xff08;受信人&…

「Vue系列」欢迎传送到“Teleport”星球

前言 大家好&#xff0c;我是落叶小小少年&#xff0c;我一直谨记学习不断&#xff0c;分享不停&#xff0c;输入的最好方式是输出&#xff0c;我始终相信 用最核心代码更容易理解深的技术点用通俗易懂的话&#xff0c;讲难的知识点 之前有学习并写了KeepAlive组件的实现原理…

Nginx 报错问题汇总(持续更新ing)

目录 一、nginx: [emerg] invalid number of arguments in "include" directive in C:\Program Files\nginx-1.15.4/conf/nginx.conf:61 总结&#xff1a; 二、nginx: [error] OpenEvent("Global\ngx_reload_2152") failed (5: Access is denied) 解决方…

《Java》图书管理系统(已升级)

目录 前言 效果展示 功能模块 书架 定义书的类 创建书架 用户 User用户类 AdminUser管理员 NormalUser普通用户 功能 接口 FindOperation 查找图书 AddOperation添加图书 DelOperation删除图书 BorrowOperation借阅图书 DisOperation 打印图书 RetOperation归还图…

Spring Boot 3.0.0 GA版本正式发布,期待已久的SpringBoot3发布了

期待已久的SpringBoot3.0.0发布了发布说明新版本的亮点分析1. Java 17 baseline 和 Java 19 支持2. 支持 [GraalVM native images](https://docs.spring.io/spring-boot/docs/3.0.0/reference/html/native-image.html#native-image)&#xff0c;取代实验性的 Spring Native 项目…

linux篇【11】:linux下的线程<中序>

目录 一.线程互斥 1.三个概念 2.互斥 &#xff08;1&#xff09;在执行语句的任何地方&#xff0c;线程可能被切换走 &#xff08;3&#xff09;抢票场景中的问题 &#xff08;4&#xff09;解决方案 3.加锁 &#xff08;1&#xff09;加锁介绍 &#xff08;2&#xf…

STC 51单片机39——汇编语言 按钮流水灯

每按一下按钮&#xff0c;灯就移动一个 ORG 0000H LJMP MAIN ORG 0003H ;中断矢量 LJMP INT MAIN:SETB EA ;开总中断允许“开关” SETB EX0 ;开分中断允许“开关” SETB PX0 ;高优先级 SETB IT0 ;边沿触发 MOV A,#0FEH ;给…

Linux系统编程(二)——Linux系统IO函数

在第一篇的时候写到了系统环境的搭建以及各种调试的方法&#xff0c;接下来讲述关于系统函数的使用。 目录 0x01 标准C库IO函数和Linux系统IO函数对比 一、标准C库IO函数操作流程 二、标准C库IO和Linux系统IO的关系 三、虚拟地址空间 0x02 LinuxIO函数实例 一、open()、…

dubbo以xml方式操作和新版dubbo-admin安装

文章目录1 dubbo xml配置1.1 提供者1.1.1 提供者接口1.1.2 提供者实现类1.1.2.1 项目结构图示1.1.2.2 pom.xml1.1.2.3 实现类接口1.1.2.4 配置文件1.1.2.4.1 xml配置1.1.2.4.2 结合注解方式1.1.2.5 启动类1.1.2.5.1 直接读取配置文件1.1.2.5.2 Main.main启动1.1.3 其他方式配置…

最新持续更新Crack:LightningChart 行业使用大全

LightningChart .NET 和 JavaScript 解决方案旨在通过彻底的图表优化、最小的延迟和流畅的呈现来满足行业最苛刻的数据可视化要求。LightningChart .NET 和 JavaScript 直观的 API 使用户能够使用适用于任何桌面、移动和平板设备的鼠标和触摸屏交互功能轻松操作最复杂的图表。 …

JSP JAVA javaweb企业仓库库存管理系统(仓库进销存管理系统ssm库存管理系统仓库管理系统)

JSP 企业仓库库存管理系统&#xff08;仓库进销存管理系统ssm库存管理系统仓库管理系统&#xff09;

【附源码】计算机毕业设计JAVA疫情下的进出口食品安全信息管理系统

【附源码】计算机毕业设计JAVA疫情下的进出口食品安全信息管理系统 目运行 环境项配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&…

Django Cookie 与 Session 对比

文章目录原理比较语法比较Cookie 示例创建 Cookie更新 Cookie删除 CookieSession 示例创建 session查询 session删除一组键值对删除 session参考文档本文通过示例演示 Django 中如何创建、查询、删除 Cookie 与 Session。 原理比较 在Web开发中&#xff0c;使用 session 来完成…

无线监控摄像头使用什么样的物联网卡?

无线监控摄像头使用什么样的物联网卡&#xff1f; 随着安全行业的发展和进步&#xff0c;无线监控摄像头的种类越来越多&#xff0c;但主要的网络形式大致可以分为两种形式&#xff0c;一种是连接WiFi使用远程监控&#xff0c;另一种是插入物联网卡的远程监控。随着物联网的快…

初阶数据结构学习记录——열 二叉树(3)链式

链式二叉树是由指针形成的二叉树&#xff0c;之前写的二叉树是由数组组成的&#xff0c;链式由链表来做。链式二叉树每个节点有两个指针&#xff0c;指向两边。以往二叉树&#xff0c;栈&#xff0c;队列等等都需要增删查改&#xff0c;但链式二叉树则不是这样&#xff0c;是因…

深入理解java虚拟机:虚拟机字节码执行引擎(1)

文章目录1. 概述2. 运行时栈帧结构2.1 局部变量表2.2 操作数栈2.3 动态连接2.4 方法返回地址2.5 附加信息1. 概述 代码编译的结果是从 本地机器码 转变为 字节码 &#xff0c;是存储格式发展的一小步&#xff0c;却是编程语言发展的一大步。 执行引擎 是Java虚拟机最核心的组…

pmp是什么意思啊?

PMP是一个证书&#xff0c;项目管理类的专业认证考试&#xff0c;从国外引进大陆已经很多年了&#xff0c;反响也不错。 以前&#xff0c;大陆每年报考PMP的人很少&#xff0c;那时的思维观念&#xff0c;更多的认为有了这个PMP证书&#xff0c;代表着你很上进&#xff0c;学习…