liteflow 架构详解
LiteFlow 是一个轻量级的、高性能的流程编排框架,主要用于解决复杂业务流程的编排问题。它提供了一种简单而强大的方式来定义和执行复杂的业务流程。下面是 LiteFlow 的架构详解:
核心概念
- 组件(Component):是流程中的最小执行单元,可以是一个简单的业务逻辑处理单元。
- 链(Chain):是由多个组件按照一定顺序或条件组合而成的执行序列。
- 脚本(Script):用于定义链的执行规则,可以使用 DSL(领域特定语言)或者 Java 代码来编写。
核心组件
-
Parser
- 作用:解析流程配置的规则,将规则文件解析成Java代码来运行。
- 支持的文件格式:XML、JSON、YAML。用户可根据自身配置的习惯来选择规则文件的格式。
- 规则文件的存储方式:支持基于ZooKeeper(zk)、本地文件的形式,同时也支持自定义的形式。
- 解析过程:对于XML来说,Parser会将标签解析成Node对象,将解析成Chain对象,内部的如“if”、“else”等标签都会解析成Condition对象。
-
Node
- 定义:代表具体业务执行的节点,真正的业务是在Node中执行的。
- 特性:在LiteFlow中,所有的逻辑都是组件,Node即为业务组件,直接使用Spring原生注解@Component定义即可。
-
Condition
- 定义:可以被理解为一种条件,例如前置条件或后置条件。一个Condition可以包含多个需要执行的Node。
- 作用:用于定义Node的执行条件和顺序,它们可以是串行或并行执行的。
-
Chain
- 定义:可以理解成整个业务执行的流程,按照一定的顺序来执行Condition中的Node,即业务节点。
架构设计
LiteFlow的设计基于工作台模式,其中每个业务组件相当于一个工人,按照一定的顺序在工作台上生产零件(即执行业务逻辑),从而实现了组件间的解耦和流程的灵活编排。
组件模型
LiteFlow 支持多种类型的组件,包括但不限于:
- 普通组件:最基础的组件类型,实现
LiteflowComponent接口。 - 条件组件:用于判断条件是否满足,实现
ConditionComponent接口。 - 脚本组件:可以直接运行脚本代码的组件,支持多种脚本语言。
- 子流程组件:可以嵌套其他链,实现更复杂的流程控制。
链模型
链是通过脚本定义的,可以包含以下元素:
- 组件调用:直接调用某个组件。
- 条件判断:根据条件选择不同的分支。
- 循环:重复执行某个组件或链。
- 并行执行:同时执行多个组件或链。
- 异常处理:定义异常发生时的行为。
脚本解析
LiteFlow 使用 EL 表达式引擎(如 MVEL 或者 SpEL)来解析脚本,支持动态表达式计算和条件判断。
执行引擎
执行引擎负责解析脚本,并根据脚本定义的规则执行相应的组件。执行过程中,可以通过上下文传递数据。
关键特性
- 组件化设计:LiteFlow将业务逻辑封装成独立的组件,每个组件负责处理特定的业务任务。这种组件化的设计使得业务流程更加清晰,也便于维护和扩展。
- 规则驱动:通过配置文件(支持XML、JSON、YAML等格式)定义业务流程的执行顺序和条件。这些规则文件描述了组件之间的流转关系,使得开发者可以灵活地调整业务流程。
- 热加载规则配置:LiteFlow支持热加载规则配置,即无需重启服务即可修改规则配置,实现业务流程的实时调整。这一特性大大提高了系统的灵活性和响应速度。
- 上下文隔离机制:LiteFlow提供了可靠的上下文隔离机制,确保在高并发情况下数据不会串流,从而保证了系统的稳定性和可靠性。
- 多种脚本语言支持:LiteFlow支持多种脚本语言(如Groovy、JavaScript、Python、Lua等),允许开发者根据具体业务需求进行定制。
- IDEA插件支持:LiteFlow拥有自己的IDEA插件LiteFlowX,通过该插件能支持规则文件的智能提示、语法高亮、组件与规则文件之间的跳转及LiteFlow工具箱等功能。
- 高灵活性:支持丰富的组件类型和多样的链定义方式。
- 高性能:通过高效的解析和执行机制,保证了较低的延迟。
- 易扩展:用户可以自定义组件和脚本解析器,以适应不同的业务需求。
- 可视化:提供了图形化的工具来帮助用户设计和调试流程。
- 分布式支持:支持在分布式环境中部署和运行。
使用场景
- 业务流程管理:对于拥有复杂业务逻辑的系统,使用LiteFlow可以降低维护成本,提高代码的抽象和复用率。
- 规则引擎:LiteFlow支持动态构建组件和流程,以及数据上下文的使用,使得在流程中的数据传递和共享变得更加方便和高效。
- 工作流:企业中的审批流程(如请假、加班、报销、采购等)可以使用LiteFlow进行快速开发和部署。
- 订单处理:电商网站和其他交易平台的订单处理流程也可以使用LiteFlow进行流程管控和监管,确保订单处理的准确性和高效性。
- 数据处理:在数据平台中,数据的流动和处理需要经历一系列的流程。LiteFlow可以用于管控和优化这些数据流程,确保数据的准确性和及时性。
- 微服务编排:在分布式系统中,微服务的管理、编排与监控涉及到多个服务之间的依赖关系。使用LiteFlow可以实现服务的自动化调用和管理,提高系统的稳定性和可维护性。
- 事件驱动架构:处理事件触发的复杂业务逻辑。
示例
假设我们有一个简单的业务流程,需要先验证用户信息,然后查询订单,最后生成报告。我们可以使用 LiteFlow 来定义这个流程:
@Component("userCheck")
public class UserCheckComponent extends NodeComponent {@Overridepublic ExecuteResult execute(ExecuteContext context) throws Exception {// 用户验证逻辑return ExecuteResult.SUCCESS;}
}@Component("orderQuery")
public class OrderQueryComponent extends NodeComponent {@Overridepublic ExecuteResult execute(ExecuteContext context) throws Exception {// 订单查询逻辑return ExecuteResult.SUCCESS;}
}@Component("reportGenerate")
public class ReportGenerateComponent extends NodeComponent {@Overridepublic ExecuteResult execute(ExecuteContext context) throws Exception {// 报告生成逻辑return ExecuteResult.SUCCESS;}
}
然后定义链:
@Configuration
public class FlowConfig {@Beanpublic Chain chain() {return new ChainBuilder().begin("userCheck").then("orderQuery").then("reportGenerate").end();}
}
这样就定义了一个简单的流程,其中包含了三个步骤:用户验证、订单查询和报告生成。
总结
LiteFlow 提供了一种简洁而强大的方式来定义和执行复杂的业务流程。它的灵活配置、高性能以及易扩展性使其成为处理复杂业务逻辑的理想选择。
相关文章:
liteflow 架构详解
LiteFlow 是一个轻量级的、高性能的流程编排框架,主要用于解决复杂业务流程的编排问题。它提供了一种简单而强大的方式来定义和执行复杂的业务流程。下面是 LiteFlow 的架构详解: 核心概念 组件(Component):是流程中…...
国产麒麟操作系统上运行LabVIEW
LabVIEW 目前并没有官方支持直接在国产麒麟操作系统(Kylin OS)上运行。LabVIEW 是由美国国家仪器公司(NI)开发的软件,主要面向 Windows 和 Linux 操作系统。麒麟操作系统虽然基于 Linux,但其内核和一些软件…...
【C语言】结构体(一)
一,是什么 结构体就是一些值的集合,这些值称为成员变量。 结构体的每个成员可以是不同类型的变量。说到集合,数组也是集合,但是不同的是数组只能是相同类型元素的集合。 二,结构体的声明 struct tag { member1;…...
C++《set与map》
在之前我们已经学习了解了CSTL当中的string和vector等容器,现在我们已经懂得了这些容器提供的接口该如何使用,并且了解了这些容器的底层结构。接下来我们在本篇当中将继续学习STL内的容器set与map,在此这两个容器与我们之前学习的容器提供的成…...
深度学习-52-AI应用实战之基于Yolo8的目标检测自动标注
文章目录 1 YOLOv81.1 YOLOV8的不同版本1.2 可检测类别1.3 数据说明1.4 网络结构1.5 算法核心步骤2 目标检测的基本原理2.1 安装yolov8(cpu版本)2.2 图片检测2.3 视频检测2.4 自动标注2.5 保存标注结果3 参考附录1 YOLOv8 YOLOv8是一种前沿的计算机视觉技术,它基于先前YOLO版…...
【Elasticsearch】05-DSL查询
1. 查询所有 es最多只支持查询1万条数据。 # 查询所有 GET /items/_search {"query": {"match_all": {}} }2. 叶子查询 全文检索 会对结果进行相关度打分。 # 检索单个字段 GET /items/_search {"query": {"match": {"name&…...
qml项目创建的区别
在Qt框架中,你可以使用不同的模板来创建应用程序。你提到的这几个项目类型主要针对的是Qt的不同模块和用户界面技术。下面我将分别解释这些项目类型的区别: 根据你提供的信息,以下是每个项目模板的详细描述和适用场景: Qt Widgets…...
.NET8/.NETCore 依赖注入:自动注入项目中所有接口和自定义类
.NET8/.NETCore 依赖接口注入:自动注入项目中所有接口和自定义类 目录 自定义依赖接口扩展类:HostExtensions AddInjectionServices方法GlobalAssemblies 全局静态类测试 自定义依赖接口 需要依赖注入的类必须实现以下接口。 C# /// <summary>…...
Flutter:city_pickers省市区三级联动
pubspec.yaml city_pickers插件地址 自己用的GetBuilder页面模板 cupertino_icons: ^1.0.8 # 省市区城市选择 city_pickers: ^1.3.0编辑地址页面:controller class AddressEditController extends GetxController {AddressEditController();Future<Result?>…...
Kafka-Connect自带示例
一、上下文 《Kafka-Connect》中已经阐述了Kafka-Connect的理论知识,为了更生动的理解它,我们今天通过官方的一个小例子来感受下它的妙用。 二、创建topic kafka-topics --create --topic connect-test --bootstrap-server cdh1:9092 --partitions 2 -…...
Hbase应用案例 随机号码生成
Hbase应用案例1 随机号码生成 在Hbase中插入如下格式的数据,数据内容随机生成 名称示例说明phonenumber158randomrowkey,号码dnum199randomcolumn,另一位通话者lengthrandomcolumn,时长valuerandomcolumn,接收或拨打…...
论文阅读——量子退火Experimental signature of programmable quantum annealing
摘要:量子退火是一种借助量子绝热演化解决复杂优化问题的通用策略。分析和数值证据均表明,在理想化的封闭系统条件下,量子退火可以胜过基于经典热化的算法(例如模拟退火)。当前设计的量子退火装置的退相干时间比绝热演…...
(长期更新)《零基础入门 ArcGIS(ArcMap) 》实验二----网络分析(超超超详细!!!)
相信实验一大家已经完成了,对Arcgis已进一步熟悉了,现在开启第二个实验 ArcMap实验--网络分析 目录 ArcMap实验--网络分析 1.1 网络分析介绍 1.2 实验内容及目的 1.2.1 实验内容 1.2.2 实验目的 2.2 实验方案 2.3 实验流程 2.3.1 实验准备 2.3.2 空间校正…...
go语言 Pool实现资源池管理数据库连接资源或其他常用需要共享的资源
go Pool Pool用于展示如何使用有缓冲的通道实现资源池,来管理可以在任意数量的goroutine之间共享及独立使用的资源。这种模式在需要共享一组静态资源的情况(如共享数据库连接或者内存缓冲区)下非 常有用。如果goroutine需要从池里得到这些资…...
mysql一个事务最少几次IO操作
事务的IO操作过程 开始事务:用户发起一个事务,例如执行START TRANSACTION;,此时事务开始。读取和修改数据:用户读取和修改数据时,InnoDB首先从Buffer Pool查找所需的数据页。如果数据页不在Buffer Pool中,…...
运输层总结
运输层协议:端到端协议 面向连接的传输控制协议 TCP无连接的用户数据报协议 UDP - 主要任务:为相 互通信的应用进程 提供 逻辑通信服务 - 屏蔽:运输层向高层用户 屏蔽 了下面网络核心的细节(如网络拓扑、所采用 的路由选择协议等…...
【嵌套查询】.NET开源 ORM 框架 SqlSugar 系列
.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…...
React 前端框架1
一、React 简介 (一)什么是 React React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开源并维护。它采用了组件化的开发思想,允许开发者将复杂的 UI 拆分成一个个独立、可复用的小组件,就如同搭积木一般&am…...
【真正离线安装】Adobe Flash Player 32.0.0.156 插件离线安装包下载(无需联网安装)
网上很多人声称并提供的flash离线安装包是需要联网才能安装成功的,其实就是在线安装包,而这里提供的是真正的离线安装包,无需联网即可安装成功。 点击下面地址下载离线安装包: Adobe Flash Player 32.0.0.156 for IE Adobe Fla…...
数据采集时,不同地区的动态IP数据质量有什么差异?
在数据采集的广阔世界中,动态IP扮演着至关重要的角色。它们不仅帮助我们突破地域限制,还能够提供多样化的数据来源。但是,不同地区的动态IP在数据质量上是否存在差异呢?本文将探讨这一问题,并为您提供实用的见解。 动…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
