日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

别再用硬编码写业务流程了,试试这款轻量级流程编排框架

發布時間:2025/3/16 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 别再用硬编码写业务流程了,试试这款轻量级流程编排框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

在每個公司的系統中,總有一些擁有復雜業務邏輯的系統,這些系統承載著核心業務邏輯,幾乎每個需求都和這些核心業務有關,這些核心業務業務邏輯冗長,涉及內部邏輯運算,緩存操作,持久化操作,外部資源調取,內部其他系統RPC調用等等。時間一長,項目幾經易手,維護的成本得就會越來越高。各種硬代碼判斷,分支條件越來越多。代碼的抽象,復用率也越來越低,各個模塊之間的耦合度很高。一小段邏輯的變動,會影響到其他模塊,需要進行完整回歸測試來驗證。如要靈活改變業務流程的順序,則要進行代碼大改動進行抽象,重新寫方法。實時熱變更業務流程?幾乎很難實現。

開源解決方案

說到流程引擎,開源界有大名鼎鼎的老牌開源軟件JBPM,也有近幾年非常流行的Activiti和Flowable。他們都是基于BPM協議,可以做到基于角色任務的流傳,邏輯的流轉。并且很多基于BPM協議的編輯工具都能做可視化的編輯。

但今天我要介紹的,是一款輕量級的流程編排框架——Liteflow。

Liteflow主要致力于邏輯驅動的編排。可以滿足于大部分的生產業務場景。和以上著名的開源流程引擎相比,雖然不如他們那么全面,但是勝在輕量,高性能和極少的學習成本。而且這些項目都是國外開源項目,集成起來相對比較重,文檔本地化也做的不夠好。Liteflow擁有完善的本地文檔和使用范例。能幫助你的核心系統變得更加靈活,更加易擴展。是一個解耦你系統的利器。

https://gitee.com/bryan31/liteFlow


Liteflow框架的作用

Liteflow就是為解耦復雜邏輯而生,如果你要對復雜業務邏輯進行新寫或者重構,用liteflow最合適不過。它是一個輕量,快速的組件式流程引擎框架,組件編排,幫助解耦業務代碼,讓每一個業務片段都是一個組件。

使用Liteflow,你需要去把復雜的業務邏輯按代碼片段拆分成一個個小組件,并定義一個規則流程配置。這樣,所有的組件,就能按照你的規則配置去進行復雜的流轉。同時Liteflow支持規則文件的熱加載,即時完成修改生效。并提供多種持久化規則的方式的擴展。

Liteflow的設計原則

Liteflow是基于工作臺模式進行設計的,何謂工作臺模式?

n個工人按照一定順序圍著一張工作臺,按順序各自生產零件,生產的零件最終能組裝成一個機器,每個工人只需要完成自己手中零件的生產,而無需知道其他工人生產的內容。每一個工人生產所需要的資源都從工作臺上拿取,如果工作臺上有生產所必須的資源,則就進行生產,若是沒有,就等到有這個資源。每個工人所做好的零件,也都放在工作臺上。

這個模式有幾個好處:

  • 每個工人無需和其他工人進行溝通。工人只需要關心自己的工作內容和工作臺上的資源。這樣就做到了每個工人之間的解耦和無差異性。

  • 即便是工人之間調換位置,工人的工作內容和關心的資源沒有任何變化。這樣就保證了每個工人的穩定性。

  • 如果是指派某個工人去其他的工作臺,工人的工作內容和需要的資源依舊沒有任何變化,這樣就做到了工人的可復用性。

  • 因為每個工人不需要和其他工人溝通,所以可以在生產任務進行時進行實時工位更改:替換,插入,撤掉一些工人,這樣生產任務也能實時的被更改。這樣就保證了整個生產任務的靈活性。

這個模式映射到Liteflow框架里,工人就是組件,工人坐的順序就是流程配置,工作臺就是上下文,資源就是參數,最終組裝的這個機器就是這個業務。正因為有這些特性,所以Liteflow能做到統一解耦的組件和靈活的裝配。

springboot里快速配置

Liteflow支持了springboot的自動裝配,當然Liteflow也為非springboot和非spring的項目也提供了支持,這里僅以springboot項目為示例進行介紹:

依賴最新的依賴包:

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

配置上規則路徑:

liteflow.rule-source=config/flow.xml

定義組件

Liteflow希望用戶把復雜邏輯拆分成一個個可復用的組件,所以你得定義你的組件,組件的定義很簡單,你需要繼承NodeComponent類,然后實現process 方法就行,以下為示例:

@Component("test") public?class?TestComponent?extends?NodeComponent?{@Overridepublic?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)來結束整個流程。

