別再用硬編碼寫業務流程了,試試這款輕量級流程編排框架
阿新 • • 發佈:2021-01-04
## 前言
在每個公司的系統中,總有一些擁有複雜業務邏輯的系統,這些系統承載著核心業務邏輯,幾乎每個需求都和這些核心業務有關,這些核心業務業務邏輯冗長,涉及內部邏輯運算,快取操作,持久化操作,外部資源調取,內部其他系統RPC呼叫等等。時間一長,專案幾經易手,維護的成本得就會越來越高。各種硬程式碼判斷,分支條件越來越多。程式碼的抽象,複用率也越來越低,各個模組之間的耦合度很高。一小段邏輯的變動,會影響到其他模組,需要進行完整迴歸測試來驗證。如要靈活改變業務流程的順序,則要進行程式碼大改動進行抽象,重新寫方法。實時熱變更業務流程?幾乎很難實現。
## 開源解決方案
說到流程引擎,開源界有大名鼎鼎的老牌開源軟體JBPM,也有近幾年非常流行的Activiti和Flowable。他們都是基於BPM協議,可以做到基於角色任務的流傳,邏輯的流轉。並且很多基於BPM協議的編輯工具都能做視覺化的編輯。
但今天我要介紹的,是一款輕量級的流程編排框架——Liteflow。
Liteflow主要致力於邏輯驅動的編排。可以滿足於大部分的生產業務場景。和以上著名的開源流程引擎相比,雖然不如他們那麼全面,但是勝在輕量,高效能和極少的學習成本。而且這些專案都是國外開源專案,整合起來相對比較重,文件本地化也做的不夠好。Liteflow擁有完善的本地文件和使用範例。能幫助你的核心繫統變得更加靈活,更加易擴充套件。是一個解耦你係統的利器。
> https://gitee.com/bryan31/liteFlow
![](https://img2020.cnblogs.com/blog/268224/202101/268224-20210104114152839-432885534.png)
## Liteflow框架的作用
Liteflow就是為解耦複雜邏輯而生,如果你要對複雜業務邏輯進行新寫或者重構,用liteflow最合適不過。它是一個輕量,快速的元件式流程引擎框架,元件編排,幫助解耦業務程式碼,讓每一個業務片段都是一個元件。
使用Liteflow,你需要去把複雜的業務邏輯按程式碼片段拆分成一個個小元件,並定義一個規則流程配置。這樣,所有的元件,就能按照你的規則配置去進行復雜的流轉。同時Liteflow支援規則檔案的熱載入,即時完成修改生效。並提供多種持久化規則的方式的擴充套件。
## Liteflow的設計原則
Liteflow是基於工作臺模式進行設計的,何謂工作臺模式?
n個工人按照一定順序圍著一張工作臺,按順序各自生產零件,生產的零件最終能組裝成一個機器,每個工人只需要完成自己手中零件的生產,而無需知道其他工人生產的內容。每一個工人生產所需要的資源都從工作臺上拿取,如果工作臺上有生產所必須的資源,則就進行生產,若是沒有,就等到有這個資源。每個工人所做好的零件,也都放在工作臺上。
這個模式有幾個好處:
- 每個工人無需和其他工人進行溝通。工人只需要關心自己的工作內容和工作臺上的資源。這樣就做到了每個工人之間的解耦和無差異性。
- 即便是工人之間調換位置,工人的工作內容和關心的資源沒有任何變化。這樣就保證了每個工人的穩定性。
- 如果是指派某個工人去其他的工作臺,工人的工作內容和需要的資源依舊沒有任何變化,這樣就做到了工人的可複用性。
- 因為每個工人不需要和其他工人溝通,所以可以在生產任務進行時進行實時工位更改:替換,插入,撤掉一些工人,這樣生產任務也能實時的被更改。這樣就保證了整個生產任務的靈活性。
這個模式對映到Liteflow框架裡,工人就是元件,工人坐的順序就是流程配置,工作臺就是上下文,資源就是引數,最終組裝的這個機器就是這個業務。正因為有這些特性,所以Liteflow能做到統一解耦的元件和靈活的裝配。
## springboot裡快速配置
Liteflow支援了springboot的自動裝配,當然Liteflow也為非springboot和非spring的專案也提供了支援,這裡僅以springboot專案為示例進行介紹:
依賴最新的依賴包:
```xml
```
配置上規則路徑:
```properties
liteflow.rule-source=config/flow.xml
```
## 定義元件
Liteflow希望使用者把複雜邏輯拆分成一個個可複用的元件,所以你得定義你的元件,元件的定義很簡單,你需要繼承`NodeComponent`類,然後實現`process` 方法就行,以下為示例:
```java
@Component("test")
public class TestComponent extends NodeComponent {
@Override
public void process() {
Slot slot = this.getSlot();//slot為這個請求的上下文
//這裡為你的業務處理邏輯
}
}
```
這裡會有童鞋問,我的業務方法需要入參和出參怎麼辦,如何傳遞呢?
Liteflow為每個執行緒都自動分配了唯一的一個slot,可以理解為上下文。想一想上面說的那個模型,每個元件不需要和其他元件進行資訊互通,所需要的引數從slot裡取就是了,同時,執行完業務邏輯之後,把結果也放入slot裡。所以每個元件都是獨立的無參構造,這樣就消除了每個元件的差異性。
這裡的slot能貫穿所有元件,每一個元件都可以訪問到slot裡所有的資料。當然每個請求之間的slot,Liteflow做了嚴格的隔離,不用擔心資料會串的問題。
Liteflow提供的預設Slot是一個弱型別的物件,這裡建議使用者自己定義一個值物件,只需要繼承`AbsSlot`類,便可成為你自己的Slot。更加貼合業務。
元件除了必須要實現的`process` 方法,還有幾個可選實現:
isAccess:表示是否進入該節點,可以用於業務引數的預先判斷
isContinueOnError:表示出錯是否繼續往下執行下一個元件,預設為false
isEnd:表示是否立即結束整個流程 ,預設為false,也可以在業務日誌里根據業務判斷來呼叫this.setIsEnd(true)來結束整個流程。
```java
@Component("test")
public class TestComponent extends NodeComponent {
@Override
public void process() {
Slot slot = this.getSlot();//slot為這個請求的上下文
//這裡為你的業務處理邏輯
}
@Override
public boolean isAccess() {
Slot slot = this.getSlot();
//這裡做你的引數檢查,如果沒獲取到必須的業務引數,就不會進入該元件
boolean checkResult = true;//模擬檢查結果為true
return checkResult;
}
@Override
public boolean isContinueOnError() {
return super.isContinueOnError();//預設為false
}
@Override
public boolean isEnd() {
return super.isEnd();//預設為false
}
}
```
你只需定義你的業務元件,之後,在啟動時,Liteflow會自動掃描到你定義的所有元件,並進行載入。
## 編輯規則檔案
實現完了元件之後,你需要定義規則檔案,之前規則檔案的路徑配置在了`config/flow.xml`中,所以我們要編輯這個檔案。
Liteflow的規則檔案定義非常簡單好理解。簡單的配置,但是能覆蓋大部分的應用場景。
先來看一個示例:
```xml
```
在Liteflow中,定義了then和when兩種執行緒執行方式,then代表序列,上面的示例中,c必須要等a執行完才能執行。when代表並行,上面的示例中,b,d同時執行。並且b,d都執行完了,下面的e,f,g才能挨個順序執行。
再來看個稍微複雜點的:
```xml
```
Liteflow提供了條件元件,這種節點的職責就是路由,根據業務邏輯來路由到b節點還是d節點。
條件元件的定義示例如下,需要去繼承`NodeCondComponent`這個類,最終返回的b就是最終要路由到的節點
```java
@Component("c")
public class CComponent extends NodeCondComponent {
@Override
public String processCond() throws Exception {
//你的業務邏輯
return "b";
}
}
```
Liteflow允許你編輯巢狀的流程,例子如下:
```xml
```
在這個例子中,這3條鏈路是串起來執行的,在xml裡,可以寫你的元件id,也可以寫流程id。配合之前的例子,是不是能表達的流程就更加豐富了點呢。
以上3個例子涵蓋了Liteflow最主要的功能,當然Liteflow還提供一些其他的特性,比如如何進行迴圈執行,如何列印步驟,並且Liteflow還提供了一個簡易的監控模組,用於統計你的元件執行情況。這裡就不一一介紹了。具體你可以點選Liteflow的Gitee主頁進行檢視:
> https://gitee.com/bryan31/liteFlow
## 示例工程
為了方便使用者的使用,Liteflow在專案裡提供了一個測試用例,你可以直接拿來跑:
![](https://img2020.cnblogs.com/blog/268224/202101/268224-20210104114207797-1735010559.png)
同時作者還做了一個帶簡單業務的示例工程,來演示如何具體實踐:
> https://gitee.com/bryan31/liteflow-example
這個簡單業務是一個電商場景的價格計算的案例,如何通過拆分元件來組合不同的影響價格的業務。並且這個示例工程還提供了一個簡單的頁面供大家進行除錯:
![](https://img2020.cnblogs.com/blog/268224/202101/268224-20210104114216886-138964411.png)
## 最後
在流程編排開源上,國內一直沒有特別著名的開源專案。Liteflow的體量雖然無法和業界著名的流程引擎相比,但是在某些場景,的確提供了輕量級的解決方案。並且Liteflow經過了公司生產大流量業務的考驗,在穩定性和效能方面有一定保障。希望Liteflow這個開源框架能幫助到有這方面業務需要的同學們。
## 關於我
我是一個開源作者,也是一名內容創作者。「元人部落」是一個堅持做原創的技術科技分享號,會一直分享原創的技術文章,陪你一起成長。關注回覆`liteflow`能加入群聊,這裡有很多大佬能和你一起探討技術,回答你的問題。
![](https://img2020.cnblogs.com/blog/268224/202101/268224-20210104114330940-7586557