LiteFlow规则引擎框架

LiteFlow规则引擎框架

Hi,我是阿昌,今天介绍一个规则引擎框架,LiteFlow;

一、前言

那首先得知道什么是规则引擎?规则引擎是 一种用于自动化处理业务规则的软件组件。

在软件行业中,规则引擎通常用于解决复杂的业务逻辑处理问题。它可以将业务规则从应用程序中分离出来,并以一种易于管理维护的方式进行配置和修改。

规则引擎能够根据预先定义的规则集对输入数据进行评估和处理,并根据规则的结果执行相应的操作。这样可以提高软件系统的灵活性、可扩展性和可维护性。

规则引擎在许多软件领域都有广泛的应用,比如金融行业的风险评估、保险业的理赔处理、电子商务的促销活动等。

一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。时间一长,项目几经易手,维护成本就会越来越高。各种硬代码判断,分支条件越来越多。

代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。

如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更业务流程,几乎很难实现,那LiteFlow为解耦逻辑而生,为编排而生。


二、优势

  • 一个编排式的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。
    • 可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。
    • LiteFlow拥有开源规则引擎最为简单的DSL语法
      在这里插入图片描述
  • 组件可实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。
    在这里插入图片描述
  • 支持众多脚本语言,完全和Java打通,你可以用脚本来实现任何逻辑。
    在这里插入图片描述
  • 配置存放灵活,支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便定制。
    在这里插入图片描述
  • 同时要保证所有组件都是灵活可变的。
    在这里插入图片描述

三、场景情况

1、适用场景

LiteFlow适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。

可得到一个灵活度高,扩展性很强的系统。

因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。

2、不适用场景

LiteFlow只做基于逻辑的流转,而不做基于角色任务的流转。如果你想做基于角色任务的流转,推荐使用flowable (opens new window),activiti (opens new window)这2个框架。


四、HelloWorld

liteflow支持多种框架的引入,场景的springboot、spring或非spring场景

1、前置版本

下面的代码是基于此版本进行演示:

  • springboot:2.3.4.RELEASE
  • jdk:1.8
  • liteflow-springboot:2.11.4.2

2、依赖

LiteFlow提供了liteflow-spring-boot-starter依赖包,提供自动装配功能

<dependency><groupId>com.yomahub</groupId><artifactId>liteflow-spring-boot-starter</artifactId><version>2.11.4.2</version>
</dependency>

3、组件定义

在依赖了以上jar包后,需要定义并实现一些组件,确保SpringBoot会扫描到这些组件并注册进上下文。
定义如下:a,b,c组件

/*** @author achang* @date 2024/2/8 - 12:27 下午**/
@Component(value = "a")
public class AComponent extends NodeComponent {@Overridepublic void process() throws Exception {System.out.println("do A");}
}
/*** @author achang* @date 2024/2/8 - 12:27 下午**/
@Component(value = "b")
public class BComponent extends NodeComponent {@Overridepublic void process() throws Exception {System.out.println("do B");}
}
/*** @author achang* @date 2024/2/8 - 12:27 下午**/
@Component(value = "c")
public class CComponent extends NodeComponent {@Overridepublic void process() throws Exception {System.out.println("do C");}}

4、springboot配置

在SpringBoot的application.properties或者application.yml里添加配置(这里以properties为例,yaml也是一样的),更多的配置项

liteflow.rule-source=config/flow.el.xml

5、流程规则编写

在上面flow.el.xml文件中编写流程规则

<?xml version="1.0" encoding="UTF-8"?>
<flow><chain name="achang">THEN(a, b, c);</chain>
</flow>

SpringBoot在启动时会自动装载规则文件。

6、测试执行

编写测试执行类

/*** @author achang (caimu.zyc@raycloud.com)* @date 2024/2/8 - 12:34 下午* 执行测试组件**/
@Component("testHandleComponent")
public class TestHandleComponent {@Resourceprivate FlowExecutor flowExecutor;public void testHandle(String arg){LiteflowResponse liteflowResponse = flowExecutor.execute2Resp("tagChain", arg);System.out.println("done");}}

