当前位置: 首页 > news >正文

【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合

f9c8a07d51874b7dbe2964ce27590fae.jpeg

🎉🎉欢迎光临,终于等到你啦🎉🎉

🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀

🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 🚀

本专栏带你从Spring入门到入魔 

这是苏泽的个人主页可以看到我其他的内容哦👇👇

努力的苏泽http://suzee.blog.csdn.net/

 


 Spring Cloud Stream构建在SpringBoot之上,提供了Kafka,RabbitMQ等消息中间件的个性化配置,引入了发布订阅、消费组和分区的语义概念  没学过消息中间件的可以看我之前的文章Kafka、RabbitMQ

下面是正片 按照自己的口味来食用哦(有比较难懂的地方)

目录

本文是通过大量阅读 和最近的一些项目的思考和总结 写出来的 关于Spring Cloud Stream的文章不少  但我更想以观众能够轻松理解并且运用到自己的项目当中 我认为这才是技术存在的意义

Spring Cloud Stream: 消息驱动架构

引言

Spring Cloud Stream的概念和目标

 

事件驱动架构在现代微服务应用程序中的重要性

先来认识Spring Cloud Stream架构

消息驱动架构(MDA)

两者之间的关系

Spring Cloud Stream作为实现MDA的框架 他是怎么做的呢?  我把他分成以下几点:

那么我们了解了其思想和架构 我们要如何建立到我们自己的项目当中应用这种方式呢?  这是一个很关键的问题

实例讲解

步骤 1: 定义平台无关模型(PIM)

步骤 2: 配置消息中间件绑定器

步骤 3: 实现消息转换和处理

步骤 4: 实现消息发送和接收的代码

步骤 5: 实现业务逻辑

以上就是一个很简单的MDA框架的业务demo的实现啦 再结合中间件的知识学习加以实践 就能较好的构建一个云原生的项目啦

希望能够帮到有需要的读者 如有纰漏  望指出!

关注我 深入学习Spring云原生系列!一起努力~ 


 

Spring Cloud Stream: 消息驱动架构

引言

随着云计算、微服务和大数据技术的快速发展,构建可扩展、高性能和弹性的应用程序变得越来越重要。为了满足这些要求,许多开发人员转向了事件驱动架构,它允许应用程序通过基于事件的方式相互通信,从而提高了系统的响应速度和伸缩性。在这个背景下,Spring Cloud Stream应运而生,它是一个用于构建基于事件驱动的微服务应用程序的框架,可以与现有的消息中间件(如Apache Kafka和RabbitMQ)无缝集成。

Spring Cloud Stream的概念和目标

Spring Cloud Stream是一个用于构建基于事件驱动的微服务应用程序的框架,其核心目标是简化开发过程,降低消息通信的复杂性,从而使开发人员能够专注于编写业务逻辑。Spring Cloud Stream通过提供Binder抽象,将应用程序与消息中间件解耦,让开发人员无需关心底层通信细节。同时,它还提供了一套丰富的API和特性,如消息分组、分区和错误处理,使得构建强大、可扩展的事件驱动应用程序变得更加简单。

 

事件驱动架构在现代微服务应用程序中的重要性

事件驱动架构是指应用程序组件之间通过事件进行通信的架构。在这种架构中,组件之间的通信是异步的,基于发布-订阅模式,这有助于实现以下几个关键优势:

  1. 可伸缩性:应用程序可以通过增加或减少组件实例来应对不断变化的负载,而不会对整个系统产生负面影响。
  2. 解耦:组件之间的通信是基于事件的,它们无需知道对方的内部实现,这有助于降低系统的复杂性和维护成本。
  3. 高性能:事件驱动架构允许应用程序以并行方式处理事件,从而提高了系统的响应速度和吞吐量。
  4. 弹性:由于组件之间的通信是异步的,当某个组件出现故障时,其他组件可以继续处理事件,降低了单点故障的风险。

先来认识Spring Cloud Stream架构

ae15dc5b347349eaa680f2f771ea13c3.png

 

消息驱动架构(MDA)

8a5b823f12b347d5967b2e70d4d386a8.png

想象一下,我们要建造一座房子。传统的方式是,我们需要手工完成从设计到建造的每一个步骤。我们首先创建设计图纸,然后按照图纸上的规格和要求一步步地建造房子。

