基于Groovy的规则脚本引擎实战

本文介绍了如何在项目中使用Groovy作为规则脚本引擎,解决快速迭代需求。通过探讨Groovy与Java的集成,分析了GroovyClassLoader、GroovyShell和GroovyScriptEngine的使用,以及在集成过程遇到的类加载和性能问题,提出了针对性的优化方案,旨在帮助读者理解和优化Groovy在业务中的应用。
摘要由CSDN通过智能技术生成

前言

因为之前在项目中使用了Groovy对业务进行一些抽象,效果比较好,过程中也踩了一些坑,所以简单记录分享一下自己如何一步一步实现的,在这里你可以了解:

1、为什么选用groovy作为规则脚本引擎

2、了解Groovy的基本原理和Java如何集成

3、分析Groovy与java集成的一些问题和坑

4、在项目中使用时做了哪些性能优化

5、实际使用时需考虑的一些tips

规则脚本可解决的问题

互联网时代随着业务的飞速发展,迭代和产品接入的速度越来越快,需要一些灵活的配置。办法通常有如下几个方面:

1、最为传统的方式是java程序直接写死提供几个可调节的参数配置然后封装成为独立的业务模块组件,在增加参数或简单调整规则后,重新调上线。

2、使用开源方案,例如drools规则引擎,此类引擎适合业务较复杂的系统

3、使用动态脚本引擎:groovy,simpleEl,QLExpress

引入规则脚本对业务进行抽象可大大提升效率。 例如,笔者之前开发的贷款审核系统中,贷款的订单在收单后会经过多个流程的扭转:收单后需根据风控系统给出结果决定订单的流程,而不同的产品的订单的扭转规则是不一致的,每接入一个新产品,码农都要写一堆对于此产品的流程逻辑;现有的产品的规则也经常需要更换。所以想利用脚本引擎的动态解析执行,到使用规则脚本将流程的扭转抽象出来,提升效率。

如何选轮子

考虑到基于自身的业务的复杂性,传统的开源方案如Acitivities和drools,对于我的业务来说,过于重了。 再对于脚本引擎来说最常见的其实就是groovy了,ali有一些开源项目 ,对于不同的规则脚本,选型时需要考虑性能、稳定性、语法灵活性,综合考虑下选择Groovy有如下几点原因:

1、历史悠久、使用范围大,坑少

2、和java兼容性强:无缝衔接java代码,即使不懂groovy语法也没关系

3、语法糖

4、项目周期短,上线时间紧急?

项目流程的抽象

因为不同业务在流程扭转时对于逻辑的处理是不一致的。我们先考虑一种简单的情况: 本身的项目在业务上会对不同的贷款订单进行流程扭转,例如订单可以从流程A扭到流程B或者流程C,取决于每一个Strategy Unit的执行情况(如下图):每个Strategy Unit执行后会返回Boolean值。具体的逻辑可以自己定义,在这里我们假设:如果满足所有Strategy Unit A的的条件(即每个执行单元都返回true),那么订单就会扭转至Scenario B;如果满足所有Strategy Unit B的的条件,那么订单就会扭转至Scenario C。

为什么设计成多个StrategyLogicUnit呢?是因为我的项目中,为了方便配置,将整个流程的StrategyLogicUnit的配置展示在了UI上,可读性更强、修改时也只需要修改某一个unit中的执行逻辑。

每个StrategyLogicUnit执行时依赖的数据我们可以把它抽象为一个Context,context中包含两部分数据:一部分是业务上的数据:例如订单的产品,订单依赖的风控数据等,另一部分是规则执行数据:包括当前执行的node、所属的策略组信息、当前的流程、下一个流程等,这一部分规则引擎执行数据的context可以根据不同的业务进行设计,设计时主要考虑断点重跑、策略组等:比如可以设计不同策略组与产品的关联,这一部分业务耦合性比较大,本文主要focus在groovy上。

可以把Context理解为StrategyLogicUnit的输入和输出,StrategyLogicUnit在Groovy中进行执行,我们可以对每一个执行的StrategyLogicUnit进行可配置化的展示和配置。执行过程中可以根据context中含有的不同的信息进行逻辑判断,也可以改变context对象中的值。

基于流程将Groovy与Java的集成

那么基于如上流程,我们如何结合Groovy和java呢? 基于上面的设计,Groovy脚本的执行本质上只是接受context对象,并且基于context对象中的关键信息进行逻辑判断,输出结果。而结果也保存在context中。 先看看Groovy与java集成的方式:

GroovyClassLoader

用 Groovy 的 GroovyClassLoader ,它会动态地加载一个脚本并执行它。GroovyClassLoader是一个Groovy定制的类装载器,负责解析加载Java类中用到的Groovy类。

GroovyShell

GroovyShell允许在Java类中(甚至Groovy类)求任意Groovy表达式的值。您可使用Binding对象输入参数给表达式,并最终通过GroovyShell返回Groovy表达式的计算结果。

GroovyScriptEngine

GroovyShell多用于推求对立的脚本或表达式,如果换成相互关联的多

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值