提示
这个DefaultContext是默认的上下文,用户可以用最自己的任意Bean当做上下文传入,如果需要传入自己的上下文,则需要传用户Bean的Class属性,具体请看数据上下文这一章节。

编写测试入口:

@SpringBootTest
class LiteFlowDemoApplicationTests {@Autowiredprivate TestHandleComponent testHandleComponent;@Testvoid contextLoads() {testHandleComponent.testHandle("achang");}
}

执行结果控制台:
在这里插入图片描述
那这样子用liteflow写了一个最简单的一个demo,可以看到用代码定于组件的代码然后,在流程规则中编写对组件之间流程执行的编写,这样子就可以将业务之间抽象成一个一个的组件,然后进行编排解藕达成目的,

那liteflow还有很多的高级特性,如:配置源的设置/多重组件的编写/EL规则的写法/数据上下文的玩法/执行器/脚本组件等等等等特性,在官方文档都有介绍,有兴趣的可以看:LiteFlow


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676520.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何使用Docker本地部署一个开源网址导航页并分享好友公网使用

&#x1f525;博客主页&#xff1a; 小羊失眠啦. &#x1f3a5;系列专栏&#xff1a;《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;…

备战蓝桥杯---动态规划(基础3)

本专题主要介绍在求序列的经典问题上dp的应用。 我们上次用前缀和来解决&#xff0c;这次让我们用dp解决把 我们参考不下降子序列的思路&#xff0c;可以令f[i]为以i结尾的最大字段和&#xff0c;易得&#xff1a; f[i]max(a[i],a[i]f[i-1]); 下面是AC代码&#xff1a; #in…

有哪些方法可以配置并发服务器?

通过合理配置并发服务器&#xff0c;可以提高服务器的处理能力和响应速度&#xff0c;从而更好地满足用户需求。本文将介绍一些常见的并发服务器配置方法&#xff0c;以帮助您更好地实现服务器的高效运行。 一、选择合适的操作系统 操作系统的选择是并发服务器配置的重要环节…

【数据结构与算法-初学者指南】【附带力扣原题】队列

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

面向数据报编程-UDP协议

目录 前言&#xff1a; 1.UDP协议API 1.1UDP编程原理 1.2DatagramSocket类 &#xff08;1&#xff09;DatagramSocket构造方法 &#xff08;2&#xff09;DatagramSocket普通方法 1.3DatagramPacket类 &#xff08;1&#xff09;DatagramPacket构造方法 &#xff08;2…

2.6日学习打卡----初学RabbitMQ(一)

2.6日学习打卡 初识RabbitMQ、 一. MQ 消息队列 MQ全称Message Queue&#xff08;消息队列&#xff09;&#xff0c;是在消息的传输过程中保 存消息的容器。多用于系统之间的异步通信。 同步通信相当于两个人当面对话&#xff0c;你一言我一语。必须及时回复 异步通信相当于通…

vs用msys2编译安装 gmp

1 下载 1.1下载MSYS2工具 MSYS2 1.2 下载gmp The GNU MP Bignum Library 2 使用windows的msys2命令窗口,有三个msys2命名窗口 mingw64 3 4 命令 pacman -Syu 重启&#xff1a; pacman -Su 安装&#xff1a; pacman -S mingw-w64-x86_64-gcc pacman -S mingw-w64-x86_64-make…

C语言函数的栈帧与销毁(面试亮点)

目录 如果你能熟练的掌握函数的栈帧与销毁在面试中是及其亮眼的加分项&#xff0c;所以我们来以实例来将解函数是如何实现栈帧与销毁的。 一. 函数栈帧 二.寄存器 三. 用例题讲解创建栈帧的过程 3.1 main 函数的反汇编代码。 第一步&#xff1a;给调用main函数的函数分配…

[职场] 如何通过运营面试_1 #笔记#媒体#经验分享