而在MDA的方式下,我们使用了一种自动化的工具来简化这个过程。我们首先创建一个高度抽象的模型,就像是一个概念上的房子草图。这个模型与具体的实现技术无关,只关注房子的整体结构和功能。

接下来,我们使用工具将这个高级模型转换为与特定实现技术相关的模型,就像是根据草图创建了一份针对具体施工工艺的图纸。例如,我们可以将高级模型转换为使用钢筋混凝土结构的房子模型。

最后,我们使用工具将这个特定实现技术的模型转换为实际的代码,就像是根据图纸建造房子的过程。这些代码与应用技术密切相关,最终实现了我们所设计的系统。

这种方式的好处是,自动化工具帮助我们完成了从高级模型到具体代码的转换,省去了手工操作的繁琐过程。这样,开发人员可以更加清晰地理解整个系统的架构,而不会受到具体实现技术的干扰。同时,对于复杂的系统,也减少了开发人员的工作量。

50c430333a7f47acb698edb527a065b4.png

两者之间的关系

Spring Cloud Stream作为实现MDA的框架 他是怎么做的呢?  我把他分成以下几点:

  1. 定义平台无关模型(PIM):
    在Spring Cloud Stream中,你可以定义一个高度抽象的PIM,它描述了消息的生产者和消费者之间的通信和交互方式,而与具体的消息中间件实现无关。PIM可以包括消息的格式、结构、交换模式等。这个PIM可以作为系统设计的核心模型,独立于具体的实现技术。

  2. 选择和配置绑定器(Binder):
    Spring Cloud Stream提供了与多种消息中间件集成的绑定器,如Kafka、RabbitMQ等。绑定器可以将PIM与特定的消息中间件进行连接,使得消息的发送和接收可以与具体的消息中间件实现进行交互。通过选择和配置适当的绑定器,你可以将PIM转换为特定的平台相关模型(PSM),以便与消息中间件进行通信。

  3. 实现消息转换和处理:
    Spring Cloud Stream提供了消息转换的机制,允许你定义如何将原始消息转换为特定的领域对象,并在消费者之间传递。你可以使用消息转换器来处理消息的序列化和反序列化,以及将消息转换为应用程序所需的数据结构。这样,你可以在系统中实现解耦合和灵活的消息处理。

  4. 自动化生成代码:
    Spring Cloud Stream提供了自动化的代码生成能力,将PSM转换为具体的代码实现。你只需要定义好PIM和PSM之间的映射关系,Spring Cloud Stream会根据这些映射关系自动生成生产者和消费者的代码,从而实现消息的发送和接收。这样,你可以专注于定义PIM和PSM,并通过自动生成的代码实现实际的消息处理逻辑。

那么我们了解了其思想和架构 我们要如何建立到我们自己的项目当中应用这种方式呢?  这是一个很关键的问题

实例讲解

拿之前做过的一个商城系统来说,其中包含订单服务和库存服务之间的消息通信。订单服务负责接收订单创建请求并发送订单信息给库存服务,库存服务接收订单信息并更新库存。

步骤 1: 定义平台无关模型(PIM)

在订单服务和库存服务之间定义一个平台无关模型,例如一个名为Order的Java类,表示订单信息。

public class Order {private String orderId;private String productId;private int quantity;// 其他订单相关的属性和方法// Getters and setters
}

步骤 2: 配置消息中间件绑定器

在订单服务和库存服务的配置文件中,配置Spring Cloud Stream使用合适的消息中间件绑定器。在这个例子中,我们使用RabbitMQ作为消息中间件。

订单服务的配置文件(application.properties):

spring.cloud.stream.bindings.sendOrder-out-destination=order-exchange

库存服务的配置文件(application.properties):

spring.cloud.stream.bindings.receiveOrder-in-destination=order-exchange

步骤 3: 实现消息转换和处理

在订单服务中,定义一个消息发送接口并实现消息转换和发送逻辑。

