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

news2024/12/26 17:21:17

目录

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

什么是规则引擎?

请添加图片描述

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

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

// 痛点举例
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);
end

rule "VIP客户中等折扣"
    when
        $customer : Customer(isVip() == true)
        $totalAmount : Double(this > 500)
    then
        $customer.setDiscount(0.15);
end

rule "普通客户大额折扣"
    when
        $customer : Customer(isRegular() == true)
        $totalAmount : Double(this > 1000)
    then
        $customer.setDiscount(0.10);
end

rule "电子产品额外折扣"
    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.coloradmin.cn/o/2203745.html

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

相关文章

使用浏览器原生API实现录屏功能

好早之前写了个小deme,本来都忘了,现在无意中又翻出来了,所以也来记录一下吧! 废话不说了,直接上代码了: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content=&q…

byte[]/InputStream/MultipartFile之间进行转换

前言 问题产生&#xff1a; 最近开发项目的时候&#xff0c;遇到了文件上传对象转换的问题 -> 我在对接抖音开放平台的时候&#xff0c;有一个图片上传的接口&#xff0c;需要将byte[]转为MultipartFile 对象&#xff0c;但是发现根本没有这样的工具类&#xff0c;后面翻阅…

无人机之巡航控制篇

一、巡航控制的基本原理 无人机巡航控制的基本原理是通过传感器检测无人机的飞行状态和环境信息&#xff0c;并将其反馈给控制器。控制器根据反馈信息和任务需求&#xff0c;计算出无人机的控制指令&#xff0c;并将其发送给执行机构。执行机构根据控制器的控制指令&#xff0c…

数据结构与算法——Java实现 33.堆排序

刻意去找的东西&#xff0c;往往是找不到的。 天下万物的来和去&#xff0c;都有它的时间。 —— 24.10.10 使用堆进行排序 算法描述 1.heapify 建立大顶堆&#xff08;所有结点的父元素大于子元素&#xff09; 2.将堆顶与堆底交换(最大元素被交换到堆底)&#xff0c;缩小并…

Python测试框架--Allure

严格意义上讲 Allure 不算是测试框架&#xff0c;但是它是生成漂亮测试报告的开源工具&#xff0c;搭配 Pytest 测试框架食用更搭。 也就是说 Allure 是在 Pytest 执行完生成的测试数据的基础上&#xff0c;对测试数据进行处理统计&#xff0c;生成格式统一、美观的测试报告。 …

java反射Class类的api

目录 Class类 1.构造器相关 1&#xff09;Constructor getConstructor(Class... parameterTypes): 2&#xff09;Constructor[] getConstructors(): 3&#xff09;Constructor getDeclaredConstructor(Class... parameterTypes): 4&#xff09;Constructor[] getDeclaredConstr…

国外火出圈儿的PM御用AI编程工具Bolt.new效果干不过国产的CodeFlying?号称全新定义全栈开发流程?

不知道大家最近有没有发现国外的很多AI都在挤破脑袋想去提升大模型的编程能力&#xff0c; 离我们最近的是上周Openai 发布的全新模型GPT-4o-Canvas&#xff0c; 拥有超强的代码编写能力。 另外还有LlamaCoder、Cursor、Claude artifacts、Replit... 光是今年一年就推出了好…

深入理解Transformer的笔记记录(精简版本)---- Transformer

自注意力机制开启大规模预训练时代 1 从机器翻译模型举例 1.1把编码器和解码器联合起来看待的话,则整个流程就是(如下图从左至右所示): 1.首先,从编码器输入的句子会先经过一个自注意力层(即self-attention),它会帮助编码器在对每个单词编码时关注输入句子中的的其他单…

xtu oj 四位数

样例输入# 2 1990 1111样例输出# 5 0 分离整数与合并 AC代码 #include<stdio.h> //判断四个数码是否相等 int Judge(int n){int flag1;int gn%10,sn/10%10,bn/100%10,qn/1000;if(gs&&gb&&gq)flag0;return flag; } int main(){int T;scanf("%d…

AI无人直播风口,云微客替你抓住了

现在很多老板都在找风口&#xff0c;其实风口就是我们大家看得见、摸得着的东西&#xff0c;就比如说近期比较火热的直播带货就属于是一个风口。可能很多老板会说直播、短视频之类的风口过于高科技&#xff0c;搞不来也搞不懂&#xff0c;跟自己好像没太大关系。 其实不然&…

