话题框架与类库 › AviatorScript

框架与类库:AviatorScript

1. 简介

AviatorScript 是一款高性能、轻量级、基于 Java 的表达式引擎和脚本语言。它支持将表达式编译为字节码,具备丰富的语法特性,适用于动态规则配置和实时计算场景。自 5.0 版本起,AviatorScript 从单纯的表达式引擎升级为通用脚本语言,支持 if/elsefor/while 等控制语句。

2. 核心特性

  • 高性能:表达式编译为字节码,执行速度快,资源消耗低。
  • 轻量级:核心包体积小,依赖少,易于集成。
  • 易用性:语法简洁,接近 Java,学习成本低。
  • 灵活性:支持自定义函数、操作符、类型转换及高精度计算。
  • 安全性:提供白名单、黑名单和沙箱机制,防止代码注入和越权访问。
  • 脚本能力:支持完整的流程控制、集合操作及函数定义。

3. 应用场景

  • 动态业务规则配置与计算
  • 数据清洗、过滤及 ETL 处理
  • 指标衍生与自动化分析
  • 低代码/可视化平台的公式引擎
  • 自动化根因分析与报警推理

4. 基本语法

4.1 字面量与变量

支持 intlongdoubledecimalstringbooleannil 等类型。

a + 10
name == "Aviator"

4.2 运算符

支持加减乘除、逻辑运算、比较运算及正则表达式等。

a > 0 && b < 100
string.contains("abc", name)

4.3 控制语句

支持 if/elsif/elseforwhilebreakcontinue

if a > 10 {
  return "大";
} elsif a > 5 {
  return "中";
} else {
  return "小";
}

4.4 集合操作

支持 listmap 的快捷定义与操作。

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 存在差异,需注意类型转换规则(longbigintdecimaldouble)。
  • null 字面量为 nil
  • elif 写作 elsif
  • 集合和函数等高级用法需参考官方文档。

10. 参考资料

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
  • »

inicio - Wiki
Copyright © 2011-2025 iteam. Current version is 2.143.0. UTC+08:00, 2025-05-24 21:36
浙ICP备14020137号-1 $mapa de visitantes$