流程编排、如此简单-通用流程编排组件JDEasyFlow介绍

流程,编排,如此,简单,通用,组件,jdeasyflow,介绍 · 浏览次数 : 654

小编点评

# JDEasyFlow流程引擎详解 JDEasyFlow是一个基于图的流程引擎,它支持各种业务场景的编排、扩展和可视化。流程引擎的核心模型是节点,节点可以执行逻辑并输出后继节点。 **以下是JDEasyFlow的一些主要概念和功能:** * **模型简单:**核心模型概念就是节点的流转。 * **扩展简单:**提供了监听器、过滤器功能,方便横向切面。 * **定义简单:**只需要通过JSON进行节点流转逻辑配置便可。 * **运行简单:**代码调用流程引擎,传入流程ID和业务参数便可。 * **使用简单:**引入组件包便可使用,比较轻量适用场景和对接使用说明适用场景。 **以下是JDEasyFlow的一些主要功能:** * 流程可编排:将业务流程抽象为软件流程,保证软件是现实的真实反映。 * 功能松耦合:将业务节点抽象为软件流程节点,一方面实现功能的松耦合,另一方面实现节点的可复用。 * 流程可视化:所见即所得,方便业务产品人员和软件研发人员基于同一语言的交流,也便于流程监控在实际软件系统开发过程中。 **以下是JDEasyFlow的一些常见问题:** * 如何将业务流程抽象为软件流程? * 如何定义不同的流程? * 如何定义节点的自定义实现? * 如何定义流程的可视化? **JDEasyFlow是一个功能强大的流程引擎,它可以满足各种业务场景的编排、扩展和可视化。** **学习更多关于JDEasyFlow的文档:** * Github: https://github.com/JDEasyFlow/jd-easyflow * wiki: https://github.com/JDEasyFlow/jd-easyflow/wiki

正文

作者:李玉亮

JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排、工作流、审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-easyflow),目前在部门的内部业务系统和科技输出系统中广泛应用,其他部门也有使用。

它的特点是简单、灵活、易扩展,开发人员一般30分钟可入门上手,半天可掌握其原理。它分为一个核心模块和若干扩展模块,模块之间松耦合,开发使用时可按需选择、快速集成、渐进式应用,同时支持JSON内置规范和BPMN规范。它的实现原理也有其特色,后面有介绍。

支持的场景功能

节点流转类型

支持顺序流转、条件流转、循环流转等。

节点功能类型

支持脚本节点、用户节点和消息节点。

脚本节点:节点执行时运行一段代码脚本

用户节点:根据用户的操作指令触发节点执行

消息节点:接收消息后触发节点执行

节点串并类型

支持串行执行、并行执行、串并组合执行等。

流程交互场景

支持单次交互一次执行多节点、多次交互一次执行一节点、多次交互一次执行多节点等。

子流程场景

JDEasyFlow支持子流程的场景,可将把复杂的流程节点拆分为子流程,便于业务逻辑抽象。

审批流程场景

JDEasyFlow提供了流程任务审批的能力;常用的审批、撤销、驳回、会签、加签等功能都可支持;内置了简单的动态表单。既支持从页面发起和操作流程任务,也支持API的方式,京东OA审批系统也有对接。

功能架构

整体功能架构

JDEasyFlow的功能架构如下图,功能模块之间松耦合, 开发时可按需选择、快速集成、渐进式应用最简单的使用方式为只在业务应用端引入jar包使用流程引擎。如果需要流程可视化功能,可集成BPMN规范模块,如果还需要流程实例持久化、流程定义持久化等更丰富功能,则可以集成其他相关模块。

流程引擎模块

JDEasyFlow的核心模块,此模块提供了基于JSON格式的JDEasyFlow规范进行流程编排的能力,其他模块均基于该模块扩展,相当于流程执行的发动机、CPU。该功能模块为独立组件,无数据库依赖,应用中引入jar包便可使用。

BPMN规范模块

