美文网首页
Java动态脚本&规则引擎、计算/表达式引擎

Java动态脚本&规则引擎、计算/表达式引擎

作者: Jokay | 来源:发表于2021-07-12 15:57 被阅读0次

    1. 常见的使用场景

    在日常的Java项目中,我们免不了会遇到这样的需求:

    1. 动态地获取并运行自定义脚本文件,以实现特定的功能
    2. 对数据流执行用户自定义的数据有效性、公式计算、数据处理ETL(如数据截取、拼接)等不同业务逻辑
    3. 对用户输入的代码或脚本文件进行测试、运行,确保其语法正确、功能正常
    4. 处理需要灵活配置且不断变更的动态业务规则
    5. 代码的热更新、热修复

    诸如此类的需求若采用硬编码实现,则迭代成本相当高,每次改动都需要进行开发、测试、部署。同时业务规则的频繁变更会导致代码的开发和维护成本大大提高。

    2. Java动态脚本常见的实现方式

    2.1 动态编译执行Java代码

    2.2 通过Java脚本引擎执行不同类型的脚本

    • JavaScript

    • Groovy

    • Python

    • Lua

    • Ruby

    • Scala

    以上脚本语言可根据项目实际需求、对不同脚本语言的掌握情况出发进行选择。

    一般的需求可使用上述动态脚本实现,如果遇到业务规则更为复杂、规模更大、对功能和性能有更高要求的需求时,可考虑更为专业的规则引擎和计算/表达式引擎。

    3 进阶:规则引擎&计算/表达式引擎

    3.1 规则引擎

    规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。

    分离商业决策者的商业决策逻辑和应用开发者的技术决策

    • Drools (推荐)
    • OpenRules
    • EasyRules
    • OpenL Tablets
    • RuleBook
    • Esper

    3.2 计算/表达式引擎

    表达式(布尔组合)、特殊数学公式计算(高精度)、语法分析、脚本二次定制

    • Fel
    • OGNL
    • Mvel
    • SpEL
    • JEXL
    • JSEL
    • Aviator
    • Expression4j
    • QLExpress

    4. 使用动态脚本及上述引擎的优点

    • 逻辑和数据隔离
    • 可扩展性高
    • 可维护性高
    • 知识集中化
    • 提高业务灵活性
    • 业务透明度增强
    • 减少系统频繁迭代升级风险
    • 简化系统架构

    5. 使用动态脚本常见的问题及解决方案

    5.1. 安全问题

    • 提供常见的脚本文件供用户选择(系统提供的脚本文件更规范、更安全、性能更好)
    • 设置脚本编写规范及模板
    • 对用户提交的脚本做健康检查(如对Threadreflecttruncate等关键词进行检查,做提示确认或拒绝通过)
    • 对脚本进行版本管理,可对脚本做回滚处理
    • 对脚本设置审核机制
    • 可根据实际情况考虑是否对用户的脚本执行进行进程或线程隔离

    5.2 OOM问题

    Java执行动态脚本的过程往往会产生很多对象,而同一个脚本没必要每次执行时都去获取、编译、执行。可设计缓存策略,对编译后的脚本引擎进行缓存,既可避免频繁创建对象引起的内存溢出问题,又可提高性能


    • 如果这篇文章对你有用的话,点个再走呗!
    • 如有问题,欢迎留言评论!
    • 欢迎转载,烦请注明出处!

    相关文章

      网友评论

          本文标题:Java动态脚本&规则引擎、计算/表达式引擎

          本文链接:https://www.haomeiwen.com/subject/tdzrpltx.html