梳理一下spring中,与message相关的知识点

      本次梳理的相关知识点包括jms,amqp(rabbitmq),sping-messaging,spring-integration,springcloud-stream,这些都是与消息message相关的内容,它们有什么区别与联系呢?

      相关的要点与相互关系都整理在如下图中,如有不对欢迎指正:

一、关系图:

        左边是jms与amqp(rabbitmq),以及spring的使用,下面是所基于的spring-messaging的消息规范。右边是spring的消息集成integration架构,重点展示了与jms/amqp的集成,以及显示出对左边的特定目标下的使用方法,同时也是基于并扩展了spring-messaging规范。

        右上边是springcloud-stream,展示出公共机制使用了spring-messaing与integration中的扩展。因为不涉及外部,必须统一用spring自己的规范了。另外的binder部分,使用了与amqp集成时,已有的一些类,比如endpoint/container...。

二、梳理的目标

        从这个图上,显示出spring自己定义的规范是基础。以及基于已有的实现,开发进一步功能时应该基于哪部分,比如message定义应该基于spring-message。这样不至于重复开发,不至于自创不规范内容,不至于乱了这套spring的统一定义/扩展/整合/转换的理念。

三、几部分的细述:

1、常见的jms与amqp:

  1.  左边有两部分,分别是jms与amqp。jms API代表了消息接口规范,而amqp代表了一个与消息中间件的通讯协议。这就是差别,不过也可以实现一个jms的客户端,通过amqp与中间件通讯。而实现jms的客户端,其实可以通过其它协议与消息中间件通讯。可以参考jdbc规范,很多db提供了jdbc的实现,但客户端与db的通讯协议是什么,可以不去关注。但为什么要关注amqp呢?因为提供了更高级的功能,不一样的使用方式。那么也可以搞一个amqp的api出来吧。后面spring-amqp中就有了。
  2. 在spring中,对jms与amqp都实现了支持,分别是spring-jms与spring-amqp(spring-rabbit)以方便使用。如同使用jdbc时,spring提供了jdbcTemplate,spring-jms与spring-amqp也提供了对应的template,不过各提供了两个。比如spring-jms中有JmsTemplate与JmsMessagingTemplate。这就与spring-messaging中,统一规范message有关了。JmsMessagingTemplate可以发送spring的message,内部转换成jms的msg了,再用JmsTemplate发出去。另外,还有相似的@EnableJms与@EnableRabbit这样的注解。
  3. 对于spring-jms的细节,可以看以前写的这个博文:

  spring-jms的接收消息功能的设计思考_spring cloud jms-CSDN博客文章浏览阅读467次。1、前言JMS即Java消息服务,面向消息中间件的API。本文研究过源码,试着分析一下如何从基本的使用方式,到整合进spring的方式的思考,来提高自己的系统设计能力。只分析消息接收处理过程,话说spring-jms是整合jms的使用,而springcloud-stream是自己实现了一个发送接收过程,通过设计binding对接消息中间件上。2、jms接收消息jsm是标准接口,具体的产品..._spring cloud jmshttps://blog.csdn.net/herriman/article/details/105205614

2、spring的基础消息定义:spring-messaging

  1. Spring Framework 4 包含了一个新的spring-messging模块。spring-messging就是spring自己的消息规范,定义了message的格式,还定义了一些相关的channel。其中base定义了消息Message(MessageHeader和body)、消息处理MessageHandler、发送消息MessageChannel。上面的spring-jms与spring-amqp中,就使用了这些spring规范作为支持。所以spring-messging就是spring的消息底座,基础规范,统一格式。
  2. 另外还有STOMP协议的简单消息协议的通用支持。STOMP是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。它提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互,类似于OpenWire(一种二进制协议)。由于其设计简单,很容易开发客户端,因此在多种语言和多种平台上得到广泛应用。其中最流行的STOMP消息代理是Apache ActiveMQ。
  3. 一方面提供了通过TcpOperations建立tcp connection、通过TcpConnectionHandler处理消息和通过TcpConnectionf发送消息的抽象及实现;另一方面包含了对基于Reactor的tcp 消息支持。

3、springboot-*-starter自动配置

  1. 针对jms与amqp,在springboot自动配置框架下,都有对应的starter。图中左下的两个黑色框。