提供了基于BPMN规范进行流程定义和可视化的能力,流程可视化基于[bpmn-js](https://bpmn.io/),其本质为提供了将BPMN格式流程定义转换为JDEasyFlow格式的能力。该模块为独立组件,仅依赖流程引擎模块,无数据库和服务依赖,应用中引入jar包便可使用。

目前可支持常用的BPMN元素:

任务:脚本任务、用户任务、消息任务

事件:开始事件、结束事件、消息接收事件

网关:排他网关、并行网关、包容网关

流程定义和实例管理模块

流程定义模块支持流程定义的中心化、版本化管理,流程实例模块支持流程实例的持久化和生命周期管理。该功能依赖数据库,有服务端和ERP管理端。

任务/审批模块

支持任务生成、任务分配等功能,常用的审批、撤销、驳回、会签、加签等功能都可支持。该功能依赖数据库,有服务端和ERP管理端。

系统架构

整体系统架构

JDEasyFlow的完整系统架构如下,主要有三个端:业务应用端、流程服务端、流程管理端,三个端可部署在单体应用中,也可分开部署。

中间件依赖

· 关系型数据库(如Mysql)

· 缓存(如Redis或R2M)

· 服务通讯框架(如Java API调用或Http调用或JSF调用)

数据库数据模型比较简单清晰,见下图:

性能说明

· 如果仅是服务编排场景,则流程的执行仅依赖内存和CPU,并且是在流程客户端执行,性能上依赖于客户端服务器的性能,普通笔记本实测1秒可执行一个流程请求的1w+个节点,1秒可执行1万+次含1个节点的流程请求

· 如果需要流程状态管理和流程持久化功能,流程引擎在执行时会到流程服务端查询和保存流程实例和流程节点的状态,性能上主要依赖于数据库的查询和插入效率

· 对于流程任务审批功能,流程的任务审批流转是在服务端执行,一方面取决于流程服务端的计算性能,另一方面同样取决于数据库的查询和插入效率

可伸缩性说明

· 流程引擎属于无状态,可随应用实例线性伸缩

· 流程服务端应用实例支持线性扩展

· 流程数据库可通过分库分表的方式支持大数据量的增长

实践建议

在具体实践中,建议部署统一的流程中心(见下图),对流程定义统一管理。各系统的应用只需集成流程客户端jar包进行流程节点开发和流程调用便可。如果系统只使用任务审批的功能,则只需要通过API和消息与流程中心交互便可。

使用示例

流程引擎使用示例

在源码的test目录下有quickstart测试用例(easyflow\easyflow-flow\src\test\java\com\jd\easyflow\flow\quickstart\QuickStartTest.java),可直接运行或调试以了解使用方式和运行原理。具体实践步骤如下:

1、代码中引入easyflow-flow jar包,以maven为例:

<dependency>
        <groupId>com.jd.easyflow</groupId>
        <artifactId>easyflow-flow</artifactId>
        <version>{替换为最新版本}</version>
</dependency>


2、编写流程定义文件,以node001->node002→node003的执行顺序为例:

{"id": "quickstart_001", "name": "Quick Start 001",
"nodes": [
  {"id": "node001","name": "Node001","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart001Node01Action()"},"start": true,"post": {"to": "node002"}},
  {"id": "node002","name": "Node002","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart002Node01Action()"},"post": {"to": "node003"}},
  {"id": "node003","name": "Node003","action": {"createExp": "new com.jd.easyflow.flow.quickstart.QuickStart003Node01Action()"}}
]
}


其中QuickStart001Node01Action等为java节点动作类。完整的流程定义配置项可见: https://github.com/JDEasyFlow/jd-easyflow/wiki/Flow-engine-usage (公网)

3、编写应用启动时加载流程引擎的代码

   FlowEngineImpl flowEngine = new FlowEngineImpl();
   flowEngine.setFlowPath("classpath:flow/quickstart/quickstart_001.json");
   flowEngine.init();


Spring环境可直接定义FlowEngineImpl bean.

4、编写具体流程调用执行的代码

    FlowParam param = new FlowParam("quickstart_001");
    FlowResult result = flowEngine.execute(param);


完整测试用例的执行结果打印如下:

