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

轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal

在现代企业级应用中,事件驱动架构(EDA)已成为解耦系统、提升扩展性的利器。今天给大家推荐一个非常优秀的国产轻量级事件驱动框架 —— Hibiscus Signal,它不仅天然整合 Spring Boot,还提供完整的事件生命周期支持,是替代原生 ApplicationEvent 和简化异步逻辑的不二之选。


一、为什么选择 Hibiscus Signal?

相比 Spring 原生事件模型(如 ApplicationEventPublisher)使用麻烦、缺乏链式控制,Hibiscus Signal 提供了以下核心优势

特性说明
注解驱动使用 @SignalEmitter@SignalHandler 快速标记事件
拦截器链在事件发出前/后执行拦截逻辑(如日志、权限)
过滤器链控制事件是否传播
转换器链动态修改事件参数(如数据脱敏)
上下文共享SignalContext 实现跨组件数据传递
异步处理内置线程池 + 自定义执行器
指标统计实时掌握事件执行情况
Spring 完美集成自动注册 + 注解配置,无侵入接入


二、如何快速上手?

1. 添加依赖

在你的 Spring Boot 项目中引入 Maven 依赖:

<dependency><groupId>io.github.heathcetide</groupId><artifactId>cetide.hibiscus.signal</artifactId><version>1.0.4</version>
</dependency>

2. 发出一个信号事件

@RestController
public class AuthController {@PostMapping("/login")@SignalEmitter("user.login") // 标记为事件发射器public String login(@RequestBody LoginRequest request, HttpServletRequest httpRequest) {User user = doLogin(request); // 登录逻辑SignalContextCollector.collect("user", user);SignalContextCollector.collect("request", httpRequest);return "JWT-TOKEN";}
}

3. 监听事件并处理

@Component
public class UserEventHandler {@SignalHandler(value = "user.login",target = UserEventHandler.class,methodName = "handleLogin",async = true)public void handleLogin(SignalContext context) {User user = (User) context.getIntermediateValues().get("user");// 发送欢迎邮件 / 记录登录日志log.info("欢迎用户 {} 登录系统", user.getUsername());}
}

三、进阶用法:拦截器 + 过滤器 + 转换器

拦截器:登录前记录操作日志

@Component
@SignalInterceptorBind({"user.login", "user.logout"})
public class AuditInterceptor implements SignalInterceptor {@Overridepublic boolean beforeHandle(String event, Object sender, Object... params) {SignalContext context = (SignalContext) params[0];HttpServletRequest request = (HttpServletRequest) context.getIntermediateValues().get("request");log.info("用户操作事件: {} from IP: {}", event, request.getRemoteAddr());return true; // 返回 false 则阻止传播}
}

过滤器:权限校验

@Component
@SignalFilterBind("secure.*")
public class SecurityFilter implements SignalFilter {@Overridepublic boolean filter(String event, Object sender, Object... params) {SignalContext context = (SignalContext) params[0];return checkPermission(context.getAttributes()); // true=允许,false=阻止}
}

转换器:脱敏数据

@Component
@SignalTransformerBind("user.*")
public class DataMaskTransformer implements SignalTransformer {@Overridepublic Object[] transform(String event, Object sender, Object... params) {User user = (User) params[0];user.setPassword("******"); // 脱敏return new Object[]{user};}
}

四、自定义线程池支持

为了让异步事件更高效可控,框架支持配置线程池:

@Configuration
public class SignalExecutorConfig {@Bean("signalExecutor")public ExecutorService signalExecutor() {return new ThreadPoolExecutor(4, 8, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(200),new ThreadFactoryBuilder().setNameFormat("signal-pool-%d").build());}
}


五、实时监控事件执行情况

你还可以随时查看事件的执行次数、失败率等指标:

@Autowired
private Signals signals;public void printStats() {Map<String, Map<String, Object>> metrics = signals.getMetrics().getAllMetrics();metrics.forEach((event, stats) -> {System.out.println(event + " 执行次数: " + stats.get("emitCount"));});
}

六、版本更新日志(部分节选)

