当前位置:首页 > 科技  > 软件

Springboot 3.1.x: 快速掌握事件驱动的实用技巧

来源: 责编: 时间:2024-04-08 09:01:17 101观看
导读在这个充满挑战和收获的60天学习之旅中,你将迅速提升成为一名全栈工程师。专注于Spring Boot框架,我们将深入研究高级特性,从项目初始化到微服务架构,再到性能优化和持续集成部署。无论你是初学者还是有一定经验的开发者,

在这个充满挑战和收获的60天学习之旅中,你将迅速提升成为一名全栈工程师。专注于Spring Boot框架,我们将深入研究高级特性,从项目初始化到微服务架构,再到性能优化和持续集成部署。无论你是初学者还是有一定经验的开发者,这个专题都将带你穿越从零到全面掌握Spring Boot的学习曲线。DDH28资讯网——每日最新资讯28at.com

DDH28资讯网——每日最新资讯28at.com

在上一篇文章中,我们介绍了事件驱动架构的基本概念以及Springboot中的事件机制。今天,我们将继续探讨事件驱动,并通过实例如何实现事件驱动架构,以及处理事件的发布与订阅。DDH28资讯网——每日最新资讯28at.com

实现简单的事件驱动架构

当我们谈论实现一个简单的事件驱动架构(EDA)时,我们首先要理解EDA的基础概念,主要包括事件、事件源、事件通道和事件消费者。DDH28资讯网——每日最新资讯28at.com

  • 事件(Event):本质上是一个消息,通常包含了触发其的条件和需要传递的数据。比如,一个用户完成购物的事件,可能包含用户的信息,购买的商品信息等。
  • 事件源(Event Source):是产生事件的对象。它应该知道哪些事件消费者对它产生的事件感兴趣,并负责给这些消费者发送事件消息。在前面的购物例子中,购物网站可能就是事件源。
  • 事件通道(Event Channel):是事件从事件源传递到事件消费者的媒介。这可能是本地的方法调用,也可能是远程的消息系统,如Kafka等。
  • 事件消费者(Event Consumer):接收并处理事件的对象。比如在我们的购物例子中,结算系统可能就是一个事件消费者,它会在收到事件消息后进行一系列的结算处理。

了解了这些基础结构并定义好事件后,我们可以创建事件驱动架构的主要结构:DDH28资讯网——每日最新资讯28at.com

  1. 注册事件:根据你的系统需求设计出具体的事件,比如“购物完成”事件、”新用户注册“事件等。
  2. 创建事件发布者,注入事件通道:实现当特定情况出现时,发布者将事件发布到相应的事件通道中。
  3. 创建事件消费者,并注册相应的事件:每个消费者可能关心不同的事件,我们需要在消费者中注册它们感兴趣的事件。
  4. 实现事件处理逻辑:每当消费者收到感兴趣的事件时,它们就会触发相应的事件处理方法,进行实际的业务处理。

在这个过程中,我们需要注意的是,系统设计应该保证所有的事件的发布和订阅都是异步的,并合理地处理可能出现的错误和异常,使得整个系统在出现错误时能保持一定的稳定性。DDH28资讯网——每日最新资讯28at.com

以下是一些代码示例:DDH28资讯网——每日最新资讯28at.com

我们需要定义事件类,包含要传递的信息:DDH28资讯网——每日最新资讯28at.com

import org.springframework.context.ApplicationEvent;public class UserRegisterEvent extends ApplicationEvent {    private String username;    public UserRegisterEvent(Object source, String username) {        super(source);        this.username = username;    }    public String getUsername() {        return username;    }}

创建事件发布者,根据需求定义发布事件:DDH28资讯网——每日最新资讯28at.com

