【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合_springboot stream 双向异步通信-程序员宅基地

技术标签: 云原生  架构  spring cloud  《Spring 狂野之旅:底层原理高级进阶》   驱动开发  

f9c8a07d51874b7dbe2964ce27590fae.jpeg

欢迎光临,终于等到你啦

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

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

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

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

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

 


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

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

目录

本文是通过大量阅读 和最近的一些项目的思考和总结 写出来的 关于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 {
    
    @Autowired
    private 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 {
    
    @Autowired
    private 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 {
    
    @Autowired
    private 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云原生系列!一起努力~ 

 

 

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_72803988/article/details/136546700

智能推荐

Corel VideoStudio会声会影2020免费版+汉化包+序列号PC端电脑下载_corel videostudio 2020-程序员宅基地

文章浏览阅读1.1w次,点赞5次,收藏16次。Corel VideoStudio会声会影由官方发布的全新会声会影,拥有视频剪辑、屏幕录制、视频合并、制作视频 以及光盘制作等功能,还有超多好看丰富的滤镜,即时你是新手也能快速上手,无需任何专业的视频编辑知识,是一款功能强大的视频编辑软件。软件特色:1、色彩渐变控制项利用功能强大的色彩校正及调整工具,设定视频的气氛与环境。您可以直接调整每一个颜色,轻松变换色彩并提升饱和度及明亮度。使用HSL微调功能、色调曲线、波形范围、检查表(LUT)设定档等多种工具微调每种色彩。2、动态分割画面视频画面本身就是分_corel videostudio 2020

kubevirt(三)迁移(migration)-程序员宅基地

文章浏览阅读1.7k次。kubevirt虚拟机迁移分析_kubevirt

linux安装rabbitmq指定文件夹,linux下安装配置rabbitmq(消息队列系统)-程序员宅基地

文章浏览阅读726次。ErlangRabbitMQ是基于Erlang的,所以首先必须配置Erlang环境.我的是Mac OSX系统 所以我直接在http://www.erlang-solutions.com/section/132/download-erlang-otp下载的对应版本的安装包,省的自己配置和安装了然后解压下载的gz包 tar zxcf *.tar.gzcd 进入解压出来的文件夹执行./configu..._解压版的rabbitmq 如何指定配置文件路径

URP——后期处理特效——运动模糊Motion Blur_motion blur for urp-程序员宅基地

文章浏览阅读2.7k次。Motion Blur运动模糊效果模拟了真实相机拍摄物体运动速度快于曝光时间时图像中出现的模糊。这通常是由于物体快速移动,或曝光时间过长所致。通用渲染管道(URP)只模糊摄像机的运动。Using Motion Blur运动模糊使用了体积系统,所以要启用和修改运动模糊属性,你必须添加一个运动模糊覆盖到你的场景中的体积。为体积​​​​​​​添加运动模糊:在场景或层次视图中,选择一个包含体积组件的游戏对象,在检查器中查看它。 在检查器中,导航到Add Override > Post-p_motion blur for urp

3D坐标轴下画一个姿态、位置可调整的圆柱体_add_collection3d-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏11次。使用matplotlib在一个3D坐标轴下绘制任意位置、任意姿态的圆柱体。_add_collection3d

面向对象知识总结_1什么是面向对象-程序员宅基地

文章浏览阅读446次。1.什么是面向对象将数据与功能绑定到一起的操作起名为面向对象编程,将特定的数据与特定的功能绑定到一起 将来只能彼此相互使用。2.面向对象编程 面向对象中'对象'其实就是一个容器,里面将数据和功能绑定到了一起 只负责创造人物功能后续的具体实现什么结果就不需要负责:游戏人物开发3.对象与类对象:数据与功能的结合体,记录多个对象不同的数据和功能类:多个对象相同的数据和功能体的结合,记录多个对象相同的数据和功能..._1什么是面向对象

随便推点

基于Java课程智能组卷系统详细设计和实现_如何制作一个智能组卷系统-程序员宅基地

文章浏览阅读829次,点赞19次,收藏17次。随着互联网时代的到来和计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的基于SSM的课程智能组卷系统,会使课程管理工作系统化、规范化,也会提高高校平台形象,提高管理效率。本系统是针对目前课程管理的实际需求,从实际工作出发,对过去的基于SSM的课程智能组卷系统存在的问题进行分析,结合计算机系统的结构、概念、模型、原理、方法,在计算机各种优势的情况下,采用目前最流行的B/S结构、ssm技术MySQL数据库设计并实现的。本。_如何制作一个智能组卷系统

RAG应用的典型工作流程_rags评估指标-程序员宅基地

文章浏览阅读603次,点赞21次,收藏17次。在总结中,我们看到了 RAG(检索增强生成)系统的快速进步,这包括了能够定制并推动 RAG 在多个领域性能和实用性进一步提高的先进范式的开发。例如,通过适应性增强检索技术(AAR(opens in a new tab)),REPLUG(opens in a new tab),和UPRISE(opens in a new tab)等方式来实现。这些工具和服务的开发,不仅推动了 RAG 技术的应用范围扩展,也为研究人员和开发者提供了更多的可能性,使他们能够更容易地探索和实现复杂的 RAG 应用。_rags评估指标

Linux操作系统彻底删除MySQL——详细步骤_linux系统中卸载mysql教程-程序员宅基地

文章浏览阅读1.5w次,点赞43次,收藏120次。在安装另一个MySQL版本之前一定到把之前MySQL版本给卸载干净。_linux系统中卸载mysql教程

echarts的xAxis的type=’time’_echarts xaxis type-程序员宅基地

文章浏览阅读2.7w次,点赞9次,收藏36次。熟悉下echarts图表,options配置项的xAxis参数当你的数据有时间和值,你可以做成类目型折线图,也可以做成时间轴折线图。类目型就是点与点之间等距,时间不等距;而做成时间轴,则时间等距,两点之间不一定等距。xAxis的type,data及symboltypecategorytimemin (坐标轴刻度最小值)‘dataMin’,此时取数据在该轴上的最小值作为最小刻..._echarts xaxis type

Bluetooth移植及相关debug思路(以rtl8821CU为例)_rtl8821cu 蓝牙移植-程序员宅基地

文章浏览阅读2.3k次。主板上解焊掉WiFi 模块附近的0欧电阻。插上新增的WiFi dongle进行调试。蓝牙部分,要1:添加WiFi dongle vid ==》device/mstar/common/libraries/bluetooth/bluetoothmonitor/bluedroid/bluetooth.cstatic struct bt_vid_pid rtk_tables[] ={ {0x0bda,0x818c},//RTL8761AW bt + 8192EU wifi combo {0x0b_rtl8821cu 蓝牙移植

一些程序源代码的网站_lofter网站代码-程序员宅基地

文章浏览阅读1.9k次。各种经典源码,应有尽有,包你满意! 酒店管理系统(绝对经典) 这是我的一个网友发给我的,希望对你们有帮助哦 http://www.ibeifeng.com/read-htm-tid-10774.html&u=53596 【C#】学生成绩管理系统、打字练习的源代码 希望对大家有所帮助。。。 http://www.ibeifeng.com/read-htm-tid-8118.html&u=5359_lofter网站代码

推荐文章

热门文章

相关标签