  • v1.0.4:支持注解自动注册组件(拦截器、过滤器、转换器)

  • v1.0.3:增加上下文收集器,解决早期 null 问题

  • v1.0.2:引入全生命周期管理、优先级控制

  • v1.0.1:基础 API 搭建,支持异步、同步事件流


七、总结

Hibiscus Signal 是一个对开发者非常友好的事件处理框架,真正做到了:

  • 使用简单:几行注解就能完成复杂事件流

  • 功能强大:支持完整的事件管道(拦截/过滤/转换/回调)

  • 与 Spring 深度融合:无缝集成,无学习成本

  • 轻量灵活:没有复杂依赖,适合中小项目和大型平台


项目地址

项目已开源,欢迎大家试用、Star、提 issue:

GitHub:GitHub - heathcetide/hibiscus-signal: Hibiscus Signal - Hibiscus Signal is a robust event-driven system designed to manage signals, events, and handlers in a highly flexible and scalable way. process events asynchronously or synchronously, and manage event-based workflows with advanced features such as interceptors, filters, transformers, and metrics collection.
Maven:查看中央仓库


如果你也在用 Spring 构建分层架构、做用户行为追踪、审计日志、领域事件等,强烈推荐你尝试下 Hibiscus Signal

一行注解,开启优雅事件世界。

相关文章:

轻量、优雅、高扩展的事件驱动框架——Hibiscus-Signal

在现代企业级应用中&#xff0c;事件驱动架构&#xff08;EDA&#xff09;已成为解耦系统、提升扩展性的利器。今天给大家推荐一个非常优秀的国产轻量级事件驱动框架 —— Hibiscus Signal&#xff0c;它不仅天然整合 Spring Boot&#xff0c;还提供完整的事件生命周期支持&…...

SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据

在搜索引擎算法日益复杂的今天&#xff0c;B2C商城想要在海量信息中脱颖而出&#xff0c;仅靠优质商品和营销活动远远不够。ZKmall模板商城以实战为导向&#xff0c;通过URL 重构与结构化数据优化两大核心策略&#xff0c;帮助 B2C 商城实现从底层架构到搜索展示的全面升级&…...

2020CCPC河南省赛题解

A. 班委竞选 签到题&#xff0c;模拟。 #include <bits/stdc.h> #define x first #define y second #define int long long //#define double long doubleusing namespace std; typedef unsigned long long ULL ; typedef pair<int,int> PII ; typedef pair<d…...

数字万用表与指针万用表使用方法及注意事项

在电子测量领域&#xff0c;万用表是极为常用的工具&#xff0c;数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项&#xff0c;能确保测量的准确性与安全性。下面为您详细介绍&#xff1a; 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […...

虚拟主播肖像权保护,数字时代的法律博弈

首席数据官高鹏律师团队 在虚拟主播行业蓬勃发展的表象之下&#xff0c;潜藏着一场关乎法律边界的隐形战争。当一位虚拟偶像的3D模型被非法拆解、面部数据被批量复制&#xff0c;运营方惊讶地发现——传统的肖像权保护体系&#xff0c;竟难以完全覆盖这具由代码与数据构成的“…...

【读代码】端到端多模态语言模型Ultravox深度解析

一、项目基本介绍 Ultravox是由Fixie AI团队开发的开源多模态大语言模型,专注于实现音频-文本的端到端实时交互。项目基于Llama 3、Mistral等开源模型,通过创新的跨模态投影架构,绕过了传统语音识别(ASR)的中间步骤,可直接将音频特征映射到语言模型的高维空间。 核心优…...

RabbitMQ工作流程及使用方法

一、什么是RabbitMQ RabbitMQ 是一款基于 ‌AMQP&#xff08;高级&#xff0c;消息队列协议&#xff09;‌ 的开源消息中间件&#xff0c;专为分布式系统设计&#xff0c;用于实现应用程序间的异步通信&#xff0c;其核心功能是通过 ‌消息代理&#xff08;Message Broker&…...

Java 面向对象进阶:解锁多态、内部类与包管理

Java 面向对象进阶&#xff1a;解锁多态、内部类与包管理 &#x1f511; 在 Java 的面向对象编程中&#xff0c;多态赋予了对象“多种形态”的能力&#xff0c;内部类提供了更精细的代码组织方式&#xff0c;而包则帮助我们管理和组织大量的类。今天&#xff0c;我们将深入探讨…...

算法:分治法

实验内容 在一个2kⅹ2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&#xff0c;则称该方格为特殊方格&#xff0c;且称该棋盘为一特殊棋盘。 显然&#xff0c;特殊方格出现的位置有4k 种情况&#xff0c;即k>0,有4k 种不同的特殊棋盘 棋盘覆盖&#xff1a…...

MySQL初阶:sql事务和索引

索引&#xff08;index&#xff09; 可以类似理解为一本书的目录&#xff0c;一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过&#xff1a; 1.先遍历表 2.将条件带入每行记录中进行判断&#xff0c;看是否符合 3.不符合就跳过 但当表中的…...

docker部署第一个Go项目

1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …...

day27 python 装饰器

目录 一、装饰器的基本概念 示例&#xff1a;用装饰器优化质数查找函数 二、装饰器的高级用法 1. 支持任意参数的装饰器 2. 装饰器的返回值处理 在 Python 编程中&#xff0c;装饰器是一个非常强大的功能&#xff0c;它可以让其他函数或方法在不需要做任何代码修改的前提下…...

Visual Studio2022跨平台Avalonia开发搭建

由于我已经下载并安装了 VS2022版本&#xff0c;这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 ‌“.NET 桌面开发”‌ 和“Visual Studio扩展开发”‌ &#xff0c;这里由于不是用的微软的MAUI&#xff0c;所以不用选择其他的来支持跨平台开发&a…...

css iconfont图标样式修改,js 点击后更改样式

背景&#xff1a; 在vue项目中&#xff0c;通过点击/鼠标覆盖&#xff0c;更改选中元素的样式&#xff0c;可以通过js逻辑&#xff0c;也可以根据css样式修改。包括以下内容&#xff1a;iconfont图标的引入以及使用&#xff0c;iconfont图标样式修改【导入文件是纯白&#xff0…...

开源项目实战学习之YOLO11:12.4 ultralytics-models-sam-memory_attention.py源码分析

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-memory_attention.pyblocks.py: 定义模…...

【沉浸式求职学习day42】【算法题:滑动窗口】

沉浸式求职学习 长度最小的子数组水果成篮 关于算法题&#xff1a;滑动窗口的几个题目 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组…...

LIIGO ❤️ RUST 12 YEARS

LIIGO &#x1f496; RUST 12 YEARS 今天是RUST语言1.0发布十周年纪念日。十年前的今天&#xff0c;2015年的今天&#xff0c;Rust 1.0 正式发行。这是值得全球Rust支持者隆重纪念的日子。我借此机会衷心感谢Rust语言创始人Graydon Hoare&#xff0c;Mozilla公司&#xff0c;以…...

Linux基础开发工具二(gcc/g++,自动化构建makefile)

3. 编译器gcc/g 3.1 背景知识 1. 预处理&#xff08;进行宏替换/去注释/条件编译/头文件展开等) 2. 编译&#xff08;生成汇编) 3. 汇编&#xff08;生成机器可识别代码&#xff09; 4. 连接&#xff08;生成可执行文件或库文件) 3.2 gcc编译选项 格式 &#xff1a; gcc …...

Linux zip、unzip 压缩和解压

zip 命令用于压缩文件&#xff0c;压缩后的文件后缀名为 .zip 。 对应的解压命令是 unzip 。 测试用的目录结构如下&#xff0c; userzn:~/test$ tree . ├── folder1 │ ├── folder111 │ │ └── file1.txt │ └── main1.c ├── folder2 │ ├── …...

muduo库TcpConnection模块详解——C++

muduo库中的TcpConnection模块详解 TcpConnection是muduo库中处理TCP连接的核心模块&#xff0c;负责管理单个TCP连接的生命周期、数据读写、状态转换以及事件回调。每个TCP连接对应一个TcpConnection对象&#xff0c;其设计体现了高性能、线程安全和灵活回调的特点。 一、核心…...

Node.js 源码架构详解

Node.js 的源码是一个庞大且复杂的项目&#xff0c;它主要由 C 和 JavaScript 构成。要完全理解每一部分需要大量的时间和精力。我会给你一个高层次的概述&#xff0c;并指出一些关键的目录和组件&#xff0c;帮助你开始探索。 Node.js 的核心架构 Node.js 的核心可以概括为以…...

全局异常处理:如何优雅地统一管理业务异常

在软件开发中&#xff0c;异常处理是保证系统健壮性的重要环节。一个良好的异常处理机制不仅能提高代码的可维护性&#xff0c;还能为使用者提供清晰的错误反馈。本文将介绍如何通过全局异常处理和业务异常统一处理来编写更加优雅的代码。 一、传统异常处理的痛点 1.1 典型问…...

分布式锁: Redis和ZooKeeper两种分布式锁对比

在分布式系统中&#xff0c;分布式锁是协调多节点共享资源访问的核心机制。Redis 和 ZooKeeper 是两种常用的分布式锁实现方案&#xff0c;但两者的设计理念、适用场景和优缺点存在显著差异。本文将从 一致性模型、性能、可靠性、实现原理 等维度进行对比&#xff0c;并提供技术…...

动态规划-LCR 166.珠宝的最大价值-力扣(LeetCode)

一、题目解析 frame二维矩阵中每个值代表珠宝的价值&#xff0c;现在从左上角开始拿珠宝&#xff0c;只能向右或向下拿珠宝&#xff0c;到达右下角时停止拿珠宝&#xff0c;要求拿的珠宝价值最大。 二、算法解析 1.状态表示 我们想要知道的是到达[i,j]为位置时的最大价值&am…...

JDBC实现模糊、动态与分页查询的详解

文章目录 一. 模糊查询1. Mysql的写法2. JDBC的实现 二. 动态条件查询1. 创建生成动态条件查询sql的方法2. 完整的动态条件查询类以及测试类 三. 分页查询1. 什么是分页查询&#xff1f;2. 分页查询的分类3. MySQL的实现4. JDBC实现4.1. 创建page页4.2. 分页的实现 本章来讲一下…...

域环境信息收集技术详解:从基础命令到实战应用

引言 在企业网络环境中&#xff0c;Active Directory (AD)域服务是微软提供的集中式目录服务&#xff0c;用于管理网络中的用户、计算机和其他资源。对于信息安全专业人员来说&#xff0c;熟练掌握域环境信息收集技术至关重要&#xff0c;无论是进行渗透测试、安全评估还是日常…...

nodejs特性解读

单线程和事件驱动架构 参考 程序员dd-事件驱动架构 it-老齐-事件驱动架构 总结...

【C++ Qt】布局管理器

每日激励&#xff1a;“不设限和自我肯定的心态&#xff1a;I can do all things。 — Stephen Curry” &#x1f914;绪论​&#xff1a; 在Qt开发中&#xff0c;界面布局的合理设计是提升用户体验的关键。早期&#xff0c;开发者常采用绝对定位的方式摆放控件&#xff0c;即通…...

vscode用python开发maya联动调试设置

如何在VScode里编写Maya Python脚本_哔哩哔哩_bilibili1 包括1&#xff0c;maya的python全面在vscode支持&#xff0c;2&#xff0c;通过mayacode发送到maya&#xff0c;3同步调试 import maya.cmds as cmds 1、让 maya.cmds编译通过 下载Autodesk_Maya_2018_6_Update_DEVK…...

SLAM定位常用地图对比示例

序号 地图类型 概述 1 格栅地图 将现实环境栅格化,每一个栅格用 0 和 1 分别表示空闲和占据状态,初始化为未知状态 0.5 2 特征地图 以点、线、面等几何特征来描绘周围环境,将采集的信息进行筛选和提取得到关键几何特征 3 拓扑地图 将重要部分抽象为地图,使用简单的图形表示…...