SpringBoot集成LiteFlow實現輕量級工作流引擎

LiteFlow 是一款專注于邏輯驅動流程編排的輕量級框架,它以組件化方式快速構建和執行業務流程,有效解耦復雜業務邏輯。通過支持熱加載規則配置,開發者能夠即時調整流程步驟,將復雜的業務如價格計算、下單流程等拆分為獨立且可復用的組件,從而實現系統的高度靈活性與擴展性。

一、基礎概念

1.1 組件(Component)

LiteFlow 的核心概念是組件,組件是業務邏輯的最小單元。每個組件都對應一個具體的業務操作,例如“發送郵件”“計算價格”等。組件之間通過規則進行編排,形成完整的業務流程。

liteflow 的組件在規則文件中即對應的節點,組件對應的種類有很多,具體的如下所示:

  • 普通組件

普通組件需要集成的是 NodeComponent, 可以用在 when 和 then 邏輯中,具體的業務需要在 process 中去執行。同時在 node 節點中,可以覆蓋 iaAccess 方法,表示是否進入該節點執行業務邏輯,isContinueOnError 判斷在出錯的情況下是否繼續執行下一個組件,默認為 false。 isEnd 方法表示是否終止流程,默認為true。

  • 選擇組件

選擇組件是通過業務邏輯來判斷接下來的動作要執行哪一個節點,類似于 Java中的 switch , 在代碼中則需要繼承 NodeSwitchComponent 實現 processWitch 方法來處理業務。

# flow 規則表達式 選擇組件
SWITCH(a).to(b, c);
# processWitch 表達式需要返回的是 b 或者 c 字符串來執行相應的業務邏輯
# flow 規則表達式 條件組件
IF(x, a, b);
  • 條件組件

條件組件稱之為 if 組件,返回的結果是 true 或者 false, 代碼需要集成 NodeIfComponent 重寫 processIf 方法,返回對應的業務節點,這個和選擇組件類似。

在官方文檔中,還有次數循環組件,條件循環組件,循環迭代組件,和退出循環組件,其應用場景比較復雜,可以使用簡單的普通組件來替代,畢竟是輕量級的規則引擎,主要作用就是為了編排流程順序,復雜的場景就升級使用工作流了

1.2 規則(Rule)

規則定義了組件之間的執行順序和條件。LiteFlow 支持多種規則文件格式,如 XML、JSON、YAML 等,也支持從本地文件系統、數據庫、ZooKeeper、Nacos、Apollo 等多種方式加載規則。

在我上一段實習中,就是通過Apollo配置不同場景下的多種任務編排實現實時生效

# 文件編排, then 代表串行執行  when 表示并行執行
# 串行編排示例
THEN(a, b, c, d);
# 并行編排示例
WHEN(a, b, c);
# 串行和并行嵌套結合
THEN( a, WHEN(b, c, d), e);
# 選擇編排示例
SWITCH(a).to(b, c, d);
# 條件編排示例
THEN(IF(x, a),b );

1.3 上下文(Context)

上下文用于在組件之間傳遞數據。LiteFlow 提供了靈活的上下文機制,可以在流程執行過程中存儲和共享數據。這里實際上在代碼里定義一個全局變量在整個流程中進行流傳即可

1.4 參數配置

liteflow 中,需要配置的內容有規則文件地址,節點重試(執行報錯時可以進行重試,類似于 spring-retry), 流程并行執行線程池參數配置,流程的請求ID配置。

liteflow:# 規則文件 失敗重試次數 打印執行日志 監控日志ruleSource : liteflow/*.el.xmlretry-count: 0print-execution-log: truemonitor:enable-log: trueperiod: 300000request-id-generator-class: com.platform.orderserver.config.AppRequestIdGenerator# 上下文的最大數量槽slot-size : 10240# 線程數,默認為64main-executor-works: 64# 異步線程最長等待時間 秒when-max-wait-seconds: 15# when 節點全局異步線程池最大線程數when-max-workers: 16# when 節點全局異步線程池隊列數when-queue-limit: 5120# 在啟動的時候就解析規則parse-on-start: trueenable: true

二、基礎用法