4、spring-integration消息集成

        右边主要是spring-integration的内容,典型的与jms以及amqp的集成,当然也可以与消息中间件没有关系。既然是spring自己的方案,公共部分必然基于spring-messaging中的消息规范,不同的地方要进行convert转换,此外还要扩展一些spring公共的实现,比如多种channel实现。当然还要使用已经有的spring-jms与spring-amqp中的template/listener/containner等,不至于重复开发,再补充上集成特有的gateway/adapter等。这样组合出完整的集成目的的架构。

  1. integrating与消息中间件没有关系,它只是集成系统时,设计了一套channel/inbound/gateway/adatper(单向/双向)的架构。比如web系统也可以用消息机制集成。Spring Integration将应用和数据库、消息中间件、邮件服务器、缓存(Redis)、其他应用系统等任何系统的交互都纳入一个统一的消息集成模型中进行抽象设计

  2. 消息传递和事件驱动架构不一定需要使用消息中间件系统。Spring Integration可以独立作为构建消息传递解决方案的框架。在没有外部集成要求的简单应用程序中,生产者和消费者组件可以通过消息通道解耦,这样它们就只与消息通信,而不是直接调用带参数的方法。消息传递实际上是一种范式;无论消息传递发生在同一进程内运行的组件之间,还是发生在不同系统上不同进程下运行的组件间,都适用相同的基本原则。

  3. 简单的说: Spring Integration期望大家以统一的方式去处理所有系统的集成。任何系统之间的集成都可以认为是消息在系统间按照特定的模式进行传递。

  4. Spring Integration对于产品实施还有意义吗?首先:应用集成模型并不是核心业务模型。是否需要独立抽象存在争议;其次:在特定系统的集成领域,都存在成熟和稳定的使用实践, 比如微服务网关、Http协议的Feign组件、 数据库的ORM模式、多级缓存等。这些功能组件由于目的和习惯的差异,有着各自的集成方式,全部以消息集成的思维去理解和使用反而带来歧义

5、springcloud-stream

  1. 它是springcloud微服务体系中的消息机制。使用分布式中间件rabbitmq为例。首先它不直接绑定各消息中间件,而是通过binder。binder一方面关联着通用的channel,另一方面关联着特定消息中间件的endpoint。通用框架的功能部分肯定使用spring-messaging以及已经在spring-integration中扩展的类。
  2. 而特定的绑定消息中间件的部分,已经有了spring-amqp(spring-rabbit)了,在这基础上,在spring-integration-amqp中,还有更进一点实现的AmqpOutboundEndpoint等内容。当然依赖这些已有的去实现特定的功能。还有特定的消息handler,基于抽象类AbstractMessageHandler来实现,所以工程的包依赖就是这样。再补上连接参数以及自动配置。就差不多了。

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

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

相关文章

物联网消息队列Emqx日志配置及日志追踪以及Centos7上的rc.local开机不执行、git提交的小问题

