来源my.oschina.net/u/4090830/blog/55844711 什么是流程引擎1.1 什么是流程1.2 什么是引擎1.3 流程设计器2 流程引擎的应用2.1 Workflow2.2 BPMBusiness Process Management2.3 流程编排3 流程引擎的架构设计4 商业机会1 什么是流程引擎流程引擎是一个底层支撑平台是为提供流程处理而开发设计的。流程引擎和流程应用以及应用程序的关系如下图所示。图片常见的支撑场景有Workflow、BPM、流程编排等。本次分享主要从 BPM 流程引擎切入介绍流程引擎的架构设计方法。1.1 什么是流程简单来说流程就是一系列活动的组合。比如用于企业办公的 OA 系统中就存在大量的申请审批类的流程。在生产制造业有大量的从销售端的订单到生产制造再到签收回款的生产销售流程。在机器学习领域有亚马逊 AWS Sagemaker 的大数据处理、机器学习的应用。综上流程是一个概念在和具体实现结合时就产生了不同的流程产品如 DevOps、Spring Data Stream 等。在流程实现方面主要可以分为 2 种实现方式一种是用代码实现比如用代码实现一个加班申请那么就要自己对接 SSO 进行单点登录通过接口拿到发起人和审批人的信息同时保存表单数据。另一种方式是使用流程引擎来实现流程引擎对接应用场景所需数据如加班申请流程引擎对接 SSO、OU、审批人配置、权限等实现这样一个流程只需要关心流程配置、流程节点和流程表单即可流程流转以及流程的数据处理都通过流程引擎来完成。流程引擎可以快速落地流程实现这也是流程引擎存在的价值。1.2 什么是引擎一般而言引擎是一个程序或一套系统的支持部分。常见的程序引擎有游戏引擎、搜索引擎、杀毒引擎等。引擎是脱离具体业务场景的某一类业务场景的高度抽象和封装。“比如某 OA 公司封装了一套审批用的 workflow实施人员只需要配置流程和表单即可交付项目。再比如美国某公司做了一个 AI 引擎做 NBANext Best Action推荐封装了推荐领域的常用算法在不同的场景自动选择和组合多种算法进行智能推荐。1.3 流程设计器流程设计器是流程和引擎的连接方用户通过流程设计器将某种 layout 和 rule 固化成某种流程然后通过数据和数据上下文使用流程引擎自动按照某种固化的流程进行执行。我将目前见到的流程设计器的理论基础分为以下三类自定义系UML 中的活动图系BPMN 系。 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4500小伙伴加入1.3.1 自定义系用于 Sagemaker 等场景的 AWS Step Function自定义流程节点图片1.3.2 UML Activity DiagramFlowportal BPM 的流程设计器图片1.3.3 BPMN 系activiti 的流程设计器图片炎黄盈动的流程设计器图片“题外话炎黄盈动的流程设计器和 processon 中的流程设计器界面几乎一样因为本质上是一家的。2 流程引擎的应用2.1 Workflow工作流管理联盟 (Workflow Management CoalitionWfMC) 作为工作流管理的标准化组织而成立。WfMC 对工作流给出定义为工作流是指一类能够完全自动执行的经营过程根据一系列过程规则将文档、信息或任务在不同的执行者之间进行传递与执行。图片在 workflow 中流程引擎主要用于支撑流程审批和数据流转应用场景非常广泛。国外产品开源或商用通常需求和操作比较简单不会有国内的需求那么复杂。国内的产品经历了众多客户的锤炼功能目前都比较强大。一般而言workflow 使用场景最多的是 OA 产品。在 OA 办公中包含了企业办公中的大量元素这些元素足够形成特定的产品比如门户系统、移动办公。在 OA 的项目落地过程中结合行业、业务侧重点又可以形成行业解决方案和专题方案。以下是某 OA 公司产品和解决方案。图片2.2 BPMBusiness Process ManagementWorkflow 主要是解决审批和数据流转而 BPM 主要是解决端到端、信息孤岛等问题而存在的。大多数用 BPM 产品的客户都是在 BPM 基础上进行系统搭建比如在 BPM 上面搭建 OA、CRM、HR 等系统。BPM 的使用场景比 Workflow 更广泛BPM 产品中包含大量的和第三方系统交互的组件和自定义 SQL、代码组件。“比如BPM 系统中的文件触发器可以在海关等交互场景下通过监控 FTP 服务器中的文件自动触发流程实例可以通过定时器 Timer自动每日执行数据同步并通过 Mail 节点将同步结果通知到相关运营成员等。图片图片BPM 的应用可以按照执行前、执行中和执行后来划分。图片2.3 流程编排流程编排是脱离流程业务领域的更高一层抽象使用方可以通过流程编排系统结合自己的业务场景进行业务定制。比如可以将相关业务代码封装成 function然后通过云厂商平台的 FAAS 平台将不同业务的 function 进行关联和调度从而完成某项任务。3 流程引擎的架构设计鉴于一些朋友可能没有使用和接触过流程引擎先介绍流程引擎的组成单元再介绍基于某个 BPM 产品的项目是如何进行开发的。我们通过 BPM 项目开发对流程引擎的作用有个初步的认识。3.1 BPM 流程引擎的组成单元组织、角色、用户、成员的组织架构托管流程资源文件的配置、校验、存储和执行对不同的流程节点流程引擎自动结合配置、数据处理其对应的业务逻辑流程数据自动处理表单配置、数据绑定表单数据的根据流程配置自动处理通用的数据接口3.1.1 组织架构的设计图片3.1.2 流程设计器流程设计器包含左侧的分组节点列表和右侧的画布。左侧的节点可以如下进行设计。图片问题对于一个 XML 或 JSON 格式的流程图如何进行解析不同的节点按照不同的业务场景配置不同的配置项。比如对于 Human Node 需要配置审批人配置审批环节的展示表单审批环节能够修改哪些字段哪些字段的修改要进行留痕等。3.1.3 表单设计器图片图片这种是按照表单相关数据表生成出一个表单然后对表单字段进行配置和数据绑定。图片图片这种是 DragDrop 控件然后配置控件的属性如绑定字段等。图片这种是 DragDrop 控件无需关联数据库表字段的表单图片数据表生成表单的概要流程如下图所示。图片拖拽控件绑定数据表字段的概要流程如下。图片拖拽控件无需绑定数据表字段的概要流程。使用 NoSQL 的 Document 记录或使用 RDS 提供的 JSON 类型进行保存会比较方便。图片3.1.4 接口设计结合 Activity 的接口设计如下图所示图片一些系统在创建一个流程任务的时候要先按照流程模板先创建一个应用示例再关联发起人和备注调用RuntimeService执行到 StartNode这类设计因人而异这么做略显繁琐。3.2 基于流程引擎的项目开发实践3.2.1 流程项目实践流程确定组织架构确定流程包括流程布局、审批人设置、权限确定表单信息字段、类型、数据源、校验规则和表单样式确定页面布局、样式、数据字段、搜索、导入、导出报表3.2.2 组织架构组织架构实现有两种方法一种是按照维度进行数据管理另一种是在同一棵组织架构树下进行管理。按照集团、公司、部门、用户等不同维度进行数据管理比较常见这里不做讨论。下图为按维度维护数据的示例。图片按照同一棵组织架构树进行数据维护界面一般显示为左树右表。大多数商业化产品都会将此组织架构树进行内存缓存以方便审批人查找、开窗选择 OrgUnit、Role、User、Member 等场景。Member 的引入是为了解决一人多职等场景。一般发起流程的时候需要带出发起人拥有的 Member 列表从而后续节点取合适的审批人。图片对于组织架构而言需要考虑系统本身要具备 OU 存储的能力对于没有组织架构的用户可以直接在系统的组织架构中新建组织架构。同时对于已有系统的客户可以通过组织架构数据同步来进行数据自动维护。对于用 AD 域内部管控的客户来说需要具备 AD 域身份认证的能力。对于复杂场景比如用户是 SaaS 化等复杂场景组织架构也需要在系统内部支持使用 API 的方式来获取组织信息。所以在组织架构设计的时候要使用插件的方式来做具体使用哪种插件可以在配置文件中进行配置。以下为一个商业产品的组织架构操作界面示例。图片常见的组织架构操作还有组织架构同步比如流程系统同步微信企业号、钉钉等这里不再展开。3.2.3 流程设计我们想象的流程可能是向下面的这种简单流程。图片而实际项目碰到的流程一般是如下图所示的情景。图片初步看几个流程的模型文件是什么样的先有个印象。图片?xml version1.0 encodingUTF-8 ? definitions iddefinitions targetNamespacehttp://activiti.org/bpmn20 xmlnshttp://www.omg.org/spec/BPMN/20100524/MODEL xmlns:xsihttp://www.w3.org/2001/XMLSchema-instance xmlns:activitihttp://activiti.org/bpmn process idvacationRequest nameVacation request startEvent idrequest activiti:initiatoremployeeName extensionElements activiti:formProperty idnumberOfDays nameNumber of daystypelong value1 requiredtrue/ activiti:formProperty idstartDate nameFirst day of holiday (dd-MM-yyy) datePatterndd-MM-yyyy hh:mmtypedate requiredtrue / activiti:formProperty idvacationMotivation nameMotivationtypestring / /extensionElements /startEvent sequenceFlow idflow1 sourceRefrequest targetRefhandleRequest / userTask idhandleRequest nameHandle vacation request documentation ${employeeName} would like to take ${numberOfDays} day(s) of vacation (Motivation: ${vacationMotivation}). /documentation extensionElements activiti:formProperty idvacationApproved nameDo you approve this vacationtypeenum requiredtrue activiti:value idtrue nameApprove / activiti:value idfalse nameReject / /activiti:formProperty activiti:formProperty idmanagerMotivation nameMotivationtypestring / /extensionElements potentialOwner resourceAssignmentExpression formalExpressionmanagement/formalExpression /resourceAssignmentExpression /potentialOwner /userTask sequenceFlow idflow2 sourceRefhandleRequest targetRefrequestApprovedDecision / exclusiveGateway idrequestApprovedDecision nameRequest approved? / sequenceFlow idflow3 sourceRefrequestApprovedDecision targetRefsendApprovalMail conditionExpression xsi:typetFormalExpression${vacationApproved true}/conditionExpression /sequenceFlow task idsendApprovalMail nameSend confirmation e-mail / sequenceFlow idflow4 sourceRefsendApprovalMail targetReftheEnd1 / endEvent idtheEnd1 / sequenceFlow idflow5 sourceRefrequestApprovedDecision targetRefadjustVacationRequestTask conditionExpression xsi:typetFormalExpression${vacationApproved false}/conditionExpression /sequenceFlow userTask idadjustVacationRequestTask nameAdjust vacation request documentation Your manager has disapproved your vacation request for${numberOfDays} days. Reason: ${managerMotivation} /documentation extensionElements activiti:formProperty idnumberOfDays nameNumber of days value${numberOfDays}typelong requiredtrue/ activiti:formProperty idstartDate nameFirst day of holiday (dd-MM-yyy) value${startDate} datePatterndd-MM-yyyy hh:mmtypedate requiredtrue / activiti:formProperty idvacationMotivation nameMotivation value${vacationMotivation}typestring / activiti:formProperty idresendRequest nameResend vacation request to manager?typeenum requiredtrue activiti:value idtrue nameYes / activiti:value idfalse nameNo / /activiti:formProperty /extensionElements humanPerformer resourceAssignmentExpression formalExpression${employeeName}/formalExpression /resourceAssignmentExpression /humanPerformer /userTask sequenceFlow idflow6 sourceRefadjustVacationRequestTask targetRefresendRequestDecision / exclusiveGateway idresendRequestDecision nameResend request? / sequenceFlow idflow7 sourceRefresendRequestDecision targetRefhandleRequest conditionExpression xsi:typetFormalExpression${resendRequest true}/conditionExpression /sequenceFlow sequenceFlow idflow8 sourceRefresendRequestDecision targetReftheEnd2 conditionExpression xsi:typetFormalExpression${resendRequest false}/conditionExpression /sequenceFlow endEvent idtheEnd2 / /process /definitions一个屏幕截图都截不完的流程如果用代码去实现整个流程其工作量和效率可想而知。而实际做项目使用基于流程引擎的产品来做项目的时候只需要确定节点、节点配置、数据配置和权限即可。问题一般流程都带有邮件通知的节点如何实现邮件通知节点请考虑以下情景。“流程流转和执行的时候会遇到各种情况的错误比如找不到审批人等此时流程引擎要对数据做 rollback而邮件通知节点的业务逻辑已经执行过了。权限方面对于流程资源哪些部门可以申请哪些角色不可申请都应该做流程控制。而在流程执行过程中流程数据、不是路程的相关人也都不应该看到流程处理过流程的审批人不可以再对流程进行处理等都是权限方面要考虑的问题。3.2.4 表单设计如下图所示的表单可以分析以下一个流程表单有多个主表信息和多个子表信息。一般而言如果是通过流程引擎做非流程的数据处理子表通过主表 ID 来做关联如果通过流程引擎做流程的数据处理子表和主表通过 TaskId 来做关联。以下为示例。图片流程系统需要表单设计器一个流程的不同节点可以挂接不同的表单以方便不同角色的人关注不同维度的流程信息3.2.5 页面设计一般而言对于流程的发起、审批、历史记录等都是通用的系统界面。而一些业务场景需要单独做列表界面以方便使用。对于已有门户系统的客户需要融合其界面样式。以下为曾经做过的项目示例。图片图片3.2.6 报表由于不是所有客户都有报表系统所以流程系统需要具备一个基本的报表功能。下图为示例。图片有报表系统的客户可以使用其商业版报表系统获取直接取、数仓数据进行展示。常见的报表系统有 FineReport、Tableau、PowerBI 等。3.3 BPM 流程引擎架构设计3.3.1 流程引擎的架构设计图片3.3.2 发起流程图片流程引擎处理过程图片执行节点处理过程图片问题在流程引擎处理过程中如果一个节点有多条连线如何寻找 FromNodeId 是某个 Node 的连线人工处理时指定连线 text3.4 流程引擎架构设计图片3.4.1 业务识别识别业务场景中的配置项使用集合或分组的方式让业务可配置支撑业务流程过程的可配置化支撑业务场景中的数据自动处理3.4.2 流程引擎的实现资源相关服务资源加载资源保存资源加密等配置项相关服务PVM 虚拟机的实现即通过某个节点发起时为开始节点作为初始节点按照某个连线的 action 进行节点的自动执行的虚拟机数据配置、数据权限流程数据和业务数据的自动处理4 商业机会Business Process Analysis (BPA) 流程分析帮助企业进行流程调整和优化Process Assets LibraryPAL流程资产库对企业流程进行知识化沉淀将制度和流程落地做绑定让审批人知晓流程中对应的职责Process Simulate 流程模拟自动化测试Process Forecast 流程预测低代码平台更广泛的机会在于业务领域 流程引擎比如DevOps、RPA、应用与服务编排、数据编排、FaaS 编排等。 欢迎加入小哈的星球你将获得:专属的项目实战多个项目 / 1v1 提问 /Java 学习路线 /学习打卡 / 每月赠书 / 社群讨论新项目《Spring AI 项目实战》正在更新中..., 基于 Spring AI Spring Boot 3.x JDK 21;《从零手撸仿小红书微服务架构》 已完结基于 Spring Cloud Alibaba Spring Boot 3.x JDK 17..., 点击查看项目介绍演示地址http://116.62.199.48:7070/《从零手撸前后端分离博客项目全栈开发》2期已完结,演示链接http://116.62.199.48/;专栏阅读地址https://www.quanxiaoha.com/column截止目前累计输出 100w 字讲解图 4013 张还在持续爆肝中..后续还会上新更多项目目标是将 Java 领域典型的项目都整一波如秒杀系统, 在线商城, IM 即时通讯Spring Cloud Alibaba 等等戳我加入学习解锁全部项目已有4500小伙伴加入1. 我的私密学习小圈子从0到1手撸企业实战项目~ 2. Redis 只会用缓存16种妙用让同事直呼牛X 3. 滴滴二面怎么解决 Redis 缓存和数据库的一致性问题 4. 中国最难入职的八家 IT 公司最近面试BAT整理一份面试资料《Java面试BATJ通关手册》覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。 获取方式点“在看”关注公众号并回复 Java 领取更多内容陆续奉上。PS因公众号平台更改了推送规则如果不想错过内容记得读完点一下“在看”加个“星标”这样每次新文章推送才会第一时间出现在你的订阅列表里。 点“在看”支持小哈呀谢谢啦