轻量、优雅、高扩展的事件驱动框架——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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906033.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

集合-进阶

Collection collection的遍历方式 迭代器遍历 不依赖索引 import java.util.ArrayList; import java.util.Collection; import java.util.Iterator;public class mycollection {public static void main(String[] args) {//1.创建集合并添加元素Collection<String> co…

【八股战神篇】Java集合高频面试题

专栏简介 八股战神篇专栏是基于各平台共上千篇面经&#xff0c;上万道面试题&#xff0c;进行综合排序提炼出排序前百的高频面试题&#xff0c;并对这些高频八股进行关联分析&#xff0c;将每个高频面试题可能进行延伸的题目再次进行排序选出高频延伸八股题。面试官都是以点破…

Android之横向滑动列表

文章目录 前言一、效果图二、使用步骤1.xml布局2.代码3.HomeHxBean3.adapter4.item布局5.两个drawable 总结 前言 横向滑动列表有多种实现方式&#xff0c;也可以用tablayout&#xff0c;也可以用recyclerview&#xff0c;今天主要介绍recyclerview。 一、效果图 二、使用步骤…

关于物联网的基础知识(二)——物联网体系结构分层

成长路上不孤单&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a;&#x1f60a; 【14后&#x1f60a;///计算机爱好者&#x1f60a;///持续分享所学&#x1f60a;///如有需要欢迎收藏转发///&#x1f60a;】 今日分享关于物联网的基础知识&#xff08;二&a…

【机器人】复现 WMNav 具身导航 | 将VLM集成到世界模型中

WMNav 是由VLM视觉语言模型驱动的&#xff0c;基于世界模型的对象目标导航框架。 设计一种预测环境状态的记忆策略&#xff0c;采用在线好奇心价值图来量化存储&#xff0c;目标在世界模型预测的各种场景中出现的可能性。 本文分享WMNav复现和模型推理的过程&#xff5e; 下…

英语学习5.17

attract &#x1f449; 前缀&#xff1a;at-&#xff08;朝向&#xff09; &#x1f449; 含义&#xff1a;吸引&#xff08;朝某处拉&#xff09; 例句&#xff1a;The flowers attract bees. &#xff08;花吸引蜜蜂。&#xff09; distract &#x1f449; 前缀&#xff…

【软考 McCabe度量法】

McCabe度量法&#xff08;McCabe’s Cyclomatic Complexity&#xff09;是由Thomas McCabe提出的一种用于衡量程序模块环路复杂性的软件度量方法。它通过分析代码的控制流结构来评估程序的复杂度&#xff0c;帮助开发者识别难以维护或测试风险较高的代码区域。 一、McCabe度量法…

解读 TypeScript 枚举Enum

TypeScript 枚举通过命名常量、类型安全和结构化组织&#xff0c;显著提升代码质量。使用时需根据场景选择合适的类型&#xff08;数字、字符串或常量枚举&#xff09;&#xff0c;并权衡性能与动态访问需求。掌握其特性和使用的场景&#xff0c;能在复杂项目中有效提升代码的可…

MODBUS RTU通信协议详解与调试指南

一、MODBUS RTU简介 MODBUS RTU&#xff08;Remote Terminal Unit&#xff09;是一种基于串行通信&#xff08;RS-485/RS-232&#xff09;的工业标准协议&#xff0c;采用二进制数据格式&#xff0c;具有高效、可靠的特点&#xff0c;广泛应用于PLC、传感器、变频器等工业设备…

TCP/UDP协议原理和区别 笔记

从简单到难吧 区别就是TCP一般用于安全稳定的需求&#xff0c;UDP一般用于不那么需要完全数据的需求&#xff0c;比如说直播&#xff0c;视频等。 再然后就是TPC性能慢于UDP。 再然后我们看TCP的原理&#xff08;三次握手&#xff0c;数据传输&#xff0c;四次挥手&#xff0…

Jackson使用详解

JSON Jackson是java提供处理json数据序列化和反序列的工具类&#xff0c;在使用Jackson处理json前&#xff0c;我们得先掌握json。 JSON数据类型 类型示例说明字符串&#xff08;String&#xff09;"hello"双引号包裹&#xff0c;支持转义字符&#xff08;如 \n&a…

C语言| 指针变量的定义

C语言| 指针的优点-CSDN博客 * 表示“指向”&#xff0c;为了说明指针变量和它所指向的变量之间的联系。 int * i&#xff1b;//表示指针变量i里面存放的地址&#xff0c;所指向的存储单元里的【数据】。 【指针变量的定义】 C语言规定所有变量&#xff0c;在使用前必须先定…

Java 快速转 C# 教程

以下是一个针对 Java 开发者快速转向 C# 的简明教程&#xff0c;重点对比 Java 与 C# 的异同&#xff0c;帮助你快速上手。 项目结构&#xff1a; .sln &#xff1a;解决方案文件&#xff0c;管理多个项目之间的依赖关系。.csproj &#xff1a;项目文件&#xff0c;定义目标框…

EasyExcel详解

文章目录 一、easyExcel1.什么是easyExcel2.easyExcel示例demo3.easyExcel read的底层逻辑~~4.easyExcel write的底层逻辑~~ 二、FastExcel1.为什么更换为fastExcel2.fastExcel新功能 一、easyExcel 1.什么是easyExcel 内容摘自官方&#xff1a;Java解析、生成Excel比较有名的…

jvm安全点(三)openjdk17 c++源码垃圾回收之安全点结束,唤醒线程

1. VMThread::inner_execute() - 触发安全点​​ cpp 复制 void VMThread::inner_execute(VM_Operation* op) { if (op->evaluate_at_safepoint()) { SafepointSynchronize::begin(); // 进入安全点&#xff0c;阻塞所有线程 // ...执行GC等操作... SafepointSynchronize::…

102. 二叉树的层序遍历递归法:深度优先搜索的巧妙应用

二叉树的层序遍历是一种经典的遍历方式&#xff0c;它要求按层级逐层访问二叉树的节点。通常我们会使用队列来实现层序遍历&#xff0c;但递归法也是一种可行且有趣的思路。本文将深入探讨递归法解决二叉树层序遍历的核心难点&#xff0c;并结合代码和模拟过程进行详细讲解。 …

首个窗口级无人机配送VLN系统!中科院LogisticsVLN:基于MLLM实现精准投递

导读 随着智能物流需求日益增长&#xff0c;特别是“最后一公里”配送场景的精细化&#xff0c;传统地面机器人逐渐暴露出适应性差、精度不足等瓶颈。为此&#xff0c;本文提出了LogisticsVLN系统——一个基于多模态大语言模型的无人机视觉语言导航框架&#xff0c;专为窗户级别…

WPF Datagrid 数据加载和性能

这篇文章并非讨论 WPF Datagrid 的性能数据&#xff0c;而只是简单介绍一下为了使其性能良好&#xff0c;你需要注意哪些方面。我不太想使用性能分析器来展示实际数据&#xff0c;而是尽可能地使用了 Stopwatch 类。这篇文章不会深入探讨处理海量数据的技术&#xff0c;例如分页…

matlab求矩阵的逆、行列式、秩、转置

inv - 计算矩阵的逆 用途&#xff1a;计算一个可逆矩阵的逆矩阵。 D [1, 2; 3, 4]; % 定义一个2x2矩阵 D_inv inv(D); % 计算矩阵D的逆 disp(D_inv);det - 计算矩阵的行列式 用途&#xff1a;计算方阵的行列式。 E [1, 2; 3, 4]; determinant det(E); % 计算行列式 disp…

ridecore流水线解读

文章目录 流水线stage分属前后端PCpipelineIFIDDPDP 与 SW 中间没有latchSWCOM 源码地址 流水线stage分属前后端 IF -> ID -> DP -> SW -> EX -> COM分类阶段说明前端IF指令获取阶段。PC 使用分支预测器&#xff0c;访问指令存储器。典型前端操作。前端ID解码并…