2.1 引入依賴

在 Spring Boot 項目中,可以通過以下方式引入 LiteFlow 依賴:

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

2.2 定義組件

通過 @LiteflowComponent 注解定義組件,并實現具體的業務邏輯

@LiteflowComponent("sendEmail")
public class SendEmailComponent extends NodeComponent {@Overridepublic void process() throws Exception {System.out.println("發送郵件");}
}

2.3 編寫規則文件

flow.xml 文件中定義規則,也可以在代碼中自定義實現EL規則

xml定義方式

<flow><chain name="test_flow">THEN(prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone));</chain>
</flow>

代碼中定義方式

import com.yomahub.liteflow.core.NodeComponent;
import com.yomahub.liteflow.el.ELBus;
import com.yomahub.liteflow.el.ThenELWrapper;
import com.yomahub.liteflow.flow.LiteflowResponse;
import com.yomahub.liteflow.slot.DefaultContext;
import com.yomahub.liteflow.spring.SpringFlowExecutor;
import org.springframework.beans.factory.annotation.Autowired;import java.util.ArrayList;
import java.util.List;
import java.util.Map;public class LiteFlowDemo {@Autowiredprivate SpringFlowExecutor flowExecutor;public void buildAndExecuteFlow() {// 假設有一個配置列表,每個配置項對應一個處理器List<Map<String, Object>> configList = new ArrayList<>();configList.add(Map.of("name", "processor1"));configList.add(Map.of("name", "processor2"));// 假設有一個處理器名稱映射表Map<String, String> processorNameMap = Map.of("processor1", "component1","processor2", "component2");// 構建 EL 表達式ThenELWrapper finalEL = ELBus.then();for (int i = 0; i < configList.size(); i++) {Map<String, Object> config = configList.get(i);String name = (String) config.get("name");if (!processorNameMap.containsKey(name)) {System.out.println("No component exists for name: " + name);continue;}String processor = processorNameMap.get(name);finalEL.then(ELBus.node(processor).data("param" + i, "data" + i));}// 執行流程LiteflowResponse response = flowExecutor.execute2Resp("mainFlow", new DefaultContext());if (response.isSuccess()) {System.out.println("Flow executed successfully");} else {System.out.println("Flow execution failed");}}
}

2.4 執行流程

通過 FlowExecutor 執行流程:

LiteflowResponse response = flowExecutor.execute2Resp("test_flow", new DataRequest());

三、適用場景

LiteFlow 適用于擁有復雜邏輯的業務場景,例如:

  • 電商下單流程:包括訂單創建、庫存扣減、支付處理、通知發送等多個步驟。
  • 價格計算引擎:根據不同的規則和條件計算商品價格。
  • 數據處理流程:在數據處理中,需要按順序執行多個步驟。

四、與 Java 設計模式的相似性

4.1 策略模式

LiteFlow 的組件類似于策略模式中的策略類,可以根據不同的規則動態選擇執行的組件。

4.2 模板方法模式

LiteFlow 的流程定義類似于模板方法模式中的模板方法,定義了業務流程的骨架,而具體的組件實現則類似于模板方法中的具體步驟。

4.3 責任鏈模式

LiteFlow 的組件可以通過規則進行串聯,類似于責任鏈模式中的責任鏈,每個組件負責處理一部分邏輯。

五、實戰使用

5.1 電商訂單處理案例

假設在一個電商系統中,訂單完成后需要進行積分發放、消息發送,并行發送短信和郵件。可以通過以下方式實現:

xml

<flow><chain name="orderCompleteFlow">THEN(prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone));</chain>
</flow>

5.2 動態規則更新

LiteFlow 支持熱加載規則文件,可以在不重啟應用的情況下更新規則。例如,將規則文件存儲在數據庫或配置中心(如 Nacos),修改規則后可以實時生效。

5.3 監控與日志

LiteFlow 提供了詳細的執行日志和監控功能,可以記錄每個組件的執行時間、執行結果等信息,方便排查問題。

