《開源精選》是我們分享Github、Gitee等開源社區中優質項目的欄目,包括技術、學習、實用與各種有趣的內容。本期推薦的是一個輕量級的規則引擎框架——LiteFlow。
在每個公司的系統中,總有一些擁有復雜業務邏輯的系統,這些系統承載著核心業務邏輯,幾乎每個需求都和這些核心業務有關,這些核心業務業務邏輯冗長,涉及內部邏輯運算,緩存操作,持久化操作,外部資源調取,內部其他系統RPC調用等等。時間一長,項目幾經易手,維護的成本就會越來越高。各種硬代碼判斷,分支條件越來越多。代碼的抽象,復用率也越來越低,各個模塊之間的耦合度很高。一小段邏輯的變動,會影響到其他模塊,需要進行完整回歸測試來驗證。如要靈活改變業務流程的順序,則要進行代碼大改動進行抽象,重新寫方法。實時熱變更業務流程,幾乎很難實現。
如何打破僵局?LiteFlow為解耦邏輯而生,為編排而生,在使用LiteFlow之后,你會發現打造一個低耦合,靈活的系統會變得易如反掌!
功能特性
- 組件定義統一: 所有的邏輯都是組件,為所有的邏輯提供統一化的組件實現方式,小身材,大能量。
- 規則輕量: 基于規則文件來編排流程,學習規則入門只需要5分鐘,一看即懂。
- 規則多樣化: 規則支持xml、json、yml三種規則文件寫法方式,喜歡哪種用哪個。
- 任意編排: 同步異步混編,再復雜的邏輯過程,利用LiteFlow的規則,都是很容易做到的,看規則文件就能知道邏輯是如何運轉的。
- 規則能從任意地方加載: 框架中提供本地文件配置源和zk配置源的實現,也提供了擴展接口,您可以把規則存儲在任何地方。
- 優雅熱刷新機制: 規則變化,無需重啟您的應用,即時改變應用的規則。高并發下不會因為刷新規則導致正在執行的規則有任何錯亂。
- 支持廣泛: 不管你的項目是不是基于Springboot,Spring還是任何其他JAVA框架構建,LiteFlow都能游刃有余。
- JDK支持: 從JDK8到JDK17,統統支持。無需擔心JDK版本。
- 腳本語言支持: 可以定義腳本語言節點,支持QLExpress和Groovy兩種腳本。未來還會支持更多的腳本語言。
- 規則嵌套支持: 只要你想得出,你可以利用簡單的表達式完成多重嵌套的復雜邏輯編排。
- 組件重試支持: 組件可以支持重試,每個組件均可自定義重試配置和指定異常。
- 上下文隔離機制: 可靠的上下文隔離機制,你無需擔心高并發情況下的數據串流。
- 聲明式組件支持: 你可以讓你的任意類秒變組件。
- 詳細的步驟信息: 你的鏈路如何執行的,每個組件耗時多少,報了什么錯,一目了然。
- 穩定可靠: 歷時2年多的迭代,在各大公司的核心系統上穩定運行。
- 性能卓越: 框架本身幾乎不消耗額外的性能,性能取決你的組件執行效率。
- 自帶簡單監控: 框架內自帶一個命令行的監控,能夠知道每個組件的運行耗時排行。
系統架構
框架優勢
如果你要對復雜業務邏輯進行新寫或者重構,用LiteFlow最合適不過。它是一個輕量,快速的組件式規則引擎框架,組件編排,幫助解耦業務代碼,讓每一個業務片段都是一個組件,并支持熱加載規則配置,實現即時修改。
LiteFlow利用規則表達式為驅動引擎,去驅動你定義的組件。你有想過類似以下的多線程流程編排該如何寫嗎?
這一切利用LiteFlow輕而易舉!框架的表達式語言學習門檻很低,但是卻可以完成超高復雜度的編排。
適用場景
不適用于哪些場景:
LiteFlow只做基于邏輯的流轉,而不做基于角色任務的流轉。如果你想做基于角色任務的流轉,推薦使用flowable,activiti這2個框架。
適用于哪些場景:
LiteFlow適用于擁有復雜邏輯的業務,比如說價格引擎,下單流程等,這些業務往往都擁有很多步驟,這些步驟完全可以按照業務粒度拆分成一個個獨立的組件,進行裝配復用變更。使用LiteFlow,你會得到一個靈活度高,擴展性很強的系統。因為組件之間相互獨立,也可以避免改一處而動全身的這樣的風險。
Springboot場景安裝運行
依賴:
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.8.2</version>
</dependency>
配置:
組件的定義:
1、在依賴了以上jar包后,你需要定義并實現一些組件,確保SpringBoot會掃描到這些組件并注冊進上下文
@Component("a")
public class ACmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
2、以此類推再分別定義b,c組件
@Component("b")
public class BCmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
@Component("c")
public class CCmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
SpringBoot配置文件:
然后,在你的SpringBoot的Application.properties或者application.yml里添加配置(這里以properties為例,yaml也是一樣的)
liteflow.rule-source=config/flow.el.xml
規則文件的定義:
同時,你得在resources下的config/flow.el.xml中定義規則
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="chain1">
THEN(a, b, c);
</chain>
</flow>
SpringBoot在啟動時會自動裝載規則文件。
執行:
聲明啟動類:
@SpringBootApplication
//把你定義的組件掃入Spring上下文中
@ComponentScan({"com.xxx.xxx.cmp"})
public class LiteflowExampleApplication {
public static void main(String[] args) {
SpringApplication.run(LiteflowExampleApplication.class, args);
}
}
然后你就可以在Springboot任意被Spring托管的類中拿到flowExecutor,進行執行鏈路:
@Component
public class YourClass{
@Resource
private FlowExecutor flowExecutor;
public void testConfig(){
LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
}
}
提示:
這個DefaultContext是默認的上下文,用戶可以用最自己的任意Bean當做上下文傳入,如果需要傳入自己的上下文,則需要傳用戶Bean的Class屬性,具體請看數據上下文這一章節。
示例
這個案例為一個價格計算引擎,其目的是模擬了電商中對訂單價格的計算。
—END—
開源協議:Apache2.0
開源地址:
https://github.com/dromara/liteflow