一、物联网消息队列Emqx日志配置及日志追踪 EMQX支持将日志输出到控制台或者日志文件,或者同时使用两者。使用 Docker 部署 EMQX,默认只能通过 docker logs 命令查看 EMQX 日志。EMQX 的默认日志级别为 warning,默认在单日志文件超过10MB(log…

word压缩大小怎么弄?快来试试这几种压缩word方法!

word压缩大小怎么弄?在处理Word文档时,如果遇到体积过大的情况,无疑会带来一系列麻烦,大型Word文档不仅占据大量存储空间,而且在传输过程中会耗费更多时间,想象一下,当你急需将一份重要的文档发…

Perl打印9x9乘法口诀

本章教程主要介绍如何用Perl打印9x9乘法口诀。 一、程序代码 1、写法① use strict; # 启用严格模式,帮助捕捉变量声明等错误 use warnings; # 启用警告,帮助发现潜在问题# 遍历 1 到 9 的数字 for my $i (1..9) {# 对于每个 $i,遍历 1…

【设计模式系列】观察者模式

一、什么是观察者模式 观察者模式(Observer Pattern)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式也被称为发布-订阅模式&…

【AscendC算子开发】笔记2 算子高级开发和调试调优

算子调试 Tensor也可以通过特定的printf方法来打印,见上图。 gdb调试见上图。 为什么gdb调试无法成功,因为run.sh里面有两行export,如果直接通过.XX运行的话需要配置一下。 npu域也支持调试,可以使用上述的方法。 内存检测工…

AI自动生成PPT哪个软件好?智能生成PPT不再熬夜做课件

大概这世上,都是职场牛马对“PPT”这三个字母的头痛反应最大吧! 是的,就连各个年级段的老师也是很头痛——愁着怎样能在排版整齐的情况下,将必考知识点都呈现在PPT每一张幻灯片页面里...... 近期打听到用人工智能生成ppt课件&am…

ProtoBuf 的含义和安装

ProtoBuf 是什么 Protocol Buffers 是 Google 的⼀种语⾔⽆关、平台⽆关、可扩展的序列化结构数据的⽅法,它可⽤ 于(数据)通信协议、数据存储等。 Protocol Buffers 类⽐于、 XML,是⼀种灵活,⾼效,⾃动化机…

Java项目-基于springboot框架的智慧外贸系统项目实战(附源码+文档)

作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…

2024年最新苹果iOS证书申请创建App详细图文流程

iOS 证书设置指南: 对于开发者来说,在没有Mac电脑或对Xcode等开发工具不熟悉的情况下,如何快速完成IOS证书制作和IPA文件提交至开发者中心一直是一个难题。但是现在,有了初雪云提供的极简工具,您可以轻松实现这两个任…

Tomcat隐藏版本号和报错信息

为了避免漏洞扫描的时候造成版本泄露&#xff0c;可以在conf/server.xml配置文件中的<Host>配置项中添加如下配置: <Valve className"org.apache.catalina.valves.ErrorReportValve" showReport"false" showServerInfo"false" /> …

c语言内核链表

c语言内核链表 在Linux中拥有大量的内核源码&#xff0c;在数据存储的这块位置拥有内核链表&#xff08;双向循环链表&#xff09; 由linux内核提供的链表文件&#xff0c;里面包含了多组内联函数和宏定义函数以及功能性函数。 内核链表中定义了多个函数&#xff0c;我们只需要…

(gersemi) CMake 格式化工具

文章目录 &#x1f9ee;介绍&#x1f9ee;安装&#x1f9ee;使用&#x1f5f3;️模式 modes&#x1f5f3;️样式配置 config ⭐END&#x1f31f;help&#x1f31f;交流方式 &#x1f9ee;介绍 BlankSpruce/gersemi: A formatter to make your CMake code the real treasure A f…

关闭或开启Win11系统的自动更新

Win11系统老是自动更新&#xff0c;每次更新后不仅拖慢计算机的运行速度&#xff0c;甚至打印机都无法使用了&#xff0c;给我们带来了很多困扰。 那么我们该如何彻底关闭Win11系统的自动更新呢&#xff1f;关闭Win11系统自动更新会有什么弊端呢&#xff1f; 下面就分享几个小方…

NVIDIA 发布适用于网络安全的 NIM Blueprint

德勤使用适用于容器安全的 NVIDIA NIM Agent Blueprint 帮助企业利用开源软件构建安全的 AI。 文章目录 &#x1f64a; 德勤使用 NVIDIA AI 保障软件安全&#x1f64a; 通过生成式 AI 保障软件安全&#x1f64a; 适用于网络安全成功的蓝图&#x1f3a0; 什么是 NVIDIA NIM Agen…

ESP32移植Openharmony外设篇(3)OLED屏

模块简介 产品介绍 OLED (Organic Light-Emitting Diode)&#xff1a;有机发光二极管又称为有机电激光显示&#xff0c;OLED显示技术具有自发光的特性&#xff0c;采用薄的有机材料涂层和玻璃基板&#xff0c;当有电流通过时&#xff0c;这些有机材料就会发光&#xff0c;而且…

数组中的算法

目录 1.什么是数组 2.数组上的算法 2.1二分查找算法 什么是二分查找算法&#xff1f; 算法步骤 算法时间复杂度 一个问题 例题 题目分析 解题代码 2.2双指针法 什么是双指针法&#xff1f; 例题 题目分析 解题代码 1.什么是数组 数组是在一块连续的内存空间…

【vuejs】富文本框输入的字符串按规则解析填充表单

今天遇到一个批量添加信息的需求&#xff0c;按照格式要求解析后填充到表单中&#xff0c;不符合规则的直接过滤掉 注&#xff1a;添加的信息都是随机生成&#xff0c;不用于实际用途 这是弹框输入的文本解析代码 export const editValToArr (value, bankArr) > {return n…

vue2-render:vue2项目使用render / 基础使用

一、本文内容 本文内容记录render常用的一些属性和方法的配置&#xff0c;以作参考 export default { data() {return { modelValue: ,key: 0,}; }, render(h) { return h(div, [ h(input, {class: input,attrs: { type: text }, key: this.key,props: { value: thi…

【mysql进阶】2-4. mysql 系统库

mysql System Schema (mysql系统库) Mysql Schema是⼀个系统库&#xff0c;表中存储了MySQL服务器运⾏时所需的信息。⼴义上&#xff0c;mysqlschema包含存储数据库对象元数据的数据字典和⽤于其他操作⽬的的系统表。数据字典表和系统表位于数据⽬录下⼀个名为 mysql.ibd 的表…

“声音”音源设置和音效播放

学习如何使用音效系统&#xff0c;背景音乐和其他特别的音效&#xff0c;跳跃攻击等等 学习如何在unity当中使用整套的音效系统&#xff0c;使用之前&#xff0c;我们先来确定一下我们要使用的音乐和音效&#xff0c;在Unity Asset Store当中搜索&#xff0c;添加到我们的unit…