5.4 高級特性

  • 組件降級:在某些組件執行失敗時,可以選擇降級處理。
  • 組件繼承:可以通過繼承的方式復用組件邏輯。
  • 組件回滾:在流程執行失敗時,可以選擇回滾到之前的步驟。

六、總結

LiteFlow 是一個功能強大且靈活的規則引擎框架,適用于復雜的業務流程編排。通過組件化的方式,可以將復雜的業務邏輯拆分為獨立的組件,通過規則進行編排,實現系統的高度靈活性和擴展性。同時,LiteFlow 提供了豐富的功能,如熱加載、監控、日志等,方便開發者使用。

擴展問題自測

1. LiteFlow 的核心概念是什么?它是如何實現規則編排的?

LiteFlow 是將復雜邏輯抽解為一個個可復用的組件化,通過組件間的自由搭配實現靈活編排。以及利用Apollo或Nacos這些注冊中心進行實時熱更新

組件間的自由搭配是通過規則鏈實現的

{"chainId": "recommendChain","name": "推薦鏈路","condition": "A > B > C "
}

總結:通過 組件化 + 規則鏈 實現編排,通過注冊中心監聽配置變更實現熱更新

2. LiteFlow 規則節點(Component)的執行機制是怎樣的?支持哪些執行模式?

  1. 執行機制
  • 初始化組件,通過@LiteflowComponent 組件進行組件注冊
  • 解析規則鏈:解析規則鏈中組件執行鏈路
  • 執行規則鏈
  1. 執行模式
  • 順序模式:"condition": "A > B > C" ABC順序執行
  • 并行執行:"condition": "A && B && C" 我們的業務中,對商品的多路召回就是并行的
  • 選擇執行 "condition": "A | B | C" 只執行多個流程中最先完成的組件
  • 條件執行 "condition": "A WHEN(B > C)"A 先執行,然后判斷是否執行 B > C 這條鏈路。

適用于 根據外部參數動態決定執行路徑

  • FOR 循環 "condition": "FOR(A, 3)" 適用于 重復性任務,如輪詢、批量處理等
  • WHILE 循環 "condition": "WHILE(A, isContinue())" 適用于 動態決策的業務場景,如輪詢、流式處理
  • 失敗處理 "condition": "A THEN(B) A 失敗后,會執行 B 作為補償措施。適用于 容錯、降級、回滾等場景

3. LiteFlow 的規則是如何定義和加載的?

三種方式進行規則定義與加載

  • json格式,在配置文件進行配置
  • xml格式,同上
  • java代碼中動態注冊規則鏈(推薦系統目前使用方式)

4. LiteFlow 規則流轉時,如何保證數據在多個節點之間的傳遞?

LiteFlow實際上也是參考了責任鏈模式,通過一個全局變量作為上下文進行數據流轉。LiteFlow里這個上下文變量叫做Slot(上下文容器)

LiteFlow 的 Slot 是一個 線程隔離的上下文容器,用于存儲和管理整個流程中的數據,類似于 ThreadLocal,但更適用于 流程級別的數據共享

每次執行規則鏈時,LiteFlow 都會為當前執行實例創建一個 獨立的 Slot,不同的請求不會相互影響。

LiteFlow 通過 ThreadLocal + 對象池 機制來管理 Slot,確保:

  • 每個請求擁有獨立的 Slot 實例,數據不會互相污染。
  • Slot 復用機制 提高性能,避免頻繁創建對象。

總結

LiteFlow 通過 Slot(數據槽)在多個節點之間傳遞數據,相當于流程級別的全局上下文。

Slot 的作用類似責任鏈模式中的 Context,存儲數據供整個規則鏈使用。

每個請求擁有獨立的 Slot,避免線程安全問題,同時通過對象池優化性能。

5. LiteFlow 支持哪些異步執行模式?如何處理異步任務之間的依賴?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902952.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902952.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902952.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

38 python random

在實際中,我們常常會用到隨機的概念,比如 模擬抽獎活動(如:月度優秀員工抽獎)生成測試數據(如:隨機考勤時間、隨機銷售額)打亂數據順序(如:隨機分配任務到人)Python 的random模塊就像你的 "隨機事件生成器",幫你輕松創建各種隨機數據 一、基礎操作:從隨…

