流程编排、如此简单-通用流程编排组件JDEasyFlow介绍
作者:李玉亮
JDEasyFlow是企業(yè)金融研發(fā)部自研的通用流程編排技術(shù)組件,適用于服務編排、工作流、審批流等場景,該組件已開源(https://github.com/JDEasyFlow/jd-easyflow),目前在部門的內(nèi)部業(yè)務系統(tǒng)和科技輸出系統(tǒng)中廣泛應用,其他部門也有使用。
它的特點是簡單、靈活、易擴展,開發(fā)人員一般30分鐘可入門上手,半天可掌握其原理。它分為一個核心模塊和若干擴展模塊,模塊之間松耦合,開發(fā)使用時可按需選擇、快速集成、漸進式應用,同時支持JSON內(nèi)置規(guī)范和BPMN規(guī)范。它的實現(xiàn)原理也有其特色,后面有介紹。
支持的場景功能
節(jié)點流轉(zhuǎn)類型
支持順序流轉(zhuǎn)、條件流轉(zhuǎn)、循環(huán)流轉(zhuǎn)等。
節(jié)點功能類型
支持腳本節(jié)點、用戶節(jié)點和消息節(jié)點。
? **腳本節(jié)點:**節(jié)點執(zhí)行時運行一段代碼腳本
? **用戶節(jié)點:**根據(jù)用戶的操作指令觸發(fā)節(jié)點執(zhí)行
? **消息節(jié)點:**接收消息后觸發(fā)節(jié)點執(zhí)行
節(jié)點串并類型
支持串行執(zhí)行、并行執(zhí)行、串并組合執(zhí)行等。
流程交互場景
支持單次交互一次執(zhí)行多節(jié)點、多次交互一次執(zhí)行一節(jié)點、多次交互一次執(zhí)行多節(jié)點等。
子流程場景
JDEasyFlow支持子流程的場景,可將把復雜的流程節(jié)點拆分為子流程,便于業(yè)務邏輯抽象。
?
審批流程場景
JDEasyFlow提供了流程任務審批的能力;常用的審批、撤銷、駁回、會簽、加簽等功能都可支持;內(nèi)置了簡單的動態(tài)表單。既支持從頁面發(fā)起和操作流程任務,也支持API的方式,京東OA審批系統(tǒng)也有對接。
功能架構(gòu)
整體功能架構(gòu)
JDEasyFlow的功能架構(gòu)如下圖,功能模塊之間松耦合, 開發(fā)時可按需選擇、快速集成、漸進式應用**。**最簡單的使用方式為只在業(yè)務應用端引入jar包使用流程引擎。如果需要流程可視化功能,可集成BPMN規(guī)范模塊,如果還需要流程實例持久化、流程定義持久化等更豐富功能,則可以集成其他相關模塊。
流程引擎模塊
JDEasyFlow的核心模塊,此模塊提供了基于JSON格式的JDEasyFlow規(guī)范進行流程編排的能力,其他模塊均基于該模塊擴展,相當于流程執(zhí)行的發(fā)動機、CPU。該功能模塊為獨立組件,無數(shù)據(jù)庫依賴,應用中引入jar包便可使用。
BPMN規(guī)范模塊
提供了基于BPMN規(guī)范進行流程定義和可視化的能力,流程可視化基于[bpmn-js](Web-based tooling for BPMN, DMN, CMMN, and Forms | bpmn.io),其本質(zhì)為提供了將BPMN格式流程定義轉(zhuǎn)換為JDEasyFlow格式的能力。該模塊為獨立組件,僅依賴流程引擎模塊,無數(shù)據(jù)庫和服務依賴,應用中引入jar包便可使用。
目前可支持常用的BPMN元素:
? **任務:**腳本任務、用戶任務、消息任務
? **事件:**開始事件、結(jié)束事件、消息接收事件
? **網(wǎng)關:**排他網(wǎng)關、并行網(wǎng)關、包容網(wǎng)關
流程定義和實例管理模塊
流程定義模塊支持流程定義的中心化、版本化管理,流程實例模塊支持流程實例的持久化和生命周期管理。該功能依賴數(shù)據(jù)庫,有服務端和ERP管理端。
任務/審批模塊
支持任務生成、任務分配等功能,常用的審批、撤銷、駁回、會簽、加簽等功能都可支持。該功能依賴數(shù)據(jù)庫,有服務端和ERP管理端。
系統(tǒng)架構(gòu)
整體系統(tǒng)架構(gòu)
JDEasyFlow的完整系統(tǒng)架構(gòu)如下,主要有三個端:業(yè)務應用端、流程服務端、流程管理端,三個端可部署在單體應用中,也可分開部署。
中間件依賴
· 關系型數(shù)據(jù)庫(如Mysql)
· 緩存(如Redis或R2M)
· 服務通訊框架(如Java API調(diào)用或Http調(diào)用或JSF調(diào)用)
數(shù)據(jù)庫數(shù)據(jù)模型比較簡單清晰,見下圖:
性能說明
· 如果僅是服務編排場景,則流程的執(zhí)行僅依賴內(nèi)存和CPU,并且是在流程客戶端執(zhí)行,性能上依賴于客戶端服務器的性能,普通筆記本實測1秒可執(zhí)行一個流程請求的1w+個節(jié)點,1秒可執(zhí)行1萬+次含1個節(jié)點的流程請求
· 如果需要流程狀態(tài)管理和流程持久化功能,流程引擎在執(zhí)行時會到流程服務端查詢和保存流程實例和流程節(jié)點的狀態(tài),性能上主要依賴于數(shù)據(jù)庫的查詢和插入效率
· 對于流程任務審批功能,流程的任務審批流轉(zhuǎn)是在服務端執(zhí)行,一方面取決于流程服務端的計算性能,另一方面同樣取決于數(shù)據(jù)庫的查詢和插入效率
可伸縮性說明
· 流程引擎屬于無狀態(tài),可隨應用實例線性伸縮
· 流程服務端應用實例支持線性擴展
· 流程數(shù)據(jù)庫可通過分庫分表的方式支持大數(shù)據(jù)量的增長
實踐建議
在具體實踐中,建議部署統(tǒng)一的流程中心(見下圖),對流程定義統(tǒng)一管理。各系統(tǒng)的應用只需集成流程客戶端jar包進行流程節(jié)點開發(fā)和流程調(diào)用便可。如果系統(tǒng)只使用任務審批的功能,則只需要通過API和消息與流程中心交互便可。
使用示例
流程引擎使用示例
在源碼的test目錄下有quickstart測試用例(easyflow\easyflow-flow\src\test\java\com\jd\easyflow\flow\quickstart\QuickStartTest.java),可直接運行或調(diào)試以了解使用方式和運行原理。具體實踐步驟如下:
1、代碼中引入easyflow-flow jar包,以maven為例:
<dependency><groupId>com.jd.easyflow</groupId><artifactId>easyflow-flow</artifactId><version>{替換為最新版本}</version> </dependency>2、編寫流程定義文件,以node001->node002→node003的執(zhí)行順序為例:
{"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節(jié)點動作類。完整的流程定義配置項可見: Flow engine usage · JDEasyFlow/jd-easyflow Wiki · GitHub (公網(wǎng))
3、編寫應用啟動時加載流程引擎的代碼
???FlowEngineImpl flowEngine =?new?FlowEngineImpl();flowEngine.setFlowPath("classpath:flow/quickstart/quickstart_001.json");flowEngine.init();Spring環(huán)境可直接定義FlowEngineImpl bean.
4、編寫具體流程調(diào)用執(zhí)行的代碼
????FlowParam param =?new?FlowParam("quickstart_001");FlowResult result = flowEngine.execute(param);完整測試用例的執(zhí)行結(jié)果打印如下:
[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:node003BPMN模塊使用示例
打開easyflow-flow-bpmn/BPMNDesigner.html流程設計器. 點擊導入按鈕,導入easyflow-flow-bpmn/src/test/resources/flow/quickstart/quickstart_001.bpmn文件,可在設計器中看到和以上JSON定義等價的BPMN流程定義.
代碼集成使用時只需要將FlowEngineImpl的flowParser設置為BpmnFlowParser.
更多
以上只是流程引擎和BPMN模塊的簡單使用示例,JDEasyFlow還包含其他模塊、可支持很多的配置項和使用場景,更多使用可見最后的對接使用介紹.
實現(xiàn)原理
目前市面上的流程編排組件基本都是基于圖(邊和頂點)結(jié)構(gòu)的,而本組件是參考了計算機指令執(zhí)行模型而實現(xiàn),借鑒了程序計數(shù)器的實現(xiàn)原理,引擎內(nèi)部通過類似程序計數(shù)器(PC)的待執(zhí)行節(jié)點棧來維護后繼節(jié)點;可以理解為是一種高級業(yè)務編程語言,它同時也是圖靈完備的。
流程引擎核心模型名詞只有一個:**節(jié)點(Node),**節(jié)點的功能為執(zhí)行邏輯并輸出后續(xù)節(jié)點 。
開發(fā)態(tài)可定義有限的節(jié)點,通過每個節(jié)點與其后續(xù)節(jié)點連接形成有向圖;運行態(tài)按規(guī)則邏輯進行節(jié)點流轉(zhuǎn),支持并行執(zhí)行,支持順序、條件或循環(huán),支持fork-join。
概念:
? **流程:**一個業(yè)務流程的抽象
? **節(jié)點:**流程的組成單位,一個節(jié)點能夠執(zhí)行節(jié)點動作同時可返回后繼節(jié)點
節(jié)點內(nèi)部構(gòu)件:
節(jié)點內(nèi)部構(gòu)件的組成是可自定義的,流程引擎提供了缺省實現(xiàn),其內(nèi)部構(gòu)件包括了前處理器(PreHandler)、節(jié)點動作(NodeAction)、后處理器(PostHandler)
? **前處理器:**判斷該節(jié)點是否可以執(zhí)行動作
? **節(jié)點動作:**真實的業(yè)務功能處理
? **后處理器:**負責計算后續(xù)節(jié)點
流程引擎執(zhí)行邏輯
流程引擎有一個或多個流程觸發(fā)節(jié)點,流程觸發(fā)后執(zhí)行如下邏輯:
1. 初始化流程上下文
2. 得到流程起始節(jié)點ID,放入執(zhí)行棧
3. 如果執(zhí)行棧為空,則返回,否則執(zhí)行當前節(jié)點
預檢查
執(zhí)行Action
計算后繼節(jié)點ID并返回
4. 將后繼節(jié)點放入執(zhí)行棧,從棧中取出待執(zhí)行節(jié)點,跳到第3步
因此JDEasyFlow整體的特色為簡單:
? 模型簡單:核心模型概念就是節(jié)點的流轉(zhuǎn)
? 擴展簡單:提供了監(jiān)聽器、過濾器功能,方便橫向切面;節(jié)點支持自定義實現(xiàn)
? 定義簡單:只需要通過JSON進行節(jié)點流轉(zhuǎn)邏輯配置便可,也支持BPMN格式
? 運行簡單:代碼調(diào)用流程引擎,傳入流程ID和業(yè)務參數(shù)便可
? 使用簡單:引入組件包便可使用,比較輕量
適用場景和對接使用說明
適用場景
理論上JDEasyFlow可滿足任何流程場景,它主要可解決三類問題:
? **流程可編排:**將業(yè)務流程抽象為軟件流程,保證軟件是現(xiàn)實的真實反映;不同場景可定義不同流程,且流程易修改
? **功能松耦合:**將業(yè)務節(jié)點抽象為軟件流程節(jié)點,一方面實現(xiàn)功能的松耦合,另一方面實現(xiàn)節(jié)點的可復用
? **流程可視化:**所見即所得,方便業(yè)務產(chǎn)品人員和軟件研發(fā)人員基于同一語言的交流,也便于流程監(jiān)控
在實際軟件系統(tǒng)開發(fā)過程中,如果有如下訴求,可考慮使用流程編排:
? 業(yè)務流程是有明顯的多個節(jié)點組成
? 希望流程可靈活變更
? 業(yè)務流程級別比程序流程高一層,在編程語言級別難以聚合和治理(如一個流程即需要前臺操作,又有外系統(tǒng)參與,又有后臺操作,在實現(xiàn)上入口分散)
對接使用
JDEasyFlow的所有文檔可見: https://github.com/JDEasyFlow/jd-easyflow/wiki (公網(wǎng))
歡迎大家對接使用,有相關使用問題可聯(lián)系: liyuliang5@jd.com
總結(jié)
以上是生活随笔為你收集整理的流程编排、如此简单-通用流程编排组件JDEasyFlow介绍的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win11系统重装后无法分盘怎么解决
- 下一篇: 【Docker容器化】Docker服务编