如何通过运营面试 盈利是公司的事情&#xff0c;而用户就是你运营的事情。你需要彻底建立一个庞大而有效的用户群&#xff0c;这样才能让你们的公司想盈利就盈利&#xff0c;想战略就战略&#xff0c;想融资就融资。 一般从事运营的人有着强大的自信心&#xff0c;后台数据分析…

JVM-虚拟机栈

虚拟机栈 Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;采用栈的数据结构来管理方法调用中的基本数据&#xff0c;先进后出&#xff08;First In Last Out&#xff09;,每一个方法的调用使用一个栈帧&#xff08;Stack Frame&#xff09;来保存。 接下来以…

vue3 之 通用组件统一注册全局

components/index.js // 把components中的所组件都进行全局化注册 // 通过插件的方式 import ImageView from ./ImageView/index.vue import Sku from ./XtxSku/index.vue export const componentPlugin {install (app) {// app.component(组件名字&#xff0c;组件配置对象)…

D7 Elasticsearch-Mongodb(搜索记录)

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…

mysql笔记:表设计原则

mysql笔记&#xff1a;表设计原则 表对应了一个实体 表与表之间的关系&#xff1a; 一对一 一对多 多对多 一对一关系 例如&#xff1a;用户 user和身份信息 info 子表的外键关联了父表的子健&#xff08;类型必须一样&#xff09; 一对多关系 以电商系统为例子 用户-商…

CSP-202012-1-期末预测之安全指数

CSP-202012-1-期末预测之安全指数 题目很简单&#xff0c;直接上代码 #include <iostream> using namespace std; int main() {int n, sum 0;cin >> n;for (int i 0; i < n; i){int w, score;cin >> w >> score;sum w * score;}if (sum > 0…

使用 Ant Design 的 Upload 组件实现图片

文章目录 使用 Ant Design 的 Upload 组件实现图片Upload组件itemRender自定义上传列表项的渲染方式修改图片名上传图片上传链接中添加 Bearer Token 的请求头onPreview{handlePreview}上传成功后&#xff0c;如何隐藏上传列表 使用 Ant Design 的 Upload 组件实现图片 Upload…

【第二十三课】最小生成树:prime 和 kruskal 算法(acwing858,859 / c++代码 )

目录 前言 Prime算法--加点法 acwing-858 代码如下 一些解释 Kruskal算法--加边法 acwing-859 并查集与克鲁斯卡尔求最小生成树 代码如下 一些解释 前言 之前学最短路的时候&#xff0c;我们都是以有向图为基础的&#xff0c;当时我们提到如果是无向图&#xf…

【深度学习】实验7布置,图像超分辨

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c; 实验答案链接http://t.csdnimg.cn/P1yJF 如果需要更详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 深度学习训练营 案例 7 &#xff1…

计算机毕业设计Python+django医院后勤服务系统flask

结合目前流行的 B/S架构&#xff0c;将医疗后勤服务管理的各个方面都集中到数据库中&#xff0c;以便于用户的需要。该平台在确保平台稳定的前提下&#xff0c;能够实现多功能模块的设计和应用。该平台由管理员功能模块,工作人员模块&#xff0c;患者模块&#xff0c;患者家属模…

基于SpringBoot的记账系统项目

点击以下链接获取源码&#xff1a;https://download.csdn.net/download/qq_64505944/88822660?spm1001.2014.3001.5503 Java项目-8 开发工具&#xff1a;IDEA/Eclipse,MySQL,Tomcat 项目框架&#xff1a;SpringBoot,layui 功能&#xff1a;可以按照类型和时间查询&#xff0c…

基于tomcat运行jenkins常见的报错处理

目录 1.jenkins.util.SystemProperties$Listener错误 升级jdk11可能遇到的坑 2.java.lang.RuntimeException: Fontconfig head is null, check your fonts or fonts configuration 3.There were errors checking the update sites: UnknownHostException:updates.jenkins.i…