附贈二張圖,闡述我對大模型的生態發展、技術架構認識。

文章精煉&#xff0c;用兩張圖說明大模型發展業態方向&#xff0c;以及大模型主體技術架構。&#xff08;目前還需要進一步驗證我的Thought && ideas&#xff0c;等待機會吧.........&#xff09; 圖一&#xff1a;探究大模型三個層次應用方向&#xff0c;淺層次入門簡…

2025上海車展 | 移遠通信全棧車載智能解決方案重磅亮相,重構“全域智能”出行新范式

2025年4月23日至5月2日&#xff0c;第二十一屆上海國際汽車工業展覽會在國家會展中心&#xff08;上海&#xff09;盛大啟幕。作為車載智能解決方案領域的領軍企業&#xff0c;移遠通信以“全域智能 馭見未來”為主題&#xff0c;攜豐富的車載解決方案及客戶終端驚艷亮相8.2館8…

告別 “幻覺” 回答:RAG 中知識庫與生成模型的 7 種對齊策略

一、引言 大語言模型&#xff08;LLM&#xff09;在文本生成領域展現出驚人能力&#xff0c;但 “幻覺” 問題&#xff08;生成虛構或偏離事實的內容&#xff09;始終是落地應用的核心挑戰。檢索增強生成&#xff08;RAG&#xff09;通過將外部知識庫與 LLM 結合&#xff0c;形…

項目筆記2:post請求是什么,還有什么請求

在 HTTP&#xff08;超文本傳輸協議&#xff09;中&#xff0c;請求方法用于向服務器表明客戶端想要執行的操作。POST 請求是其中一種常見的請求方法&#xff0c;此外還有 GET、PUT、DELETE 等多種請求方法&#xff0c;下面為你詳細介紹&#xff1a; POST 請求 定義&#xff…

中間系統-鄰居建立,數據庫同步

ISIS鄰居狀態&#xff1a; 1、Down&#xff1a;接口一旦啟用ISIS協議之后就是Down狀態 2、Init&#xff1a;收到了鄰居的Hello報文后&#xff0c;發現了鄰居。 3、up&#xff1a;收到了鄰居的Hello報文&#xff0c;并且在鄰居的hello報文中發現了自己。 ISIS鄰居建立的條件&…

玩轉Docker | Docker部署LMS輕量級音樂工具

玩轉Docker | Docker部署LMS輕量級音樂工具 前言一、LMS介紹LMS簡介主要特點二、系統要求環境要求環境檢查Docker版本檢查檢查操作系統版本三、部署LMS服務下載鏡像創建容器創建容器檢查容器狀態檢查服務端口安全設置四、訪問LMS服務訪問LMS首頁注冊賬號五、基本使用上傳音樂文…

AR行業應用案例與NXP架構的結合

1. 工業巡檢AR頭盔 場景示例&#xff1a;寧德核電基地使用AR智能頭盔進行設備巡檢&#xff0c;通過實時數據疊加和遠程指導&#xff0c;將工作效率提升35%。頭盔需處理傳感器數據、圖像渲染和低延遲通信1。 NXP架構支持&#xff1a; 協處理器角色&#xff1a;NXP i.MX RT系列M…

【Harmony OS】組件

目錄 組件概述 組件常用屬性 系統內置組件 Text TextArea 多行文本輸入框組件 TextInput 文本輸入框 Button Image 圖片組件&#xff0c;支持本地圖片和網絡圖片 Radio 單選框 Checkbox 復選框 Blank 空白填充組件 Divider 分隔符 PatternLock 圖案密碼鎖組件 Prog…

Flutter Dart 集合類型List Set Map詳解軍 以及循環語句 forEaclh map where any every

