这 5 种规则引擎,真香!

这 5 种规则引擎,真香!

大家好,我是苏三,又跟大家见面。前言核心痛点:业务规则高频变更与系统稳定性之间的矛盾

想象一个电商促销场景:

代码语言:javascript代码运行次数:0运行复制// 传统硬编码方式(噩梦开始...)

public BigDecimal calculateDiscount(Order order) {

BigDecimal discount = BigDecimal.ZERO;

if (order.getTotalAmount().compareTo(new BigDecimal("100")) >= ) {

discount = discount.add(new BigDecimal("10"));

}

if (order.getUser().isVip()) {

discount = discount.add(new BigDecimal("5"));

}

// 更多if-else嵌套...

return discount;

}

当规则变成:"非VIP用户满200减30,VIP用户满150减40,且周二全场额外95折"时,代码将陷入维护地狱!

规则引擎通过分离规则逻辑解决这个问题:

规则外置存储(数据库/文件)支持动态加载声明式规则语法独立执行环境下面给大家分享5种常用的规则引擎,希望对你会有所帮助。

1.五大常用规则引擎1.1 Drools:企业级规则引擎扛把子官网:https://www.drools.org/

适用场景:金融风控规则(上百条复杂规则)保险理赔计算电商促销体系实战:折扣规则配置代码语言:javascript代码运行次数:0运行复制// 规则文件 discount.drl

rule "VIP用户满100减20"

when

$user: User(level == "VIP")

$order: Order(amount > 100)

then

$order.addDiscount(20);

end

Java调用代码:代码语言:javascript代码运行次数:0运行复制KieServices kieServices = KieServices.Factory.get();

KieContainer kContainer = kieServices.getKieClasspathContainer();

KieSession kSession = kContainer.newKieSession("discountSession");

kSession.insert(user);

kSession.insert(order);

kSession.fireAllRules();

优点:

完整的RETE算法实现支持复杂的规则网络完善的监控管理控制台缺点:

学习曲线陡峭内存消耗较大需要依赖Kie容器适合:不差钱的大厂,规则复杂度高的场景

1.2 Easy Rules:轻量级规则引擎之王官网:https://github.com/j-easy/easy-rules

适用场景:参数校验简单风控规则审批流引擎注解式开发:代码语言:javascript代码运行次数:0运行复制@Rule(name = "雨天打折规则", description = "下雨天全场9折")

public class RainDiscountRule {

@Condition

public boolean when(@Fact("weather") String weather) {

return "rainy".equals(weather);

}

@Action

public void then(@Fact("order") Order order) {

order.setDiscount(0.9);

}

}

引擎执行:代码语言:javascript代码运行次数:0运行复制RulesEngineParameters params = new RulesEngineParameters()

.skipOnFirstAppliedRule(true); // 匹配即停止

RulesEngine engine = new DefaultRulesEngine(params);

engine.fire(rules, facts);

优点:

五分钟上手零第三方依赖支持规则组合缺点:

不支持复杂规则链缺少可视化界面适合:中小项目快速落地,开发人员不足时

1.3 QLExpress:阿里系脚本引擎之光官网:https://github.com/alibaba/QLExpress

适用场景:动态配置计算逻辑财务公式计算营销规则灵活变更执行动态脚本:代码语言:javascript代码运行次数:0运行复制ExpressRunner runner = new ExpressRunner();

DefaultContext context = new DefaultContext<>();

context.put("user", user);

context.put("order", order);

String express = "if (user.level == 'VIP') { order.discount = 0.85; }";

runner.execute(express, context, null, true, false);

高级特性:代码语言:javascript代码运行次数:0运行复制// 1. 函数扩展

runner.addFunction("计算税费", new Operator() {

@Override

public Object execute(Object[] list) {

return (Double)list[] * 0.06;

}

});

// 2. 宏定义

runner.addMacro("是否新用户", "user.regDays < 30");

优点:

脚本热更新语法接近Java完善的沙箱安全缺点:

调试困难复杂规则可读性差适合:需要频繁修改规则的业务(如运营活动)

1.4 Aviator:高性能表达式专家官网:https://github.com/killme2008/aviatorscript

适用场景:实时定价引擎风控指标计算大数据字段加工性能对比(执行10万次):代码语言:javascript代码运行次数:0运行复制// Aviator 表达式

Expression exp = AviatorEvaluator.compile("user.age > 18 && order.amount > 100");

exp.execute(map);

// Groovy 脚本

new GroovyShell().evaluate("user.age > 18 && order.amount > 100");

引擎

耗时

Aviator

220ms

Groovy

1850ms

编译优化:代码语言:javascript代码运行次数:0运行复制// 开启编译缓存(默认开启)

AviatorEvaluator.getInstance().useLRUExpressionCache();

// 字节码生成模式(JDK8+)

AviatorEvaluator.setOption(Options.ASM, true);

优点:

性能碾压同类引擎支持字节码生成轻量无依赖缺点:

只支持表达式不支持流程控制适合:对性能有极致要求的计算场景

1.5 LiteFlow:规则编排新物种官网:https://liteflow.com/

适用场景:复杂业务流程订单状态机审核工作流编排示例:代码语言:javascript代码运行次数:0运行复制

Java调用:代码语言:javascript代码运行次数:0运行复制LiteflowResponse response = FlowExecutor.execute2Resp("orderProcess", order, User.class);

if (response.isSuccess()) {

System.out.println("流程执行成功");

} else {

System.out.println("失败原因:" + response.getCause());

}

优点:

可视化流程编排支持异步、并行、条件分支热更新规则缺点:

新框架文档较少社区生态待完善适合:需要灵活编排的复杂业务流

2 五大规则引擎横向评测图片性能压测数据(单机1万次执行):引擎

耗时

内存占用

特点

Drools

420ms

功能全面

Easy Rules

38ms

轻量易用

QLExpress

65ms

阿里系脚本引擎

Aviator

28ms

极低

高性能表达式

LiteFlow

120ms

流程编排专家

3 如何技术选型?图片黄金法则:简单场景:EasyRules + Aviator 组合拳金融风控:Drools 稳如老狗电商运营:QLExpress 灵活应变工作流驱动:LiteFlow 未来可期4 避坑指南Drools内存溢出代码语言:javascript代码运行次数:0运行复制// 设置无状态会话(避免内存积累)

KieSession session = kContainer.newStatelessKieSession();

QLExpress安全漏洞代码语言:javascript代码运行次数:0运行复制// 禁用危险方法

runner.addFunctionOfServiceMethod("exit", System.class, "exit", null, null);

规则冲突检测代码语言:javascript代码运行次数:0运行复制// Drools冲突处理策略

KieSessionConfiguration config = KieServices.Factory.get().newKieSessionConfiguration();

config.setProperty("drools.sequential", "true"); // 按顺序执行

总结能用:替换if/else(新手村)用好:规则热更新+可视化(进阶)用精:规则编排+性能优化(大师级)曾有人问我:“规则引擎会不会让程序员失业?” 我的回答是:“工具永远淘汰不了思考者,只会淘汰手工作坊”。

真正的高手,不是写更多代码,而是用更优雅的方式解决问题。

代码语言:javascript代码运行次数:0运行复制最后欢迎加入苏三的星球,你将获得:商城微服务实战、AI开发项目课程、苏三AI项目、秒杀系统实战、商城系统实战、秒杀系统实战、代码生成工具、系统设计、性能优化、技术选型、底层原理、Spring源码解读、工作经验分享、痛点问题、面试八股文等多个优质专栏。最后送句话:技术选型没有最好的,只有最合适的。

相关内容

炉石传说每期通行证持续时间介绍
365体育ribo88

炉石传说每期通行证持续时间介绍

🕒 08-04 👁️ 5159
游戏投屏工具
365体育ribo88

游戏投屏工具

🕒 07-21 👁️ 9133