@Component("test") public?class?TestComponent?extends?NodeComponent?{@Overridepublic?void?process()?{Slot?slot?=?this.getSlot();//slot為這個請求的上下文//這里為你的業務處理邏輯}@Overridepublic?boolean?isAccess()?{Slot?slot?=?this.getSlot();//這里做你的參數檢查,如果沒獲取到必須的業務參數,就不會進入該組件boolean?checkResult?=?true;//模擬檢查結果為truereturn?checkResult;}@Overridepublic?boolean?isContinueOnError()?{return?super.isContinueOnError();//默認為false}@Overridepublic?boolean?isEnd()?{return?super.isEnd();//默認為false} }

你只需定義你的業務組件,之后,在啟動時,Liteflow會自動掃描到你定義的所有組件,并進行加載。

編輯規則文件

實現完了組件之后,你需要定義規則文件,之前規則文件的路徑配置在了config/flow.xml中,所以我們要編輯這個文件。

Liteflow的規則文件定義非常簡單好理解。簡單的配置,但是能覆蓋大部分的應用場景。

先來看一個示例:

<chain?name="chain1"><then?value="a,c"/>?<when?value="b,d"/>?<then?value="e,f,g"/> </chain>

在Liteflow中,定義了then和when兩種線程執行方式,then代表串行,上面的示例中,c必須要等a執行完才能執行。when代表并行,上面的示例中,b,d同時執行。并且b,d都執行完了,下面的e,f,g才能挨個順序執行。

再來看個稍微復雜點的:

<chain?name="chain1"><then?value="a,c(b|d)"/>?<then?value="e,f,g"/> </chain>

Liteflow提供了條件組件,這種節點的職責就是路由,根據業務邏輯來路由到b節點還是d節點。

條件組件的定義示例如下,需要去繼承NodeCondComponent這個類,最終返回的b就是最終要路由到的節點

@Component("c") public?class?CComponent?extends?NodeCondComponent?{@Overridepublic?String?processCond()?throws?Exception?{//你的業務邏輯return?"b";} }

Liteflow允許你編輯嵌套的流程,例子如下:

<chain?name="chain1"><then?value="a,c,strategy1,g"/> </chain><chain?name="strategy1"><then?value="m(m1|m2|strategy2)"/> chain><chain?name="strategy2"><then?value="q,p(p1|p2)"/> chain>

在這個例子中,這3條鏈路是串起來執行的,在xml里,可以寫你的組件id,也可以寫流程id。配合之前的例子,是不是能表達的流程就更加豐富了點呢。

以上3個例子涵蓋了Liteflow最主要的功能,當然Liteflow還提供一些其他的特性,比如如何進行循環執行,如何打印步驟,并且Liteflow還提供了一個簡易的監控模塊,用于統計你的組件執行情況。這里就不一一介紹了。具體你可以點擊Liteflow的Gitee主頁進行查看:

https://gitee.com/bryan31/liteFlow

示例工程

為了方便用戶的使用,Liteflow在項目里提供了一個測試用例,你可以直接拿來跑:


同時作者還做了一個帶簡單業務的示例工程,來演示如何具體實踐:

https://gitee.com/bryan31/liteflow-example

這個簡單業務是一個電商場景的價格計算的案例,如何通過拆分組件來組合不同的影響價格的業務。并且這個示例工程還提供了一個簡單的頁面供大家進行調試:


最后

在流程編排開源上,國內一直沒有特別著名的開源項目。Liteflow的體量雖然無法和業界著名的流程引擎相比,但是在某些場景,的確提供了輕量級的解決方案。并且Liteflow經過了公司生產大流量業務的考驗,在穩定性和性能方面有一定保障。希望Liteflow這個開源框架能幫助到有這方面業務需要的同學們。

有道無術,術可成;有術無道,止于術

歡迎大家關注Java之道公眾號

好文章,我在看??

總結

以上是生活随笔為你收集整理的别再用硬编码写业务流程了,试试这款轻量级流程编排框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 草草影院国产 | 超碰超碰 | 91原创视频在线观看 | 久久国产精品无码网站 | 在线观看69 | 色哟哟欧美精品 | 天天爱夜夜爱 | 精品一区中文字幕 | 亚欧美日韩 | 看片国产| 欧美 日韩 人妻 高清 中文 | 亚洲25p| 催眠调教艳妇成肉便小说 | 美女裸体跪姿扒开屁股无内裤 | 亚洲国产成 | 免费色av | 我和我的太阳泰剧在线观看泰剧 | 最新永久地址 | 精品国产乱码久久久久久预案 | 99久热在线精品996热是什么 | 国产精品久久久久久久久动漫 | 三级视频在线 | 日韩不卡免费 | 国产精品夜夜夜爽张柏芝 | 亚洲精品久久视频 | 欧美又粗又深又猛又爽啪啪九色 | 成人日批 | 少妇搡bbbb搡bbb搡打电话 | xxx.国产 | 俺去久久| 亚洲永久免费观看 | 欧美成人91 | 亚洲欧美网址 | 日韩片在线 | 欧美成人视屏 | 成年视频在线 | 亚洲日本va中文字幕 | 亚洲欧美在线视频免费 | 一本色道久久综合亚洲精品小说 | 抱着老师的嫩臀猛然挺进视频 | 久爱视频在线 | 噼里啪啦国语高清 | 狠狠干一区 | 国产三级精品在线观看 | 毛片在线看网站 | 欧美精品一二三四区 | 精彩久久| 成人123 | 综合免费视频 | 综合影院| 最新福利在线 | 91欧美精品 | 大帝av| 日韩性插| 五月天久久婷婷 | 成人日韩视频 | 四虎激情 | 鲁片一区二区三区 | 久热国产视频 | 天天爽天天色 | 毛片在线免费播放 | 小视频在线播放 | 国产色爱| 欧美日韩99 | 在线观看国产一区二区 | 91综合久久 | 久久午夜无码鲁丝片午夜精品 | 久艹在线观看 | 国产乱淫av麻豆国产 | 田中瞳av | 色www亚洲国产张柏芝 | 在线精品播放 | 麻豆免费在线观看 | 男生坤坤放进女生坤坤里 | 天堂网va| 亚洲天堂区 | 国产精品二三区 | 久久精品店 | 啪啪视屏| 在线日韩精品视频 | 日韩一级大片 | 久青草视频在线观看 | 天天插天天透 | 97伦伦午夜电影理伦片 | 99热影院 | 亚洲理论在线观看 | 看全黄大色黄大片美女人 | 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 久久国产色av免费观看 | 天天干天天干 | 性色欲网站人妻丰满中文久久不卡 | 国产传媒精品 | 天天插天天干 | 波多野结衣av片 | 日韩视频在线观看一区二区三区 | 国产精品久久久久久久久久辛辛 | wwwxxx在线观看 | 欧美国产日韩视频 | 欧美在线网址 |