import org.springframework.context.ApplicationEventPublisher;import org.springframework.stereotype.Component;@Componentpublic class UserRegisterPublisher {    private final ApplicationEventPublisher publisher;    public UserRegisterPublisher(ApplicationEventPublisher publisher) {        this.publisher = publisher;    }    public void publish(String username) {        // 创建事件源        UserRegisterEvent event = new UserRegisterEvent(this, username);        // 发布事件        publisher.publishEvent(event);    }}

创建监听器,监听事件的发生并做出相应处理:DDH28资讯网——每日最新资讯28at.com

import org.springframework.context.event.EventListener;import org.springframework.stereotype.Component;@Componentpublic class UserRegisterListener {    @EventListener    public void handleUserRegisterEvent(UserRegisterEvent event) {        // 接收到事件并进行处理        System.out.println("用户注册事件, 新注册用户:" + event.getUsername());    }}

以上我们就实现了一个简单的事件驱动架构。DDH28资讯网——每日最新资讯28at.com

处理事件的发布与订阅

发布-订阅模式是实现事件驱动的重要机制,由三部分组成:发布者,订阅者以及消息通道。不同于传统的直接通信方式,发布者和订阅者不直接通信,取而代之的是通过消息通道进行的。这种解耦合的方式使得系统具有更好的灵活性和扩展性。DDH28资讯网——每日最新资讯28at.com

  • 发布者:当发生了特定的事件,如用户操作、系统状态更新等,发布者就会将这种变化封装为消息,发布到对应的消息通道。发布者无需关心这个消息会被谁处理,只需关心如何把消息准确地发送出去。
  • 消息通道:消息通道作为连接发布者和订阅者的桥梁,最大的作用是对消息进行缓冲和传输。具体一点,当发布者发布消息时,消息通道会先将消息存储起来,然后将消息传送给订阅了该通道的订阅者。
  • 订阅者:订阅者通过订阅消息通道,来接收对应的消息。订阅者无需关心消息的来源,只需关心接收到的消息如何进行处理。

然而,实现发布-订阅模式的过程并不简单。需要考虑如下问题:DDH28资讯网——每日最新资讯28at.com

  1. 如何保证消息的送达率? 在系统复杂、网络环境差,或者其它外部原因下,消息可能会在传输的过程中丢失。因此,我们需要设计一种可靠的策略来保证消息的送达,如重试策略,死信队列等。
  2. 如何处理消费失败的情况? 当订阅者消费消息出现失败(如程序错误,系统暂时不可用等)时,我们无法直接丢弃这些消息,否则可能导致业务处理上的问题。因此,要设计策略处理这种情况,如设置错误队列,问题消息重投等。
  3. 如何确保订阅者消费消息的顺序性? 某些系统业务对事件的顺序非常敏感,如果顺序错乱,可能会导致严重的问题。因此,需要考虑如何在完成高效处理的同时,保证消息的顺序性。
  4. 如何管理系统的复杂性? 冗余的消息通道,订阅者和消息都可能导致系统变得非常复杂,难以维护和管理。需要考虑如何尽可能减小复杂性,比如通过合并相同功能的消息通道,定期清理无效订阅者等。

总的来说,处理事件的发布与订阅只是事件驱动架构中的一部分,但却是非常重要的部分。我们需要设计一个健壮的,能够处理各种复杂情况的发布-订阅系统,才能实现高效的、可靠的事件处理。DDH28资讯网——每日最新资讯28at.com

下面,我们来看个例子,模拟用户注册的场景,当有新用户注册后,我们需要发送邮件通知用户。DDH28资讯网——每日最新资讯28at.com

首先,我们在Controller层接管用户注册的请求:DDH28资讯网——每日最新资讯28at.com

import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class UserRegisterController {    private final UserRegisterPublisher publisher;    public UserRegisterController(UserRegisterPublisher publisher) {        this.publisher = publisher;    }    @PostMapping("/register")    public String register(@RequestParam String username) {        // 模拟注册用户        // ...        // 发布用户注册事件        publisher.publish(username);        return "恭喜您,注册成功";    }}

然后,我们有个邮件服务类,监听用户注册事件,发送通知:DDH28资讯网——每日最新资讯28at.com

import org.springframework.context.event.EventListener;import org.springframework.stereotype.Component;@Componentpublic class EmailService {    @EventListener    public void sendEmail(UserRegisterEvent event) {        System.out.println("邮件服务接到通知,正在发送邮件...邮箱:" + event.getUsername());        // 发送邮件的逻辑          }}

以上我们就实现了对事件的发布与订阅功能。DDH28资讯网——每日最新资讯28at.com

本文主要探讨事件驱动架构下的事件发布与订阅机制。讨论包含设计事件、发布者、订阅者、消息通道,以及保障消息准确传递,处理消费问题,维持消费顺序,对复杂系统的管理。重点在于构建一个高效、可靠且能处理复杂场景的事件驱动系统。DDH28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-81872-0.htmlSpringboot 3.1.x: 快速掌握事件驱动的实用技巧

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: promise(A).catch(f1).then(f2),f1执行后f2会执行吗,为什么?

下一篇: 实战:如何优雅的从 Skywalking 切换到 OpenTelemetry

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 一年经验在二线城市面试后端的经验分享

    一年经验在二线城市面试后端的经验分享

    忠告这篇文章只适合2年内工作经验、甚至没有工作经验的朋友阅读。如果你是2年以上工作经验,请果断划走,对你没啥帮助~主人公这篇文章内容来自 「升职加薪」星球星友 的投稿,坐
  • 企业采用CRM系统的11个好处

    企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 虚拟键盘 API 的妙用

    虚拟键盘 API 的妙用

    你是否在遇到过这样的问题:移动设备上有一个固定元素,当激活虚拟键盘时,该元素被隐藏在了键盘下方?多年来,这一直是 Web 上的默认行为,在本文中,我们将探讨这个问题、为什么会发生
  • 从零到英雄:高并发与性能优化的神奇之旅

    从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • 本地生活这块肥肉,拼多多也想吃一口

    本地生活这块肥肉,拼多多也想吃一口

    出品/壹览商业 作者/李彦编辑/木鱼拼多多也看上本地生活这块蛋糕了。近期,拼多多在App首页“充值中心”入口上线了本机生活界面。壹览商业发现,该界面目前主要
  • AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    AI芯片初创公司Tenstorrent获三星和现代1亿美元投资

    Tenstorrent是一家由芯片行业资深人士Jim Keller领导的加拿大初创公司,专注于开发人工智能芯片,该公司周三表示,已经从现代汽车集团和三星投资基金等
  • 世界人工智能大会国际日开幕式活动在世博展览馆开启

    世界人工智能大会国际日开幕式活动在世博展览馆开启

    30日上午,世界人工智能大会国际日开幕式活动在世博展览馆开启,聚集国际城市代表、重量级院士专家、国际创新企业代表,共同打造人工智能交流平台。上海市副市
Top