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

本文涉及的产品
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
简介: 【Spring云原生系列】SpringBoot+Spring Cloud Stream:消息驱动架构(MDA)解析,实现异步处理与解耦合

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


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架构


消息驱动架构(MDA)

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


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


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


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


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


两者之间的关系


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


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

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


  1. 选择和配置绑定器(Binder):

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


  1. 实现消息转换和处理:

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


  1. 自动化生成代码:

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的实现啦 再结合中间件的知识学习加以实践 就能较好的构建一个云原生的项目啦

相关文章
|
3天前
|
XML Java 开发者
Spring底层架构核心概念解析
理解 Spring 框架的核心概念对于开发和维护 Spring 应用程序至关重要。IOC 和 AOP 是其两个关键特性,通过依赖注入和面向切面编程实现了高效的模块化和松耦合设计。Spring 容器管理着 Beans 的生命周期和配置,而核心模块为各种应用场景提供了丰富的功能支持。通过全面掌握这些核心概念,开发者可以更加高效地利用 Spring 框架开发企业级应用。
38 18
|
14天前
|
存储 人工智能 Cloud Native
NAS深度解析:面向云原生应用的文件存储
本文深入解析了面向云原生应用的文件存储NAS,由阿里云专家分享。内容涵盖Cloud Native与AI浪潮下的技术创新,包括高性能、弹性伸缩、成本优化及数据安全等方面。针对云原生应用的特点,NAS在Serverless生态中不断演进,提供多种产品规格以满足不同需求,如极速型NAS、归档存储等,确保用户在高并发场景下获得稳定低延时的存储体验。同时,通过优化挂载参数和容器访问策略,提升整体性能与可用性。
42 11
|
2月前
|
决策智能 数据库 开发者
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
本项目旨在解决智能体的“超级入口”问题,通过开发基于意图识别的多智能体框架,实现用户通过单一交互入口使用所有智能体。项目依托阿里开源的Qwen2.5大模型,利用其强大的FunctionCall能力,精准识别用户意图并调用相应智能体。 核心功能包括: - 意图识别:基于Qwen2.5的大模型方法调用能力,准确识别用户意图。 - 业务调用中心:解耦框架与业务逻辑,集中处理业务方法调用,提升系统灵活性。 - 会话管理:支持连续对话,保存用户会话历史,确保上下文连贯性。 - 流式返回:支持打字机效果的流式返回,增强用户体验。 感谢Qwen2.5系列大模型的支持,使项目得以顺利实施。
357 8
使用Qwen2.5+SpringBoot+SpringAI+SpringWebFlux的基于意图识别的多智能体架构方案
|
21天前
|
搜索推荐 NoSQL Java
微服务架构设计与实践:用Spring Cloud实现抖音的推荐系统
本文基于Spring Cloud实现了一个简化的抖音推荐系统,涵盖用户行为管理、视频资源管理、个性化推荐和实时数据处理四大核心功能。通过Eureka进行服务注册与发现,使用Feign实现服务间调用,并借助Redis缓存用户画像,Kafka传递用户行为数据。文章详细介绍了项目搭建、服务创建及配置过程,包括用户服务、视频服务、推荐服务和数据处理服务的开发步骤。最后,通过业务测试验证了系统的功能,并引入Resilience4j实现服务降级,确保系统在部分服务故障时仍能正常运行。此示例旨在帮助读者理解微服务架构的设计思路与实践方法。
69 16
|
24天前
|
监控 JavaScript 数据可视化
建筑施工一体化信息管理平台源码,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
智慧工地云平台是专为建筑施工领域打造的一体化信息管理平台,利用大数据、云计算、物联网等技术,实现施工区域各系统数据汇总与可视化管理。平台涵盖人员、设备、物料、环境等关键因素的实时监控与数据分析,提供远程指挥、决策支持等功能,提升工作效率,促进产业信息化发展。系统由PC端、APP移动端及项目、监管、数据屏三大平台组成,支持微服务架构,采用Java、Spring Cloud、Vue等技术开发。
|
2月前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
184 5
|
Java API Maven
Springboot 系列(四)Spring Boot 日志框架
Springboot 系列(四)Spring Boot 日志框架
783 0
Springboot 系列(四)Spring Boot 日志框架
|
8天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的留守儿童爱心网站设计与实现(计算机毕设项目实战+源码+文档)
博主是一位全网粉丝超过100万的CSDN特邀作者、博客专家,专注于Java、Python、PHP等技术领域。提供SpringBoot、Vue、HTML、Uniapp、PHP、Python、NodeJS、爬虫、数据可视化等技术服务,涵盖免费选题、功能设计、开题报告、论文辅导、答辩PPT等。系统采用SpringBoot后端框架和Vue前端框架,确保高效开发与良好用户体验。所有代码由博主亲自开发,并提供全程录音录屏讲解服务,保障学习效果。欢迎点赞、收藏、关注、评论,获取更多精品案例源码。
39 10
|
8天前
|
JavaScript Java 测试技术
基于SpringBoot+Vue实现的家政服务管理平台设计与实现(计算机毕设项目实战+源码+文档)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
28 8
|
8天前
|
JavaScript 搜索推荐 Java
基于SpringBoot+Vue实现的家乡特色推荐系统设计与实现(源码+文档+部署)
面向大学生毕业选题、开题、任务书、程序设计开发、论文辅导提供一站式服务。主要服务:程序设计开发、代码修改、成品部署、支持定制、论文辅导,助力毕设!
20 8

推荐镜像

更多