[main           ] INFO FlowEngineImpl         - Start parsing definition files:easyflow-flow/target/test-classes/flow/quickstart/quickstart_001.json
[main           ] INFO FlowEngineImpl         - SART EXECUTE FLOW, flowId:quickstart_001 nodeIds:null
[main           ] INFO BaseFlowRunner         - EXECUTE NODE:node001
[main           ] INFO QuickStart001Node01Action - Execute Node 001
[main           ] INFO BaseFlowRunner         - NEXT NODES:node002
[main           ] INFO BaseFlowRunner         - EXECUTE NODE:node002
[main           ] INFO QuickStart002Node01Action - Execute Node 002
[main           ] INFO BaseFlowRunner         - NEXT NODES:node003
[main           ] INFO BaseFlowRunner         - EXECUTE NODE:node003
[main           ] INFO QuickStart003Node01Action - Execute Node 003
[main           ] INFO BaseFlowRunner         - NEXT NODES:
[main           ] INFO QuickStartTest         - Execute finish, current node is:node003


BPMN模块使用示例

打开easyflow-flow-bpmn/BPMNDesigner.html流程设计器. 点击导入按钮,导入easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn文件,可在设计器中看到和以上JSON定义等价的BPMN流程定义.

代码集成使用时只需要将FlowEngineImpl的flowParser设置为BpmnFlowParser.

更多

以上只是流程引擎和BPMN模块的简单使用示例,JDEasyFlow还包含其他模块、可支持很多的配置项和使用场景,更多使用可见最后的对接使用介绍.

实现原理

目前市面上的流程编排组件基本都是基于图(边和顶点)结构的,而本组件是参考了计算机指令执行模型而实现,借鉴了程序计数器的实现原理,引擎内部通过类似程序计数器(PC)的待执行节点栈来维护后继节点;可以理解为是一种高级业务编程语言,它同时也是图灵完备的。

流程引擎核心模型名词只有一个:节点(Node),节点的功能为执行逻辑并输出后续节点 。

开发态可定义有限的节点,通过每个节点与其后续节点连接形成有向图;运行态按规则逻辑进行节点流转,支持并行执行,支持顺序、条件或循环,支持fork-join。

概念:

流程:一个业务流程的抽象

节点:流程的组成单位,一个节点能够执行节点动作同时可返回后继节点

节点内部构件:

节点内部构件的组成是可自定义的,流程引擎提供了缺省实现,其内部构件包括了前处理器(PreHandler)、节点动作(NodeAction)、后处理器(PostHandler)

前处理器:判断该节点是否可以执行动作

节点动作:真实的业务功能处理

后处理器:负责计算后续节点

流程引擎执行逻辑

流程引擎有一个或多个流程触发节点,流程触发后执行如下逻辑:

1. 初始化流程上下文

2. 得到流程起始节点ID,放入执行栈

3. 如果执行栈为空,则返回,否则执行当前节点

  1. 预检查

  2. 执行Action

  3. 计算后继节点ID并返回

4. 将后继节点放入执行栈,从栈中取出待执行节点,跳到第3步

因此JDEasyFlow整体的特色为简单

• 模型简单:核心模型概念就是节点的流转

• 扩展简单:提供了监听器、过滤器功能,方便横向切面;节点支持自定义实现

• 定义简单:只需要通过JSON进行节点流转逻辑配置便可,也支持BPMN格式

• 运行简单:代码调用流程引擎,传入流程ID和业务参数便可

• 使用简单:引入组件包便可使用,比较轻量

适用场景和对接使用说明

适用场景

理论上JDEasyFlow可满足任何流程场景,它主要可解决三类问题:

流程可编排:将业务流程抽象为软件流程,保证软件是现实的真实反映;不同场景可定义不同流程,且流程易修改

功能松耦合:将业务节点抽象为软件流程节点,一方面实现功能的松耦合,另一方面实现节点的可复用

流程可视化:所见即所得,方便业务产品人员和软件研发人员基于同一语言的交流,也便于流程监控

在实际软件系统开发过程中,如果有如下诉求,可考虑使用流程编排:

• 业务流程是有明显的多个节点组成

• 希望流程可灵活变更

• 业务流程级别比程序流程高一层,在编程语言级别难以聚合和治理(如一个流程即需要前台操作,又有外系统参与,又有后台操作,在实现上入口分散)

对接使用

JDEasyFlow的所有文档可见: https://github.com/JDEasyFlow/jd-easyflow/wiki (公网)

欢迎大家对接使用,有相关使用问题可联系: liyuliang5@jd.com

