框架与类库:AviatorScript
1. 简介
AviatorScript 是一款高性能、轻量级、基于 Java 的表达式引擎和脚本语言。它支持将表达式编译为字节码,具备丰富的语法特性,适用于动态规则配置和实时计算场景。自 5.0 版本起,AviatorScript 从单纯的表达式引擎升级为通用脚本语言,支持 if/else
、for/while
等控制语句。
2. 核心特性
- 高性能:表达式编译为字节码,执行速度快,资源消耗低。
- 轻量级:核心包体积小,依赖少,易于集成。
- 易用性:语法简洁,接近 Java,学习成本低。
- 灵活性:支持自定义函数、操作符、类型转换及高精度计算。
- 安全性:提供白名单、黑名单和沙箱机制,防止代码注入和越权访问。
- 脚本能力:支持完整的流程控制、集合操作及函数定义。
3. 应用场景
- 动态业务规则配置与计算
- 数据清洗、过滤及 ETL 处理
- 指标衍生与自动化分析
- 低代码/可视化平台的公式引擎
- 自动化根因分析与报警推理
4. 基本语法
4.1 字面量与变量
支持 int
、long
、double
、decimal
、string
、boolean
、nil
等类型。
a + 10
name == "Aviator"
4.2 运算符
支持加减乘除、逻辑运算、比较运算及正则表达式等。
a > 0 && b < 100
string.contains("abc", name)
4.3 控制语句
支持 if/elsif/else
、for
、while
、break
和 continue
。
if a > 10 {
return "大";
} elsif a > 5 {
return "中";
} else {
return "小";
}
4.4 集合操作
支持 list
和 map
的快捷定义与操作。
let arr = [1, 2, 3];
let map = {"k": 1, "v": 2};
foreach item in arr {
println(item);
}
4.5 函数定义与调用
支持自定义函数和高阶函数。
function add(x, y) {
return x + y;
}
add(1, 2)
5. 集成与使用
5.1 依赖引入
通过 Maven 引入:
<dependency>
<groupId>com.googlecode.aviator</groupId>
<artifactId>aviator</artifactId>
<version>5.3.3</version>
</dependency>
5.2 基本用法
import com.googlecode.aviator.AviatorEvaluator;
Map<String, Object> env = new HashMap<>();
env.put("a", 10);
Object result = AviatorEvaluator.execute("a + 100", env); // 输出 110
5.3 表达式编译与复用
Expression exp = AviatorEvaluator.compile("a * b + 10", true);
Map<String, Object> env = Map.of("a", 2, "b", 3);
Object result = exp.execute(env); // 输出 16
5.4 自定义函数
AviatorEvaluator.addFunction(new AbstractFunction() {
@Override
public String getName() { return "square"; }
@Override
public Object call(Map<String, Object> env, Object arg1) {
return ((Number)arg1).doubleValue() * ((Number)arg1).doubleValue();
}
});
AviatorEvaluator.execute("square(5)"); // 输出 25
6. 安全与扩展
-
白名单:限制可用类,防止越权访问:
AviatorEvaluator.setOption(Options.ALLOWED_CLASS_SET, Sets.newHashSet(List.class));
-
循环次数限制:防止死循环:
AviatorEvaluator.setOption(Options.MAX_LOOP_COUNT, 10000);
-
特性开关:可禁用部分功能:
AviatorEvaluator.getInstance().disableFeature(Feature.Module);
7. 性能对比与优势
- 性能优于 JEXL、JUEL、QLExpress 等表达式引擎,在字面量、变量、方法调用等场景表现均衡。
- 代码体积小,依赖少,适合嵌入微服务、低代码及数据平台。
- 语法灵活,支持多种扩展,满足复杂业务需求。
8. 实践案例
- 去哪儿网:自动化根因分析系统,利用 AviatorScript 结合指标配置动态计算衍生指标,实现秒级分析和自动报警。
- vivo:积分任务体系,使用 AviatorScript 进行任务规则过滤与奖励计算,提升任务系统灵活性和上线效率。
- MetrAutoAPI:指标自动化平台,AviatorScript 作为规则引擎,对查询结果进行灵活运算和自动化分析。
9. 常见问题与注意事项
- 语法与 Java 存在差异,需注意类型转换规则(
long
→bigint
→decimal
→double
)。 -
null
字面量为nil
。 -
elif
写作elsif
。 - 集合和函数等高级用法需参考官方文档。
10. 参考资料
- 选型对比:Java表达式引擎选型调研分析
- 实践案例:去哪儿网业务自动化根因分析实践
11. 总结
AviatorScript 以其高性能、灵活性和易用性,成为国内主流的 Java 表达式引擎,广泛应用于动态规则配置、指标计算及自动化分析场景,是企业级系统推荐的表达式/脚本引擎之一。
Java表达式引擎选型调研分析
该项目组调研了多种表达式引擎,包括AviatorScript、MVEL、OGNL、SpEL、QLExpress、JEXL、JUEL和Janino。这些引擎具有不同的特性和适用场景。AviatorScript和SpEL支持集合、数组和字符串匹配的操作符;MVEL和OGNL用于获取和设置Java对象属性;QLExpress是阿里的动态脚本引擎解析工具;JEXL和JUEL是实现表达式语言的工具;Janino是一个快速的Java编译器兼表达式引擎。通过引入这些引擎,可以提高系统的灵活性和响应能力。
去哪儿网业务自动化根因分析实践
去哪儿网落地自动化根因分析的一系列技术创新,思考,方法和成果介绍~
MetrAutoAPI系统架构设计
公司正在进行数据战略转型,因此我们面临的数据需求越来越多,而我们拥有的指标数据越来越丰富。不过,仅仅拥有数据并不够,我们需要能够更加灵活高效的使用这些数据,以应对频繁多变的数据需求。传统的数据业务开发流程效率低下,无法及时响应变化的需求。因此,我们必须找到一种快速、灵活的解决方案,以满足我们快速变化的需求。
vivo积分任务体系的架构演进-平台产品系列05
本篇主要介绍vivo积分任务体系的系统建设历程。
- «
- 1
- »