List基礎用法 var list1 ["西瓜", "蘋果", "香蕉", true, 0];var list2 <String>["西瓜", "蘋果", "香蕉"];List list3 ["西瓜", "蘋果", "香蕉"];list3.add("草莓&…

在網上找的資料怎樣打印出來?

在數字化時代&#xff0c;我們經常需要從互聯網上獲取各種資料&#xff0c;無論是學術論文、工作文檔還是學習資料。然而&#xff0c;如何高效地將這些網上的資料打印出來&#xff0c;卻是一個值得探討的問題。本文將為您提供一個全面的解決方案&#xff0c;幫助您輕松完成網上…

2025年計算機視覺與智能通信國際會議(ICCVIC 2025)

2025 International Conference on Computer Vision and Intelligent Communication 一、大會信息 會議簡稱&#xff1a;ICCVIC 2025 大會地點&#xff1a;中國杭州 收錄檢索&#xff1a;提交Ei Compendex,CPCI,CNKI,Google Scholar等 二、會議簡介 2025年計算機視覺與智能通…

程序員思維體操:TDD修煉手冊

程序員思維體操&#xff1a;TDD修煉手冊 ——從"先寫代碼"到"測試先行"的認知革命 一、重新認識TDD&#xff1a;不僅僅是寫測試 什么是TDD&#xff08;測試驅動開發&#xff09; TDD其實很簡單&#xff0c;不要看名字很高級復雜&#xff0c;傳統開發是直…

建筑節能成發展焦點,樓宇自控應用范圍持續擴大

在全球能源危機日益嚴峻、環保意識不斷增強的大環境下&#xff0c;建筑節能已成為建筑行業發展的核心議題。從大型商業綜合體到普通住宅&#xff0c;從公共建筑到工業廠房&#xff0c;節能需求貫穿建筑全生命周期。而樓宇自控系統憑借其對建筑設備的智能化管理和精準調控能力&a…

嵌入式軟件--stm32 DAY 3

0、GPIO回顧 GPIO&#xff0c;通用型輸入輸出&#xff0c;控制stm32輸入輸出的引腳&#xff0c;統稱GPIO。 主功能是默認的功能 復用的功能在芯片里都是由連線的&#xff0c;有聯系才能復用。所以GPIO引腳能復用的功能只能是它默認復用功能和重定義功能。一般都使用默認功能…

點云從入門到精通技術詳解100篇-基于二次誤差和高斯混合模型的點云配準算法

目錄 知識儲備 結合二次誤差度量與高斯混合模型的點云配準 算法核心創新點: 關鍵參數說明: 性能優化建議: 前言 國內外研究現狀 全局配準算法的國內外研究 局部配準算法的國內外研究 2 點云配準相關概念與方法 2.1 什么是點云配準 2.2 點云的獲取及點云主要數據…

linux系統問題雜談

1.配置好anaconda之后&#xff0c;在一個終端中編輯好環境變量之后能夠正常使用conda命令&#xff0c;但是新打開一個中斷使用conda命令報錯"無法識別conda"。 原因&#xff1a;使用“export PATH"/home/username/anaconda3/bin:$PATH"命令&#xff0c;臨…

【中級軟件設計師】函數調用 —— 傳值調用和傳地址調用 (附軟考真題)

【中級軟件設計師】函數調用 —— 傳值調用和傳地址調用 (附軟考真題) 目錄 【中級軟件設計師】函數調用 —— 傳值調用和傳地址調用 (附軟考真題)一、歷年真題二、考點&#xff1a;函數調用 —— 傳值調用和傳地址調用&#x1f53a;1、傳值調用&#x1f53a;2、傳引用(地址)調…

Spring Cloud Gateway 如何將請求分發到各個服務

前言 在微服務架構中&#xff0c;API 網關&#xff08;API Gateway&#xff09;扮演著非常重要的角色。它負責接收客戶端請求&#xff0c;并根據預定義的規則將請求路由到對應的后端服務。Spring Cloud Gateway 是 Spring 官方推出的一款高性能網關&#xff0c;支持動態路由、…

打造高功率、高電流和高可靠性電路板的厚銅PCB生產

厚銅PCB生產是指制作一種具有較厚銅層的PCB&#xff08;Printed Circuit Board&#xff0c;印刷電路板&#xff09;。這種PCB通常用于高功率、高電流和高可靠性的電子設備中。厚銅PCB的生產過程包括以下幾個 主要步驟&#xff1a; 1. 基材準備 厚銅PCB的基材通常采用FR4或CEM-…