与流程编排、如此简单-通用流程编排组件JDEasyFlow介绍相似的内容:

流程编排、如此简单-通用流程编排组件JDEasyFlow介绍

作者:李玉亮 JDEasyFlow是企业金融研发部自研的通用流程编排技术组件,适用于服务编排、工作流、审批流等场景,该组件已开源(https://github.com/JDEasyFlow/jd-easyflow),目前在部门的内部业务系统和科技输出系统中广泛应用,其他部门也有使用。 它的特点是简单

金仓数据库全攻略:简化部署,优化管理的全流程指南

通过本篇文章的学习和实践,我们深入了解了如何利用Docker技术快速部署KingbaseES数据库。从下载镜像到编写Docker Compose模板,再到容器的启动和管理,每一步都体现了现代化部署方式的便捷和高效。此外,我们还掌握了KSQL命令行工具的使用,这将极大地提升开发人员与数据库交互的效率。

面向状态机编程:复杂业务逻辑应对之道

在研发项目中,经常能遇到复杂的状态流转类的业务场景,比如游戏编程中NPC的跳跃、前进、转向等状态变化,电商领域订单的状态变化等。这类情况其实可以有一种优雅的实现方法:状态机。本文重点介绍有限状态机,并结合具体项目,通过状态机的应用将状态和业务逻辑解耦,便于简化复杂业务逻辑,降低理解成本。另外,重点讲解如何优雅的解决更广泛的复杂业务问题。

如何在低代码平台中引用 JavaScript ?

引言 在当今快速发展的数字化时代,企业对业务应用的需求日益复杂且多元。低代码开发平台作为一个创新的解决方案,以直观易用的设计理念,打破了传统的编程壁垒,让非技术人员也能轻松构建功能完备的Web应用程序,无需深入编码。这一特性极大地简化了应用开发流程,加速了业务需求转化为实际应用的速度,为企业带来了前

DHorse操作手册

在介绍DHorse的操作之前,我们先来看一下发布一个系统的流程是什么样的。 发布系统的流程 我们以一个Springboot系统为例,来说明一下发布流程。 1.首先从代码仓库下载代码,比如Gitlab; 2.接着是进行打包,比如使用Maven; 3.如果要使用k8s作为编排,还需要把步骤2产生的包制作

你以为搞个流水线每天跑,团队就在使用CI/CD实践了?

在实践中,很多团队对于DevOps 流水线没有很透彻的理解,要不就创建一大堆流水线,要不就一个流水线通吃。实际上,流水线的设计和写代码一样,需要基于“业务场景”进行一定的设计编排,特别是很多通过“开源工具”搭建的流水线,更需要如此(商业的一体化平台大部分已经把设计思想融入自己产品里了)。 - **流

Xcode编译流程

Xcode的构建过程本质上是执行一系列构建任务。如:代码检测,编译代码,链接目标文件,拷贝资源(图片, plist, nib)文件,代码签名等。大部分任务是执行命令行工具,如(clang编译、 ld链接、 codesign签名, altool上传)。这些工具使用xcode项目的配置信息,根据特定的顺

【译】使用 GitHub Copilot 作为你的编码 GPS

GitHub Copilot 是一个改变游戏规则的人工智能助手,可以彻底改变您在 Visual Studio 中的编码流程。在我们的视频系列中,Bruno Capuano 探讨了这个智能编码伙伴如何帮助您更有效地编写代码,同时保持质量和准确性。 Copilot:是助手,而不是替代品 Bruno 强调

3天上手Ascend C编程丨通过Ascend C编程范式实现一个算子实例

编程范式是算子实现的固定流程,基于Ascend C编程范式,可以快速搭建算子实现的代码框架。本文以一个实例为大家介绍如何基于Ascend C编程范式快速开发算子。

面试官:核心线程数为0时,线程池如何执行?

线程池是 Java 中用于提升程序执行效率的主要手段,也是并发编程中的核心实现技术,并且它也被广泛的应用在日常项目的开发之中。那问题来了,如果把线程池中的核心线程数设置为 0 时,线程池是如何执行的? 要回答这个问题,我们首先要了解在正常情况下,线程池的执行流程,也就是说当有一个任务来了之后,线程池