@EnableBinding(OrderSource.class)
public class OrderService {@Autowiredprivate OrderSource orderSource;public void createOrder(Order order) {// 执行订单创建逻辑// 发送订单消息orderSource.sendOrder().send(MessageBuilder.withPayload(order).build());}
}interface OrderSource {@Output("sendOrder")MessageChannel sendOrder();
}

在库存服务中,定义一个消息接收接口并实现消息处理逻辑。

@EnableBinding(OrderSink.class)
public class InventoryService {@StreamListener(target = "receiveOrder")public void handleOrder(Order order) {// 执行库存更新逻辑}
}interface OrderSink {@Input("receiveOrder")SubscribableChannel receiveOrder();
}

步骤 4: 实现消息发送和接收的代码

在订单服务中,定义一个消息发送接口并实现消息发送逻辑。

@EnableBinding(OrderSource.class)
public class OrderService {@Autowiredprivate OrderSource orderSource;public void createOrder(Order order) {// 执行订单创建逻辑// 发送订单消息orderSource.sendOrder().send(MessageBuilder.withPayload(order).build());}
}interface OrderSource {@Output("sendOrder")MessageChannel sendOrder();
}

在库存服务中,定义一个消息接收接口并实现消息处理逻辑。

@EnableBinding(OrderSink.class)
public class InventoryService {@StreamListener(target = "receiveOrder")public void handleOrder(Order order) {// 执行库存更新逻辑}
}interface OrderSink {@Input("receiveOrder")SubscribableChannel receiveOrder();
}

步骤 5: 实现业务逻辑

根据具体的业务需求,在订单服务和库存服务中编写业务逻辑来处理接收到的消息。例如,在库存服务中,你可以根据接收到的订单消息更新库存信息。

@EnableBinding(OrderSink.class)
public class InventoryService {@Autowiredprivate InventoryRepository inventoryRepository;@StreamListener(target = "receiveOrder")public void handleOrder(Order order) {// 根据订单消息更新库存信息String productId = order.getProductId();int quantity = order.getQuantity();// 执行库存更新逻辑inventoryRepository.updateInventory(productId, quantity);}
}

以上就是一个很简单的MDA框架的业务demo的实现啦 再结合中间件的知识学习加以实践 就能较好的构建一个云原生的项目啦


希望能够帮到有需要的读者 如有纰漏  望指出!

关注我 深入学习Spring云原生系列!一起努力~ 

 

 

 

相关文章:

【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合

🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏《Spring 狂野之旅:从入门到入魔》 &a…...

PostgreSQL索引篇 | TSearch2 全文搜索

PostgreSQL版本为8.4.1 (本文为《PostgreSQL数据库内核分析》一书的总结笔记,需要电子版的可私信我) 索引篇: PostgreSQL索引篇 | BTreePostgreSQL索引篇 | GiST索引PostgreSQL索引篇 | Hash索引PostgreSQL索引篇 | GIN索引 (倒排…...

SpringMVC 中的常用注解和用法

⭐ 作者:小胡_不糊涂 🌱 作者主页:小胡_不糊涂的个人主页 📀 收录专栏:JavaEE 💖 持续更文,关注博主少走弯路,谢谢大家支持 💖 注解 1. MVC定义2. 注解2.1 RequestMappin…...

智慧城市中的数据力量:大数据与AI的应用

目录 一、引言 二、大数据与AI技术的融合 三、大数据与AI在智慧城市中的应用 1、智慧交通 2、智慧环保 3、智慧公共安全 4、智慧公共服务 四、大数据与AI在智慧城市中的价值 1、提高城市管理的效率和水平 2、优化城市资源的配置和利用 3、提升市民的生活质量和幸福感…...

德人合科技|天锐绿盾加密软件——数据防泄漏系统

德人合科技是一家专注于提供企业级信息安全解决方案的服务商,提供的天锐绿盾加密软件是一款专为企业设计的数据安全防护产品,主要用于解决企事业单位内部敏感数据的防泄密问题。 www.drhchina.com PC端: https://isite.baidu.com/site/wjz012…...

C语言---单身狗问题

1.单身狗初阶 这个题目就是数组里面有一串数字,都是成对存在的,只有一个数字只出现了一次,请你找出来 (1)异或是满足交换律的,两个相同的数字异或之后是0; (2)让0和每个…...

一次gitlab 502故障解决过程

通过top,发现prometheus进程占用CPU接近100%,这肯定有点异常。gitlab-ctl tail prometheus 发现有报错的情况,提示空间不足。暂时不管空间的问题。 2024-03-07_05:48:09.01515 ts2024-03-07T05:48:09.014Z callermain.go:1116 levelerror err"open…...

Xilinx 7系列 FPGA硬件知识系列(一)——FPGA选型参考

目录 1.1 Xilinx-7系列产品的工艺级别 ​编辑1.2 Xilinx-7系列产品的特点 1.2.1 Spartan-7系列 1.2.2 Artix-7系列 1.2.3 Kintex-7系列 1.2.4 Virtex-7系列 1.3 Xilinx-7系列FPGA对比 1.3.1 DSP资源柱状图 ​1.3.2 Block RAM资源柱状图 ​1.3.3 高速串行收…...

【C++从练气到飞升】02---初识类与对象

🎈个人主页:库库的里昂 ✨收录专栏:C从练气到飞升 🎉鸟欲高飞先振翅,人求上进先读书。 目录 ⛳️推荐 一、面向过程和面向对象初步认识 二、类的引用 1. C语言版 2. C版 三、类的定义 类的两种定义方式&#xff…...

探秘分布式神器RMI:原理、应用与前景分析(一)

本系列文章简介: 本系列文章将深入探究RMI远程调用的原理、应用及未来的发展趋势。首先,我们会详细介绍RMI的工作原理和基本流程,解析其在分布式系统中的核心技术。随后,我们将探讨RMI在各个领域的应用,包括分布式计算…...

JVM(Java虚拟机)概述

1. JVM的定义和作用 JVM(Java Virtual Machine)是一个能够运行Java字节码的虚拟计算机。它是Java平台的核心组成部分,负责执行编译后的Java程序,提供跨平台运行的能力。JVM使得Java程序可以在任何安装了JVM的操作系统上运行&#…...

C#,数值计算,用割线法(Secant Method)求方程根的算法与源代码

1 割线法 割线法用于求方程 f(x) 0 的根。它是从根的两个不同估计 x1 和 x2 开始的。这是一个迭代过程,包括对根的线性插值。如果两个中间值之间的差值小于收敛因子,则迭代停止。 亦称弦截法,又称线性插值法.一种迭代法.指用割线近似曲线求…...

HTML静态网页成品作业(HTML+CSS)——花主题介绍网页设计制作(1个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有1个页面。 二、作品演示 三、代…...

Keepalive 解决nginx 的高可用问题

一 说明 keepalived利用 VRRP Script 技术,可以调用外部的辅助脚本进行资源监控,并根据监控的结果实现优先动态调整,从而实现其它应用的高可用性功能 参考配置文件: /usr/share/doc/keepalived/keepalived.conf.vrrp.localche…...

DPN网络

DPN DPN(Dual Path Networks)是一种网络结构,它结合了DensNet和ResNetXt两种思想的优点。这种结构的目的是通过不同的路径来利用神经网络的不同特性,从而提高模型的效率和性能。 DenseNet 的特点是其稠密连接路径,使…...

循序渐进丨MogDB 数据库新特性之SQL PATCH绑定执行计划

1 SQL PATCH 熟悉 Oracle 的DBA都知道,生产系统出现性能问题时,往往是SQL走错了执行计划,紧急情况下,无法及时修改应用代码,DBA可以采用多种方式针对于某类SQL进行执行计划绑定,比如SQL Profile、SPM、SQL …...

【论文阅读随笔】RoPE/旋转编码:ROFORMER: ENHANCED TRANSFORMER WITH ROTARY POSITION EMBEDDING

文章目录 1.目的:通过绝对位置编码的方式实现相对位置编码2.理解RoPE,在我看来有几个需要注意的点:3.本文相关复数概念:3.1.复数乘法的几何意义3.2.复数内积 VS. 复数乘法 4.REF: 1.目的:通过绝对位置编码的…...

数据挖掘

一.数据仓库概述: 1.1数据仓库概述 1.1.1数据仓库定义 数据仓库是一个用于支持管理决策的、面向主题、集成、相对稳定且反映历史变化的数据集合。 1.1.2数据仓库四大特征 集成性(Integration): 数据仓库集成了来自多个不同来源…...

java SSM旅游景点与公交线路查询系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM旅游景点与公交线路查询系统是一套完善的web设计系统(系统采用SSM框架进行设计开发,springspringMVCmybatis),对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系…...

解决Git报错:fatal: detected dubious ownership in repository at

在通过 Git Bash 提交项目代码时输入 git add . 命令后,报错:fatal: detected dubious ownership in repository at 这是因为该项目的所有者与现在的用户不一致 比如说: 该项目的所有者是 Administrator,而当前用户是 YuYang, 那…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

Qt Widget类解析与代码注释

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码&#xff0c;写上注释 当然可以&#xff01;这段代码是 Qt …...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...