目录
干货分享,感谢您的阅读!
在现代业务系统中,如何实现快速、灵活的规则配置和动态决策,成为了企业提升响应速度和智能化水平的关键。阿里巴巴开源的 QLExpress 引擎,以其轻量、高效、简洁的优势,为复杂业务逻辑的动态处理提供了一种创新的解决方案。无论是需要实时调整规则的电商促销,还是依赖规则动态性的金融风控,QLExpress 都能以其灵活的表达式和易用的规则配置,实现高效而精准的业务决策。如果你正在寻找一款强大、灵活的动态脚本引擎,那么 QLExpress 可能正是你需要的工具!官网学习地址:https://github.com/alibaba/QLExpress
一、QLExpress快速了解
QLExpress(Quick Language Express)是阿里巴巴开源的一门动态脚本引擎解析工具,起源于阿里巴巴的电商业务,旨在解决业务规则、表达式、数学计算等动态脚本的解析问题。其具有以下基本特点:
-
线程安全:QLExpress被设计为线程安全的动态脚本引擎,它使用
threadlocal
类型的临时变量,确保在引擎运算过程中的并发场景下的线程安全性。 -
高效执行:为了提高执行效率,QLExpress在编译过程中可以将比较耗时的脚本编译结果缓存到本地机器。此外,运行时的临时变量创建采用了缓冲池技术,以确保高效的运行时性能,使其与一些性能优秀的脚本引擎(如Groovy)相当。
-
弱类型脚本语言:QLExpress采用弱类型脚本语言,语法类似于Groovy和JavaScript。这使得业务规则的表达更加灵活,虽然相对于强类型脚本语言可能略慢,但在业务的灵活性方面提供了很大的优势。
-
安全控制:QLExpress提供了一些运行时参数的设置,以进行安全控制。通过这些参数,可以预防一些潜在的安全问题,如死循环或对高危系统API的调用。
-
代码精简、依赖最小:QLExpress的设计追求代码的精简和最小依赖,其jar包大小为250k,适用于所有Java的运行环境。这使得它在各种环境中都能轻松部署和运行,包括在Android系统的低端POS机上广泛应用。
总体而言,这些特性使QLExpress成为一个在阿里电商业务场景中得到广泛应用的强大工具,具有高效、灵活和安全的特点。
二、QLExpress与常用规则引擎对比
特性 / 规则引擎 | Drools | Aviator | EasyRule | QLExpress |
---|---|---|---|---|
语言 | Drools规则语言 (DRL) | Aviator表达式语言 | Java | 弱类型脚本语言 |
性能 | 适用于复杂规则,可能较慢 | 高性能表达式求值引擎 | 相对较高性能,适用于简单规则 | 高效执行,适用于业务规则和表达式计算 |
灵活性 | 非常灵活,支持动态修改规则 | 灵活,支持丰富的运算符和函数 | 简单易用,适合非专业开发人员 | 灵活,支持业务规则、表达式和数学计算 |
语法 | 专门的规则语言 | 表达式语言 | Java编写规则 | 弱类型脚本语言,类似于Groovy和JavaScript |
应用场景 | 复杂的业务规则 | 简单的表达式计算和规则 | 简单规则场景,面向非专业开发人员 | 业务规则、表达式、数学计算,适用于电商业务 |
开发者社区 | 大型开发者社区 | 相对较小的社区规模 | 相对较小的社区规模 | 相对较小的社区规模,阿里巴巴内部有影响力 |
文档 | 详尽的文档 | 文档相对较少 | 文档相对较少 | 文档相对较少,可能需要深入源代码理解 |
开源 | 是 | 是 | 是 | 是 |
Drools适用于复杂的业务规则,而Aviator和QLExpress适用于相对简单的表达式计算和规则。EasyRule更适合简单规则场景,特别是面向非专业开发人员的情况。最终选择取决于具体需求,包括业务规则的复杂性、性能要求、开发人员技能水平以及项目的特定场景。
三、快速引用和一般工作原理简诉
(一)引用与基本演示
在 Maven 项目中引入 QLExpress,需要在项目的 pom.xml
文件中添加相关的依赖:
<dependencies>
<dependency>
<groupId>com.ql</groupId>
<artifactId>qlExpress</artifactId>
<version>3.2.2</version> <!-- 使用实际版本号 -->
</dependency>
</dependencies>
以下展示简单演示如何使用 QLExpress 计算折扣后的金额。在实际项目中,可能需要更复杂的脚本和上下文,以适应业务需求。
package org.zyf.javabasic.qlexpress;
import com.ql.util.express.DefaultContext;
import com.ql.util.express.ExpressRunner;
/**
* @program: zyfboot-javabasic
* @description: 演示如何使用 QLExpress 计算折扣后的金额
* @author: zhangyanfeng
* @create: 2023-11-12 21:40
**/
public class QLExpressExample {
public static void main(String[] args) {
try {
// 创建 QLExpress 引擎
ExpressRunner runner = new ExpressRunner();
// 创建上下文并设置变量
DefaultContext<String, Object> context = new DefaultContext<>();
context.put("amount", 1000);
context.put("discount", 0.1);
// 执行脚本
String expression = "amount * (1 - discount)";
Object result = runner.execute(expression, context, null, true, false);
// 输出结果
System.out.println("Result: " + result);
} catch (Exception e) {
e.printStackTrace();
}
}
}
(二)一般工作原理说明
QLExpress的一般工作原理,包括语法树分析、上下文和执行过程。
-
语法树分析: QLExpress会先将输入的脚本进行词法分析和语法分析,生成一棵语法树。这个语法树表示了脚本的结构,将其组织成可以被执行的形式。
-
上下文: 在QLExpress中,上下文是一个关键概念。它是脚本执行时的环境,包含变量、函数等信息。在执行脚本之前,你可以向上下文中添加变量,定义函数,设置一些执行参数等。这样,脚本执行时可以引用上下文中的内容。
-
执行过程: QLExpress的执行过程包括编译和运行两个主要阶段。在编译阶段,脚本被解析并生成可以执行的指令序列。在运行阶段,这些指令被执行,从而实现脚本的功能。
在这个框架下,二次定制的功能扩展可以包括:
-
自定义操作符和函数: 可以通过实现自定义的操作符和函数,使得脚本能够执行特定的业务逻辑。
-
修改执行流程: 可以在执行阶段插入自定义的逻辑,改变脚本执行的流程。
-
定制编译过程: 在编译阶段定制特定的优化或变换,以满足特殊需求。
-
扩展上下文功能: 可以添加一些上下文的拦截器,使得在脚本执行前后可以执行额外的逻辑。
这样的扩展点允许更好地适应特定的业务场景和需求。
四、基本语法学习
(一)操作符
QLExpress 支持一系列操作符,包括算术运算符、比较运算符、逻辑运算符等。
类别 | 操作符 | 示例 | 描述 |
---|---|---|---|
算术运算符 | + | a + b |
加法,将两个数字相加 |
- | a - b |
减法,从第一个数字中减去第二个数字 | |
* | a * b |
乘法,将两个数字相乘 | |
/ | a / b |
除法,将第一个数字除以第二个数字 | |
% | a % b |
取余,返回第一个数字除以第二个数字的余数 | |
比较运算符 | == | a == b |
等于,判断两个值是否相等 |
!= | a != b |
不等于,判断两个值是否不相等 | |
> | a > b |
大于,判断第一个值是否大于第二个值 | |
< | a < b |
小于,判断第一个值是否小于第二个值 | |
>= | a >= b |
大于等于,判断第一个值是否大于或等于第二个值 | |
<= | a <= b |
小于等于,判断第一个值是否小于或等于第二个值 | |
逻辑运算符 | && | condition1 && condition2 |
逻辑与,两个条件都为真时结果为真 |
|| | condition1 || condition2 |
逻辑或,两个条件中有一个为真时结果为真 | |
! | !con |