后端开发——规则引擎简介(Drools)

ops/2024/10/11 3:54:16/

目录

  • 什么是规则引擎?
  • 规则引擎带来的好处;Drools案例
  • 规则引擎的工作原理及应用场景
  • 常见的规则引擎及对比
  • 工作流引擎与规则引擎有什么不同

什么是规则引擎?

请添加图片描述

规则引擎,听起来高大上,其实可以理解为一种帮助你做“决策”的工具。你可以把它看作应用程序中的“大脑”,它可以根据一系列预先定义好的规则来处理数据并得出结论。

举个简单的例子,比如电子商务系统,其中根据客户的类型、购买的商品类别、购物总金额等条件来决定给顾客的折扣。这种判断本来可以通过大量的if-else语句来实现,但如果规则一旦变化,那修改代码就会变得非常麻烦。而引入规则引擎后,你可以把这些业务规则从代码中剥离出来,集中管理,并且可以随时更新,无需重新编写和部署应用程序。

java">// 痛点举例
public double calculateDiscount(Customer customer, List<Product> products) {double totalAmount = calculateTotal(products);double discount = 0.0;if (customer.isVip()) {if (totalAmount > 1000) {discount = 0.20; // VIP客户且总金额大于1000,打八折} else if (totalAmount > 500) {discount = 0.15; // VIP客户且总金额大于500,打八五折} else {discount = 0.10; // VIP客户其他情况,打九折}} else if (customer.isRegular()) {if (totalAmount > 1000) {discount = 0.10; // 普通客户且总金额大于1000,打九折} else if (totalAmount > 500) {discount = 0.05; // 普通客户且总金额大于500,打九五折} else {discount = 0.02; // 普通客户其他情况,打九八折}}// 根据商品种类调整折扣for (Product product : products) {if (product.getCategory().equals("Electronics")) {discount += 0.05; // 电子产品有额外5%折扣} else if (product.getCategory().equals("Groceries")) {discount -= 0.03; // 食品类没有折扣,反而略高}}return discount;
}


规则引擎带来的好处;Drools案例

规则引擎带来的好处

业务规则与系统代码分离:业务规则独立管理,不需要再把大量的逻辑写在代码里。规则变更时,直接更新规则即可,免去了重新编写和发布代码的麻烦。

快速响应需求变更:可以在不重启服务的情况下动态修改规则,实现业务规则的灵活调整。

降低维护成本:业务人员和开发人员可以分工合作,业务人员负责编写和调整规则,开发人员负责维护应用逻辑,两者不再强绑定。

减少硬编码风险:规则引擎减少了代码中的硬编码逻辑,降低了因为代码修改导致的潜在风险。


Drools案例

规则引擎通过定义规则,使用某种形式的决策表或决策树,可以避免在代码中硬编码这些逻辑。可以将上述折扣计算的逻辑重构为规则引擎的形式。以下是使用Drools(Java中常见的规则引擎)的一种简化表示:

rule "VIP客户大额折扣"when$customer : Customer(isVip() == true)$totalAmount : Double(this > 1000)then$customer.setDiscount(0.20);
endrule "VIP客户中等折扣"when$customer : Customer(isVip() == true)$totalAmount : Double(this > 500)then$customer.setDiscount(0.15);
endrule "普通客户大额折扣"when$customer : Customer(isRegular() == true)$totalAmount : Double(this > 1000)then$customer.setDiscount(0.10);
endrule "电子产品额外折扣"when$product : Product(category == "Electronics")then$product.setAdditionalDiscount(0.05);
end

请添加图片描述

请添加图片描述



规则引擎的工作原理及应用场景

简单来说,规则引擎可以分为三个步骤:

  • 数据输入:程序把要处理的数据送给规则引擎。
  • 规则匹配:规则引擎根据输入的数据,按照预定义的业务规则进行匹配。
  • 决策输出:根据规则的匹配结果,规则引擎做出决策并返回给程序。

这种方式不仅减少了硬编码的麻烦,还使得业务规则的维护更加灵活。规则引擎在很多场景中都有用武之地,特别是那些需要复杂决策和规则管理的地方。比如:

  • 金融行业:信用卡申请审批、贷款风险评估等。
  • 电商领域:促销活动规则、优惠券发放规则。
  • 保险行业:理赔审批、保费计算规则。
  • 风控系统:监控和判断用户行为,预防欺诈。

这些场景的共同特点就是:规则复杂且变化频繁。传统代码硬编码的方式,不仅维护起来麻烦,还容易出错。而规则引擎能让这些复杂的规则变得易于管理。



常见的规则引擎及对比

市面上有不少规则引擎,它们各有特点,适用于不同的场景。以下是几款常见的规则引擎:

  • Drools:Drools 是最知名的开源 Java 规则引擎,功能非常强大。它基于 RETE 算法,擅长处理复杂业务场景。但是它的缺点是相对较为“笨重”,学习曲线较陡,对于简单场景可能显得有些“杀鸡用牛刀”。

  • URule:URule 提供了直观的 Web 配置界面,业务人员也可以直接参与规则的编写和管理,非常适合那些需要快速上手的场景。但 URule 的开源版功能有限,更多复杂的功能可能需要付费版本。

  • EasyRules:EasyRules 是一个轻量级的 Java 规则引擎,API 简单易用,适合那些不需要复杂规则管理的项目。如果你只需要实现一些简单的规则逻辑,它可能会是个不错的选择。

  • AviatorScript:这是一个轻量级的表达式求值引擎,虽然不像 Drools 那样功能全面,但胜在轻量、高效,适合需要快速处理动态规则和表达式的场景。

  • QLExpress:阿里巴巴开源的规则引擎,最初是为电商业务设计的。它灵活且轻量,能够处理复杂的业务逻辑,还可以通过脚本语言实现动态调整,非常适合高并发的场景。

规则引擎优点缺点适用场景
Drools功能强大,支持复杂的规则和推理学习曲线陡峭,性能较为笨重复杂的企业级业务决策系统
URule可视化配置界面,业务人员也能操作免费版功能有限需要频繁规则修改的中小型项目
EasyRulesAPI 简单易用,轻量级功能较为基础,适合简单规则规则较为简单的项目
AviatorScript高效轻量,支持动态求值只能处理较为简单的逻辑动态规则、表达式求值
QLExpress灵活,支持复杂业务逻辑,阿里巴巴出品不支持完整的 Java 语法(比如异常处理、foreach、lambda),学习成本较高高并发、复杂业务场景


工作流引擎与规则引擎有什么不同

工作流引擎和规则引擎看起来可能有点像,因为它们都涉及自动化,但其实它们解决的问题完全不同。让我来用通俗的语言解释一下它们的区别和联系。

请添加图片描述

请添加图片描述

共同点

  • 共同目标:这两者的核心目标其实是一致的,都是为了提高业务效率,减少出错率,自动化那些重复的、容易出错的流程。它们希望通过自动化,省去一些不必要的人工操作,让事情跑得更顺畅、更快、更省事。

  • 友好性:这两者的另一个共同点是它们的操作相对“平易近人”,尤其是给那些不懂代码的业务人员。通过配置或图形化界面,业务人员可以自己调整流程或者规则,而不用求助开发团队。

  • 协同工作:在实际项目里,工作流引擎和规则引擎常常是配合使用的。工作流引擎负责引导流程的执行,而规则引擎负责在关键点做决策。例如,工作流引擎安排任务顺序,规则引擎决定下一步该怎么走,基于业务规则做出智能选择。

不同点

  • 功能目的:工作流引擎像是一个流程管理者,它定义了事情的步骤和顺序,确保任务一个接一个按顺序执行,适合那些有固定流程的工作,比如审批流程。而规则引擎更像是一个决策者,它专门负责根据设定的规则来做出复杂判断,比如要不要批准贷款、用户应该享受哪个优惠政策等。

  • 适用范围:工作流引擎更像是“流水线管理”,专注于任务的分配和执行顺序,通常是针对比较清晰的流程。规则引擎则更像是“裁判”,专注于根据条件和规则进行决策,处理复杂的逻辑和条件判断。

  • 代码的独立性:规则引擎通常是独立存在的模块,你可以把它放到不同的工作流中去用,而不需要改动工作流的结构。而工作流引擎则更像是一个完整的“操作系统”,每个工作流程都相对固定,需要按照既定顺序来执行。

  • 规则的应用:工作流引擎虽然也有一些简单的规则来决定流程走向,但这些规则通常是“硬性”的,比如任务完成后直接跳到下一个步骤。而规则引擎则可以处理更复杂的条件判断和决策,比如根据不同的变量计算结果再决定下一步。

  • 使用场景的不同:工作流引擎经常出现在管理流程的工具或系统中,比如项目管理软件、审批系统等。而规则引擎则经常嵌入在企业应用程序里,负责根据业务逻辑做出动态决策,比如电商的促销引擎、金融的风控系统等。

总结一下,工作流引擎负责“怎么做”,规则引擎负责“做什么”。两者可以一起使用,但它们关注的重点不同,一个管流程,一个管决策。


http://www.ppmy.cn/ops/123795.html

相关文章

Leetcode—148. 排序链表【中等】

2024每日刷题&#xff08;171&#xff09; Leetcode—148. 排序链表 C实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr…

怎么快速申请CNAS认证

要快速申请CNAS&#xff08;中国合格评定国家认可委员会&#xff09;认证&#xff0c;可以按照以下步骤进行&#xff1a; 一、了解CNAS认证要求和流程 查阅CNAS官网&#xff1a;访问CNAS官方网站&#xff0c;了解CNAS认证的基本条件、申请流程、所需材料等信息。 研究认可规则…

C语言-输入输出

实验一&#xff1a;编写一个输出两行自定义字符的 C 程序 一、实验目的 熟悉 C 语言的基本结构和语法。掌握 printf() 函数的使用方法。了解在 Code::Blocks 中编写、编译和运行程序的过程。 二、实验内容 编写一个 C 程序&#xff0c;要求输出两行字符&#xff0c;内容自定…

中科星图GVE(案例)——AI提取采样区域的大棚

目录 简介 函数 gve.Services.AI.greenhouseExtraction(fromGridRes) 代码 结果 知识星球 机器学习 简介 要提取大棚的采样区域&#xff0c;可以通过图像处理技术进行。以下是一种可能的步骤&#xff1a; 加载图像&#xff1a;使用图像处理库加载待处理的图像。 图像预…

电动牙刷拆解学习

大厂量产的产品的寻片选型为自己设计硬件的时候芯片选型提供了参考&#xff1a; 采用这个触点的方式充电相比于tppeC来说可以很好起到防水作用&#xff1a; USB公头&#xff1a; 牙刷母头&#xff1a; 电池充电芯片来自英集芯&#xff0c;型号IP2326&#xff0c;是一颗内部集…

2024互联网下载神器IDM6.42你值得拥有

&#x1f525; 互联网下载神器大揭秘&#xff01;IDM6.42你值得拥有 &#x1f680; Hey&#xff0c;各位小伙伴们&#xff0c;今天我要给你们安利一款我超爱的软件——Internet Download Manager 6.42&#xff08;简称IDM&#xff09;&#xff0c;这款下载器简直就是下载界的“…

索引的创建与优化(B树、B+树索引)事务的ACID特性及隔离级别。

索引的创建与优化&#xff08;B树、B树索引&#xff09; 索引的创建与优化&#xff1a;B树与B树索引 在数据库系统中&#xff0c;索引是提高查询效率的重要机制。其中&#xff0c;B树和B树是两种常见的索引结构。本文将介绍B树和B树索引的创建与优化方法。 一、B树索引 B树…

大数据新视界 --大数据大厂之 DataFusion:超越传统的大数据集成与处理创新工具

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…