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

【后端】Easy Rules 进阶:基于注解与工厂模式打造动态规则编排系统

1. Easy Rules 核心机制解析在业务系统开发中我们经常遇到需要处理复杂业务规则的场景。传统的硬编码方式会让代码变得臃肿且难以维护而Easy Rules提供了一种优雅的解决方案。它的核心思想是将业务规则从主流程中解耦通过声明式的方式定义规则让系统具备动态调整能力。Easy Rules的核心组件包括四个关键注解Rule标识一个具体的业务规则类Condition定义规则触发条件的方法Action定义条件满足时执行的操作Priority设置规则执行的优先级这种设计模式带来的最大优势是业务规则可以独立开发、测试和部署。我在实际项目中遇到过这样的场景一个电商平台的优惠券系统需要支持数十种优惠规则使用Easy Rules后每新增一种优惠方式只需添加一个新的规则类完全不用修改主流程代码。2. 注解驱动规则工厂设计2.1 自定义注解实现要实现规则的动态发现和加载我们首先需要设计一个自定义注解AutoCreate。这个注解需要包含三个关键属性Retention(RetentionPolicy.RUNTIME) Target(ElementType.TYPE) public interface AutoCreate { String[] value(); // 业务类型标识 String[] sign() default {}; // 规则标签分类 boolean isSingleton() default false; // 是否单例模式 }这个设计有几个巧妙之处value属性支持多个业务类型标识使得一个规则可以复用于多个业务场景sign属性提供了二级分类维度可以实现更精细的规则筛选isSingleton控制规则实例的创建方式对于无状态的规则可以使用单例模式提升性能2.2 工厂模式实现AutoCreateFactory是这个架构的核心它负责自动扫描和创建带有AutoCreate注解的规则实例。工厂的实现需要考虑几个关键点类加载机制需要扫描指定包路径下的所有类找出带有AutoCreate注解的规则实现缓存管理对已加载的规则进行缓存避免重复反射创建对象的开销线程安全工厂需要支持多线程环境下的并发访问public class AutoCreateFactory { private static final MapString, MapString, MapString, SetSupplier? classCache new ConcurrentHashMap(); public static T ListT getInstanceList(ClassT clazz, String type, String... signs) { // 实现逻辑... } private static void initCache(String packageName, Class? clazz) { // 扫描包路径并初始化缓存 } }我在一个金融风控项目中应用这种设计时发现规则的加载速度提升了3倍以上这得益于良好的缓存设计和避免重复反射。3. Spring Boot集成实践3.1 规则引擎配置在Spring Boot中集成Easy Rules需要合理配置规则引擎参数。根据我的经验以下配置适用于大多数场景Configuration public class RulesEngineConfig { Bean public RulesEngine rulesEngine() { RulesEngineParameters parameters new RulesEngineParameters() .skipOnFirstAppliedRule(false) .skipOnFirstFailedRule(true) .skipOnFirstNonTriggeredRule(true); return new DefaultRulesEngine(parameters); } }这些参数的含义是skipOnFirstAppliedRule(false)即使有规则被应用也继续检查后续规则skipOnFirstFailedRule(true)当有规则执行失败时跳过后续规则skipOnFirstNonTriggeredRule(true)当有规则条件不满足时跳过后续规则3.2 规则执行流程一个完整的规则执行流程通常包含以下步骤根据业务类型和标签获取适用的规则列表准备执行上下文(Facts对象)调用规则引擎执行规则处理执行结果Service public class RuleExecutionService { Autowired private RulesEngine rulesEngine; public Object executeRules(String bizType, String[] tags, MapString, Object params) { // 1. 获取规则列表 ListRule rules AutoCreateFactory.getInstanceList( Rule.class, bizType, tags); // 2. 准备上下文 Facts facts new Facts(); facts.putAll(params); // 3. 执行规则 Rules ruleSet new Rules(); rules.forEach(ruleSet::register); rulesEngine.fire(ruleSet, facts); // 4. 返回结果 return facts.get(RESULT); } }4. 动态规则编排实战4.1 审批流场景实现考虑一个多级审批的场景不同级别的审批可能需要不同的规则组合。我们可以这样设计AutoCreate(value APPROVAL, sign {LEVEL1, BASIC}) Rule(name DepartmentApproval, description 部门审批规则) public class DepartmentApprovalRule { Condition public boolean condition(Facts facts) { return LEVEL1.equals(facts.get(approvalLevel)); } Action public void action(Facts facts) { // 部门审批逻辑 } } AutoCreate(value APPROVAL, sign {LEVEL2, BASIC}) Rule(name FinanceApproval, description 财务审批规则) public class FinanceApprovalRule { Condition public boolean condition(Facts facts) { return LEVEL2.equals(facts.get(approvalLevel)) facts.get(amount) 10000; } Action public void action(Facts facts) { // 财务审批逻辑 } }4.2 规则动态调整这套架构最大的优势是支持规则的动态调整。当需要新增审批规则时只需创建一个新的规则类并添加AutoCreate注解指定适当的value和sign属性部署到运行环境系统会自动发现新规则并在下次执行时纳入考量完全不需要重启服务或修改现有代码。我在实际项目中验证过这种设计可以支持业务规则的小时级更新大大提升了系统的灵活性。5. 性能优化与最佳实践5.1 缓存策略优化规则工厂的缓存设计直接影响系统性能。经过多次实践我总结了以下优化经验对于无状态的规则设置isSingletontrue可以显著减少对象创建开销使用多级缓存结构第一层按业务类型分类第二层按标签分类考虑实现缓存的热更新机制当规则变更时能自动刷新缓存private static void refreshCache(String packageName, Class? clazz) { // 异步刷新缓存 CompletableFuture.runAsync(() - { MapString, MapString, SetSupplier? newCache scanAndBuildCache(packageName, clazz); classCache.put(buildCacheKey(packageName, clazz), newCache); }); }5.2 监控与调试在复杂的规则系统中良好的监控至关重要。我通常会添加以下监控点规则执行耗时统计规则触发频率监控规则执行异常捕获规则匹配命中率public class MonitoredRulesEngine extends DefaultRulesEngine { Override public void fire(Rules rules, Facts facts) { long start System.currentTimeMillis(); try { super.fire(rules, facts); monitor.recordSuccess(rules.size()); } catch (Exception e) { monitor.recordError(e); throw e; } finally { monitor.recordDuration(System.currentTimeMillis() - start); } } }6. 复杂场景解决方案6.1 规则依赖处理有时规则之间可能存在依赖关系。我通常采用两种解决方案通过Facts对象传递数据前一个规则的输出作为后一个规则的输入使用规则优先级控制执行顺序依赖方规则设置更高的优先级值AutoCreate(value RISK_CONTROL, sign {STEP1}) Rule(priority 100) public class Step1Rule { Action public void action(Facts facts) { // 处理并生成中间结果 facts.put(STEP1_RESULT, process()); } } AutoCreate(value RISK_CONTROL, sign {STEP2}) Rule(priority 200) public class Step2Rule { Condition public boolean condition(Facts facts) { return facts.get(STEP1_RESULT) ! null; } Action public void action(Facts facts) { // 使用STEP1的结果继续处理 } }6.2 规则版本管理在生产环境中可能需要同时维护多个版本的规则。我建议的解决方案是在value或sign属性中加入版本标识使用不同的包路径隔离不同版本的规则通过工厂方法的sign参数指定需要加载的版本AutoCreate(value V2_LOAN_APPROVAL, sign {RISK_CHECK}) Rule(name NewRiskRule) public class NewRiskRule implements Rule { // 新版本的规则实现 } // 使用时明确指定版本 ListRule rules AutoCreateFactory.getInstanceList( Rule.class, V2_LOAN_APPROVAL, RISK_CHECK);这套基于注解和工厂模式的动态规则编排系统经过我在多个金融和电商项目中的实践验证能够很好地平衡灵活性和性能需求。特别是在业务规则频繁变更的场景下可以大幅降低维护成本提升系统的可扩展性。

相关文章:

【后端】Easy Rules 进阶:基于注解与工厂模式打造动态规则编排系统

1. Easy Rules 核心机制解析 在业务系统开发中,我们经常遇到需要处理复杂业务规则的场景。传统的硬编码方式会让代码变得臃肿且难以维护,而Easy Rules提供了一种优雅的解决方案。它的核心思想是将业务规则从主流程中解耦,通过声明式的方式定义…...

如何在Windows上轻松完成Android刷机:FastbootEnhance终极指南

如何在Windows上轻松完成Android刷机:FastbootEnhance终极指南 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance 还在为复杂的Android刷…...

别再为Carla找模型发愁了!手把手教你用Blender 3.0+UE4插件自制专属车辆(附完整FBX导出避坑指南)

从零打造Carla仿真专属车辆:Blender 3.0与UE4插件全流程实战 在自动驾驶仿真领域,Carla凭借其开源特性和逼真的物理引擎已成为行业标杆工具。但许多开发者都会遇到一个共同困境:官方提供的车辆模型库无法满足特定需求,无论是特种工…...

思源宋体终极指南:7种免费商用字体助你提升设计品质

思源宋体终极指南:7种免费商用字体助你提升设计品质 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 还在为商业项目寻找高质量中文字体而烦恼吗?思源宋体这款由…...

用Python+OpenCV实现双目深度估计:从标定到3D重建全流程踩坑记录

用PythonOpenCV实现双目深度估计:从标定到3D重建全流程实战指南 当你第一次尝试用双目相机生成三维点云时,是否遇到过这些问题:标定误差导致深度图出现断层?弱纹理区域匹配结果一片模糊?视差图转点云时坐标错乱&#x…...

移动神器RAX3000M路由器变身家庭云之八:解锁无线打印,低成本打造全屋打印中心

1. 为什么需要无线打印解决方案 家里那台老打印机是不是经常让你头疼?明明打印效果还不错,但每次都要用USB线连接电脑才能打印,手机里的文件想打印更是麻烦。我家里就有一台Brother DCP-7055,用了十多年依然坚挺,但每次…...

构建高效BitTorrent网络:trackerslist项目技术解析与应用指南

构建高效BitTorrent网络:trackerslist项目技术解析与应用指南 【免费下载链接】trackerslist Updated list of public BitTorrent trackers 项目地址: https://gitcode.com/GitHub_Trending/tr/trackerslist 在分布式文件共享技术领域,BitTorrent…...

在PyTorch 2.8 环境中运行MATLAB引擎:混合编程实现算法验证

在PyTorch 2.8环境中运行MATLAB引擎:混合编程实现算法验证 1. 引言:当深度学习遇上工程计算 想象一下这个场景:你正在用PyTorch开发一个深度学习模型,需要对输入信号进行复杂的滤波处理,或者要对模型输出进行精细的控…...

【Calcite 系列】深入理解 Calcite 的 AggregateRemoveRule

AggregateRemoveRule 用来删掉“其实已经没有必要存在”的 Aggregate。它成立的前提是:输入在当前 group key 上已经唯一,而且所有聚合调用都可以被化成单行表达式或常量。本文结合源码实现,分析这条规则为什么能把 SUM(x) 退化成 x&#xff…...

探索数据中的数学之美:PySR符号回归工具让复杂规律触手可及

探索数据中的数学之美:PySR符号回归工具让复杂规律触手可及 【免费下载链接】PySR High-Performance Symbolic Regression in Python and Julia 项目地址: https://gitcode.com/gh_mirrors/py/PySR 你是否曾面对海量数据却难以理解其中的内在规律&#xff1f…...

华三交换机端口隔离配置(VLAN内二层互访隔离)

一、前言 华三(H3C)交换机的端口隔离是一种关键的二层端口级控制技术,它能在同一 VLAN 内部实现端口间的二层互访隔离,有效抑制广播风暴、提升网络安全与用户隔离性。 核心原理是将指定端口加入隔离组,组内端…...

别再手动轮询了!用FreeRTOS二值信号量搞定STM32串口DMA接收(附完整工程)

彻底告别轮询!FreeRTOS二值信号量在STM32串口DMA接收中的实战指南 嵌入式开发中,串口通信是最基础却又最让人头疼的环节之一。想象一下这样的场景:你的户外GPS设备正在通过串口接收定位数据,这些数据包长度不定、间隔随机&#xf…...

三步彻底告别Windows和Office激活烦恼:KMS_VL_ALL_AIO实战全解析

三步彻底告别Windows和Office激活烦恼:KMS_VL_ALL_AIO实战全解析 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 周五下午4点,IT部门的小王接到第7个求助电话——市场部同…...

C语言笔记6:变量生命周期、指针与数组指针全解析

#本篇博客基于C语言学习这两天核心笔记整理,聚焦变量生命周期与存储类型、指针基础与用法、数组与指针深度结合三大模块,从基础概念到代码实战,帮你彻底吃透C语言核心难点。一、变量生命周期与存储类型 1. 核心概念 生命周期:变量…...

kill-doc:你的文档下载终极解决方案,告别繁琐操作只需3步

kill-doc:你的文档下载终极解决方案,告别繁琐操作只需3步 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该…...

在Blender中实现3MF格式的终极导入导出:5分钟快速上手指南

在Blender中实现3MF格式的终极导入导出:5分钟快速上手指南 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 想要在Blender中无缝处理3D打印专用的3MF文件格式吗…...

FireRedASR-AED-L实现Python语音识别:从音频到文本的完整教程

FireRedASR-AED-L实现Python语音识别:从音频到文本的完整教程 1. 引言 语音识别技术正在改变我们与设备交互的方式,从智能助手到实时字幕,这项技术已经深入到日常生活的方方面面。今天我要介绍的FireRedASR-AED-L,是一个专门为中…...

GCC源码深度分析:从设计哲学到工程实践

一、设计原理与哲学1.1 三段式架构的哲学基础GCC(GNU Compiler Collection)的设计核心是三段式架构,这一设计哲学源于编译器理论中的经典分离原则。GCC将编译过程清晰地划分为前端、中端和后端三个逻辑部分,每个部分专注于特定的任…...

智能制造工业互联网工业大数据建设方案:工业大数据架构、工业大数据建模、关键应用场景、平台架构、全生命周期服务、管理与应用体系

本方案围绕工业4.0,构建“云、移、物、大、智”融合的工业大数据平台,实现数据采集、数据湖分析与机器学习建模,支撑预测性维修、生产过程优化、人机协同等应用,助力企业提升效率、降低运营成本,推动智能制造转型。 工…...

不用等IT排期:ChatBI如何让业务人员1分钟拿到业务洞察

开篇:3个业务人员天天遇到的取数难题难题一: 运营团队要复盘上周的大促返场活动效果—— 需要查新客转化率、客单价、渠道ROI等12个核心指标。 提交IT取数工单,排期要3天。 等数据出来的时候,下一轮投放的预算已经审批完了——错过…...

Windows Defender永久禁用终极方案:defender-control开源工具深度解析

Windows Defender永久禁用终极方案:defender-control开源工具深度解析 【免费下载链接】defender-control An open-source windows defender manager. Now you can disable windows defender permanently. 项目地址: https://gitcode.com/gh_mirrors/de/defender…...

动态规划之【树形DP】第4课:树形DP应用案例实践3

动态规划之【树形DP】第4课:树形DP应用案例实践3 选课 题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学…...

基于AI+场景的数据安全管理平台建设方案:AI技术发展趋势与数据安全结合、AI+场景数据安全管理平台、AI+场景应用实践

该方案以AI技术为核心驱动力,围绕数据资产发现、事件分析、风险评估、策略处置等关键环节,构建了动态、智能的数据安全管理平台。通过自然语言处理、机器学习、深度学习、集成学习等技术,有效提升了敏感数据识别、异常行为检测、风险评估的准…...

10分钟快速上手:一站式AI变声神器RVC全平台部署终极指南

10分钟快速上手&#xff1a;一站式AI变声神器RVC全平台部署终极指南 【免费下载链接】Retrieval-based-Voice-Conversion-WebUI Easily train a good VC model with voice data < 10 mins! 项目地址: https://gitcode.com/GitHub_Trending/re/Retrieval-based-Voice-Conve…...

[RKNN] 零拷贝接口:从原理到实践的性能优化指南

1. 为什么需要零拷贝接口 第一次接触RKNN零拷贝接口时&#xff0c;我正为一个智能摄像头项目焦头烂额。当时用通用接口跑YOLOv5模型&#xff0c;帧率始终卡在15FPS上不去。直到把代码改成零拷贝版本&#xff0c;帧率直接飙到28FPS——这个性能提升让我彻底理解了零拷贝的价值。…...

gte-base-zh模型服务治理:Xinference多租户隔离与资源配额控制实践

gte-base-zh模型服务治理&#xff1a;Xinference多租户隔离与资源配额控制实践 1. 项目背景与需求场景 在实际的企业级AI应用部署中&#xff0c;我们经常面临这样的挑战&#xff1a;多个团队或项目需要共享同一个模型服务&#xff0c;但各自有不同的资源需求和隔离要求。传统…...

终极指南:RePKG - Wallpaper Engine资源提取与纹理转换的完整解决方案

终极指南&#xff1a;RePKG - Wallpaper Engine资源提取与纹理转换的完整解决方案 【免费下载链接】repkg Wallpaper engine PKG extractor/TEX to image converter 项目地址: https://gitcode.com/gh_mirrors/re/repkg RePKG是一款专为Wallpaper Engine设计的开源命令行…...

不止写文章!用Gutenberg区块编辑器5分钟打造高转化落地页(实战案例)

用Gutenberg区块编辑器5分钟打造高转化落地页&#xff08;实战指南&#xff09; 在数字营销领域&#xff0c;落地页的转化率直接影响业务成败。传统建站工具要么过于复杂&#xff08;如Elementor、Divi&#xff09;&#xff0c;要么功能受限&#xff08;如经典编辑器&#xff0…...

Vision Master 视觉软件应用-字符识别

我们读取如上字符串&#xff0c;需要的算子如下【字符识别算子】图像源--高精度匹配--位置修正--字符识别--格式化【操作】【高精度匹配】基本参数特征模板【位置修正】---点击执行---创建基准---点击执行【字符串识别】***基本参数***选择绘制---选择搜索范围****运行参数***【…...

3分钟极速上手:网盘下载加速神器全功能使用指南

3分钟极速上手&#xff1a;网盘下载加速神器全功能使用指南 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 &#xff0c;支持 百度网盘 / 阿里云盘 / 中国移动云盘 / 天翼云盘 /…...