# 规则引擎

规则引擎实现了将业务决策从应用程序代码中分离出来,接受数据输入,解释业务规则,并根据业务规则做出业务决策。规则引擎其实就是一个输入输出平台。

系统中引入规则引擎后,业务规则不再以程序代码的形式驻留在系统中,取而代之的是处理规则的规则引擎,业务规则存储在规则库中,完全独立于程序。业务人员可以像管理数据一样对业务规则进行管理,比如查询、添加、更新、统计、提交业务规则等。业务规则被加载到规则引擎中供应用系统调用。

业务系统运行过程中难免会发生业务规则变化的情形,有了规则引擎,业务规则部分采用的是规则引擎实现,这样在系统正常运行的情况就可以利用规则引擎对业务规则进行修改,从而实现业务规则的随需应便。

# 常见的规则引擎

通过界面配置的成熟规则引擎
# 这种规则引擎相对来说就比较重,但是功能全,也有部分业务会选择这个,比较出名的有:Drools、URule
# Drools 中文网 : http://www.drools.org.cn
# URule 官网 : http://www.bstek.com

基于JVM脚本语言
# 这种其实不是一个成熟的规则引擎,应该算是规则引擎中的核心技术,因为Drools这种相对太重了
# 很多公司会基于一些jvm的脚本语言,开发轻量级的规则引擎,如:Groovy、AviatorScript、QLExpress
# Groovy 官网 : http://www.groovy-lang.org
# AviatorScript 文档 : https://www.yuque.com/boyan-avfmj/aviatorscript
# QLExpress GitHub : https://github.com/alibaba/QLExpress

基于java代码的规则引擎
# 上面是基于jvm脚本语言去做的,会有一些语法学习的成本,所以就有基于java代码去做的规则引擎
# 比如通过一些注解实现抽象的方式去做到规则的扩展,比较出名的有: Easy Rules
# Easy Rules GitHub : https://github.com/j-easy/easy-rules

# AviatorScript 引擎

# AviatorScript 编译和执行的入口是 AviatorEvaluatorInstance 类
# 该类的一个实例就是一个编译和执行的单元,这个单元我们称为一个 AviatorScript 引擎
# 你可以多个引擎,每个引擎可以设置不同的编译和运行选项
# AviatorEvaluator.getInstance() 返回一个全局共享的 AviatorScript 引擎

# 编译脚本文件

  • 在你的 java 项目里引用下 AviatorScript 的依赖
<dependency>
  <groupId>com.googlecode.aviator</groupId>
  <artifactId>aviator</artifactId>
  <version>5.3.1</version>
</dependency>
  • 编写你的第一个 AviatorScript 脚本,AviatorScript 脚本源码文件约定以 .av 作为文件后缀
## av/hello.av  两个 # 号引入一行注释

println("hello, AviatorScript!");
  • 编写一个类来运行测试脚本
package com.example.springbootdemo.test;

import com.googlecode.aviator.AviatorEvaluator;
import com.googlecode.aviator.AviatorEvaluatorInstance;
import com.googlecode.aviator.Expression;

public class AviatorScriptDemo {

    public static void main(String[] args) throws Exception {

        // 使用 AviatorEvaluatorInstance#compileScript 方法编译脚本到 Expression 对象
        Expression exp = AviatorEvaluator.getInstance().compileScript("av/hello.av");
        // 调用 Expression#execute() 方法执行
        exp.execute();
    }
}