當前位置: 妍妍網 > 碼農

SpringBoot引入 liteflow 規則引擎,太香了!

2024-03-01碼農

在日常的開發過程中,經常會遇到一些序列或者並列的業務流程問題,而業務之間不必存在相關性。

在這樣的場景下,使用策略和樣版模式的結合可以很好的解決這個問題,但是使用編碼的方式會使得檔太多,在業務的部份環節可以這樣操作,在計畫角度就無法一眼洞穿其中的環節和邏輯。

在本文中,將引入規則引擎從全域角度來解決這個問題,這就是今天要介紹的主角 liteflow

1 liteflow 規則引擎

liteflow 是一個輕巧而且強大的規則引擎,能夠實作開箱即用,可以在短時間內就可以完成復雜的規則編排,下圖是 liteflow 的整體架構。liteflow 支持較多的規則檔格式,比如 xml/json/yaml, 對於規則檔的儲存方式可以有sql/zk/nacos/apollo 等。

liteflow 的使用是從獲取上下文開始的,透過數據上下文來解析對應的規則檔,透過 liteflow 執行器來執行對應的鏈路,每個鏈路上都有需要執行的業務 node(即節點元件,可以支持多種語言指令碼, groovy/js/python/lua等), 各個業務node 之間是獨立的。 liteflow 對應的官方網址和依賴如下所示:

liteflow 規則引擎官方網址

  • https://liteflow.yomahub.com

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

    liteflow 可以支持如下所示的復雜流程

    此外,liteflow 可以支持熱部署,可以即時替換或者增加節點,即修改規則檔後可以即時生效。

    2 liteflow 的使用方法

    2.1 元件

    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 方法,返回對應的業務節點,這個和選擇元件類似。

    在官方文件中,還有次數迴圈元件,條件迴圈元件,迴圈叠代元件,和結束迴圈元件,作者認為其套用場景比較復雜,可以使用簡單的普通元件來替代,畢竟是輕量級的規則引擎,主要作用就是為了編排流程順序,復雜的場景就升級使用工作流了,所以這裏只介紹以上三種元件。

    2.2 EL 規則檔

    規則檔的編寫和元件的使用是對應的,這裏使用xml 的形式來編寫。

    # 檔編排, 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 );

    2.3 數據上下文

    liteflow 中,數據上下文的概念非常重要,上下文物件起到參數傳遞的作用,因為不同業務需要的輸入輸出參數是不同的,所以上下文非常的重要。

    # 執行流程時,需要傳遞el檔,初始化參數以及上下文物件,這裏的上下文可以設定多個
    LiteflowResponse response = flowExecutor.execute2Resp("chain1", 流程初始參數, CustomContext. class);

    因為上下文傳入的是一個 class 型別參數,流程參數是可以傳入參數的,一般情況下是在第一個節點中,將傳入參數設定到上下文物件中。


    2.4 參數配置

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

    liteflow:
    # 規則檔 失敗重試次數 打印執行日誌 監控日誌
    ruleSource : liteflow/*.el.xml
    retry-count: 0
    print-execution-log: true
    monitor:
    enable-log: true
    period: 300000
    request-id-generator- class: com.platform.orderserver.config.AppRequestIdGenerator
    # 上下文的最大數量槽
    slot-size : 10240
    # 執行緒數,預設為64
    main-executor-works: 64
    # 異步執行緒最長等待時間 秒
    when-max-wait-seconds: 15
    # when 節點全域異步執行緒池最大執行緒數
    when-max-workers: 16
    # when 節點全域異步執行緒池佇列數
    when-queue-limit: 5120
    # 在啟動的時候就解析規則
    parse-on-start: true
    enabletrue

    3 業務實踐

    之前介紹了 liteflow 的一些概念,在這裏結合一些業務場景來進行演示:

    主要使用電商場景的套用,訂單完成後,進行積分的發放,訊息發送,同時並列發送簡訊和信件。

    <?xml version="1.0" encoding="UTF-8"?>
    <flow>
    <chainname="test_flow">
    THEN(
    prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone)
    );
    </chain>
    </flow>

    在訂單完成之後異步執行,傳遞參數並執行相應的規則流程。

    在正式處理業務流程之前,需要先進行數據的預處理,將流程入參轉轉換成上下文物件,方便參數的傳遞和設定。

    在具體的業務處理環節,以積分發放為例,可以獲取上下文物件進行業務操作,同時也可以重寫 isAccess 方法,來判斷是否處理該節點。

    如上圖所示,具體的業務流程都可以抽象成一個 node 節點,存放在 test_flow.el.xml 中進行執行,其它的程式碼都和積分發放類似,這裏就不再贅述,可以參見程式碼。

    4 總結

    liteflow 中的絕大部份是在啟動時完成的,包括規則解析、註冊元件以及組裝資訊,其執行效能很高,同時也可以打印每個業務環節的耗時以及統計資訊。在本文中,介紹了 liteflow 的基本概念,以及具體的使用方法,具體的程式碼已經上傳到 github, 歡迎大家點贊和 stars。

    計畫 github 地址 springboot-auth [1]

    參考資料

    [1]

    springboot-auth: https://github.com/thedestiny/springboot-auth/tree/main/order-server

    來源:juejin.cn/post/7296771770098745344

    >>

    END

    精品資料,超贊福利,免費領

    微信掃碼/長按辨識 添加【技術交流群

    群內每天分享精品學習資料

    最近開發整理了一個用於速刷面試題的小程式;其中收錄了上千道常見面試題及答案(包含基礎並行JVMMySQLRedisSpringSpringMVCSpringBootSpringCloud訊息佇列等多個型別),歡迎您的使用。

    👇👇

    👇點選"閱讀原文",獲取更多資料(持續更新中