Spring Boot3集成 LiteFlow 實(shí)現(xiàn)業(yè)務(wù)流程編排
LiteFlow 是一個(gè)國產(chǎn)的輕量級的 Java 流程編排框架,旨在簡化復(fù)雜的業(yè)務(wù)邏輯處理流程。它通過定義節(jié)點(diǎn)和流程,將復(fù)雜的業(yè)務(wù)邏輯分解成多個(gè)可管理的部分,從而提高代碼的可讀性和可維護(hù)性。
今天松哥和大伙一起來聊下這個(gè)工具。
一 什么是 LiteFlow
LiteFlow 是一個(gè)基于 Java 的流程編排框架,它允許開發(fā)者定義一系列的節(jié)點(diǎn)(Node)和流程(Flow),通過這些節(jié)點(diǎn)和流程來控制業(yè)務(wù)邏輯的執(zhí)行順序。LiteFlow 的核心思想是將復(fù)雜的業(yè)務(wù)邏輯分解成多個(gè)小的、可管理的部分,每個(gè)部分負(fù)責(zé)處理特定的任務(wù)。
二 為什么需要 LiteFlow
如果你要對復(fù)雜業(yè)務(wù)邏輯進(jìn)行新寫或者重構(gòu),用LiteFlow最合適不過。它是一個(gè)編排式的規(guī)則引擎框架,組件編排,幫助解耦業(yè)務(wù)代碼,讓每一個(gè)業(yè)務(wù)片段都是一個(gè)組件。
利用 LiteFlow,你可以將瀑布流式的代碼,轉(zhuǎn)變成以組件為核心概念的代碼結(jié)構(gòu),這種結(jié)構(gòu)的好處是可以任意編排,組件與組件之間是解耦的,組件可以用腳本來定義,組件之間的流轉(zhuǎn)全靠規(guī)則來驅(qū)動(dòng)。LiteFlow 擁有開源規(guī)則引擎最為簡單的 DSL 語法。十分鐘就可上手。
圖片
而且這些組件可以實(shí)時(shí)熱更替,也可以給編排好的邏輯流里實(shí)時(shí)增加一個(gè)組件,從而改變你的業(yè)務(wù)邏輯。
圖片
2.1 LiteFlow 適用場景
LiteFlow 適用于擁有復(fù)雜邏輯的業(yè)務(wù),比如說價(jià)格引擎,下單流程等,這些業(yè)務(wù)往往都擁有很多步驟,這些步驟完全可以按照業(yè)務(wù)粒度拆分成一個(gè)個(gè)獨(dú)立的組件,進(jìn)行裝配復(fù)用變更。使用 LiteFlow,你會(huì)得到一個(gè)靈活度高,擴(kuò)展性很強(qiáng)的系統(tǒng)。因?yàn)榻M件之間相互獨(dú)立,也可以避免改一處而動(dòng)全身的這樣的風(fēng)險(xiǎn)。
2.2 LiteFlow 不適用場景
LiteFlow 只做基于邏輯的流轉(zhuǎn),而不做基于角色任務(wù)的流轉(zhuǎn)。
三 LiteFlow 實(shí)踐
假設(shè)我現(xiàn)在有一個(gè)用戶下單的需求,下單步驟我簡化成以下幾個(gè)步驟:
- 身份驗(yàn)證:驗(yàn)證用戶的身份信息,確保操作的安全性。
- 庫存檢查:檢查商品是否有足夠的庫存來滿足訂單需求。
- 價(jià)格確認(rèn):再次確認(rèn)商品的價(jià)格,防止因促銷活動(dòng)結(jié)束等原因?qū)е碌膬r(jià)格變動(dòng)。
- 創(chuàng)建訂單:如果所有條件都滿足,服務(wù)器會(huì)在數(shù)據(jù)庫中創(chuàng)建一條新的訂單記錄。
- 支付處理:根據(jù)用戶選擇的支付方式進(jìn)行相應(yīng)的處理,比如跳轉(zhuǎn)到第三方支付平臺完成支付。
- 庫存更新:一旦支付成功,更新商品的庫存信息,減少已售出的商品數(shù)量。
- 訂單確認(rèn):向用戶發(fā)送訂單確認(rèn)信息,包括訂單號、預(yù)計(jì)發(fā)貨時(shí)間等。
其中 1、5 屬于用戶節(jié)點(diǎn)要完成的內(nèi)容;2、6 屬于庫存節(jié)點(diǎn)要完成的內(nèi)容;3 屬于商品節(jié)點(diǎn)要完成的內(nèi)容;4、7 則屬于訂單節(jié)點(diǎn)要完成的內(nèi)容。
接下來我就通過 LiteFlow 來和小伙伴們演示如何完成上面的下單過程。
簡單期間,我這里就和大家演示前 4 步的流程編排。
3.1 基本用法
首先創(chuàng)建 SpringBoot 工程,引入 LiteFlow 依賴,如下:
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.12.3</version>
</dependency>
接下來我們根據(jù)前面分析的業(yè)務(wù)邏輯,創(chuàng)建四個(gè)不同的業(yè)務(wù)節(jié)點(diǎn):
@Component
public class UserNode extends NodeComponent {
@Override
public void process() {
System.out.println("用戶身份驗(yàn)證");
}
}
@Component
public class StorageNode extends NodeComponent {
@Override
public void process() {
System.out.println("庫存檢查");
}
}
@Component
public class MerchandiseNode extends NodeComponent {
@Override
public void process() {
System.out.println("價(jià)格確認(rèn)");
}
}
@Component
public class OrderNode extends NodeComponent {
@Override
public void process() {
System.out.println("訂單確認(rèn)");
}
}
然后在 classpath 下定義 liteflow.xml 文件對這些流程進(jìn)行編排:
<?xml versinotallow="1.0" encoding="UTF-8"?>
<flow>
<chain name="orderProcessChain">
THEN(userNode, storageNode, merchandiseNode, orderNode);
</chain>
</flow>
接下來在 application.properties 中加載這個(gè) xml 文件,如下:
liteflow.rule-source=classpath:liteflow.xml
接下來就可以使用這個(gè)流程了,如下:
/**
* @author:江南一點(diǎn)雨
* @site:http://www.javaboy.org
* @微信公眾號:江南一點(diǎn)雨
* @github:https://github.com/lenve
* @gitee:https://gitee.com/lenve
*/
@RestController
public class HelloController {
@Autowired
FlowExecutor flowExecutor;
@GetMapping("/hello")
public void hello() {
flowExecutor.execute2Resp("orderProcessChain");
}
}
當(dāng)我們調(diào)用 /hello 接口的時(shí)候,就會(huì)依次出發(fā)前面編排的四個(gè)服務(wù)。
3.2 條件選擇
我們可以定義一個(gè)條件選擇組件,類似下面這樣:
@LiteflowComponent("a")
public class ACmp extends NodeSwitchComponent {
@Override
public String processSwitch() throws Exception {
System.out.println("Acomp executed!");
return "c";
}
}
這個(gè)方法需要返回 String 類型,就是具體的結(jié)果,上面代碼示例了選擇到了 c 節(jié)點(diǎn)。
這個(gè)時(shí)候我們定義 xml 內(nèi)容如下:
<chain name="chain1">
SWITCH(a).to(b, c);
</chain>
這就表示先在 a 中做選擇,根據(jù) a 中 processSwitch 方法的返回值,決定去執(zhí)行 b 還是 c。
3.3 循環(huán)
LiteFlow 提供了次數(shù)循環(huán)組件。返回的是一個(gè) int 值的循環(huán)次數(shù)。主要用于 FOR...DO... 表達(dá)式。
循環(huán)組件的定義類似下面這樣:
@LiteflowComponent("f")
public class FCmp extends NodeForComponent {
@Override
public int processFor() throws Exception {
//這里根據(jù)業(yè)務(wù)去返回for的結(jié)果
}
}
循環(huán)多少次,就看方法的返回值了。
然后定義 xml 文件類似下面這樣:
<chain name="chain1">
FOR(f).DO(THEN(a, b));
</chain>
我覺得這塊可以改進(jìn)下,沒必要定義類,直接在 XML 文件中用表達(dá)式去描述 FOR 會(huì)更好一些。
另外 LiteFlow 也支持迭代、boolean 等組件,也不難,感興趣的小伙伴可以去看下文檔。
四 小結(jié)
LiteFlow 是一個(gè)強(qiáng)大的流程編排框架,它可以幫助開發(fā)者簡化復(fù)雜的業(yè)務(wù)邏輯處理。通過定義節(jié)點(diǎn)和流程,LiteFlow 使得代碼更加模塊化和易于管理。無論是簡單的任務(wù)調(diào)度還是復(fù)雜的業(yè)務(wù)流程自動(dòng)化,LiteFlow 都能提供有效的解決方案。