嵌入式开发:STM32 硬件 CRC 使用

测试平台&#xff1a;STM32G474系列 STM32硬件的CRC不占用MCU的资源&#xff0c;计算速度快。由于硬件CRC需要配置一些选项&#xff0c;配置不对就会导致计算结果错误&#xff0c;导致使用上没有软件计算CRC方便。但硬件CRC更快的速度在一些有时间资源要求的场合还是非…

【二叉搜索树】1 leetcode 98 验证二叉搜索树

1 题目描述 题目链接&#xff1a;验证二叉搜索树 2 题目解析 搜索二叉树的特点就是&#xff0c; 中序遍历之后的值是有序的。 根据这个性质&#xff0c;可以对树进行中序遍历&#xff0c;将遍历的结果存入到vector中最后判断vector中的值的顺序。如果是从小到大有序的&…

变色龙算法(CSA)的MATLAB代码复现

目录 1 变色龙算法优化BP神经网络代码复现 2 变色龙算法优化支持向量机代码复现 3 变色龙算法优化长短期记忆神经网络代码复现 1 变色龙算法优化BP神经网络代码复现 1&#xff09;单输出回归预测&#xff1a;单输出回归预测&#xff1a;变色龙算法优化BP神经网络模型&#…

MinIO分片上传超大文件(纯服务端)

目录 一、MinIO快速搭建1.1、拉取docker镜像1.2、启动docker容器 二、分片上传大文件到MinIO2.1、添加依赖2.2、实现MinioClient2.3、实现分片上传2.3.0、初始化MinioClient2.3.1、准备分片上传2.3.2、分片并上传2.3.2.1、设置分片大小2.3.2.2、分片 2.3.3、分片合并 三、测试3…

Windows命令行执行cmake

生成Win32 工程并编译 cmake ../../ -G "Visual Studio 16 2019" -A Win32set pathC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin;%path%msbuild VideoNetOptimization.sln /p:ConfigurationRelWithDebInfo /p:PlatformWin3…

MSYS2+GCC 安装与应用保姆手册

msys2 提供可在Windows下使用 GCC 编译器&#xff1b;并且&#xff0c;借助 Linux 包管理功能&#xff0c;可轻松下载丰富的可在Windows下直接使用的 C/C 开发包&#xff0c;包括编译好的二进制包。 网络库asio、准标准库boost、zip解压缩、json格式处理、引擎 SDL……十八般兵…

2025年软考高项(信息系统项目管理师)包过班靠谱吗?

随着新一轮软考的到来&#xff0c;出现了很多“软考包过”的信息&#xff0c;但需要注意的是&#xff0c;“软考包过”根本不可信&#xff01; 因此不要想着依靠不正当手段来取得证书&#xff0c;要知道&#xff0c;如今 软考 由笔试变为机考&#xff0c;很难作弊&#xff0c;…

​速卖通、敦煌卖家备战双11+黑五前,怎么增加店铺曝光?

在速卖通这个竞争激烈的跨境电商平台上&#xff0c;店铺曝光率是决定销售成败的关键因素之一。为了在众多商家中脱颖而出&#xff0c;增加速卖通店铺曝光显得尤为重要。速卖通怎么增加店铺曝光&#xff1f; 一、速卖通怎么增加店铺曝光? 1、优化产品列表 速卖通的产品列表是…

需求9——通过一个小需求来体会service层的作用

昨天在完成了睿哥的需求验收之后&#xff0c;暂时没有其他任务&#xff0c;因此今天可能会比较有空闲时间。趁着这个机会&#xff0c;我打算把之前完成的一些需求进行总结&#xff0c;方便以后复习和参考。 在8月份的时候&#xff0c;我负责了一个需求&#xff0c;该需求的具体…

白色简洁大方公司企业网站源码 WordPress主题2款

WordPress白色简洁大方公司企业网站主题2款 白色整洁风格wordpress主题是一款比较新颖的国际设计范风格 简洁而大方的 WordPress 主题&#xff0c;适合个人博客、企业和工作室用。 完美支持下拉菜单的wordpress企业主题。 wordpress简白企业模板是一款适合企业站以及工作室…