Java精選面試題(微信小程序):5000+道面試題和選擇題,包含Java基礎、并發(fā)、JVM、線程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架構設計、大廠真題等,在線隨時刷題!
作為一個優(yōu)秀的程序員,要守住職業(yè)的底線。能簡單快速的完成的一件事,就一定要用簡單的方案快速完成。不可過度的設計,始終保持系統(tǒng)的簡潔!
曾幾何時,我對于流程編排這件事 嗤之以鼻,為什么呢?我認為流程編排是典型地過度設計。
在我看來,代碼越直觀越可靠,我不喜歡看代碼的時候跳來跳去。但是流程編排后,要把各個方法放到擴展類,通過組合各個擴展類新建一個流程,實現(xiàn)業(yè)務功能,這能有什么好處呢?
直到我來到一個中臺團隊,才意識到流程編排能力是保命的能力。
業(yè)務中臺要接入很多的業(yè)務方,每個業(yè)務方并不是完全相同。很多時候無法完全復用,需要改造系統(tǒng)適應新的業(yè)務。
新增業(yè)務代碼時,務必要保證原有業(yè)務不受影響,如果沒有流程編排能力,就會充斥大量的 if else 。
if (biz == BizA || biz == BizB) { //do some thing //這部分邏輯相同 if (biz == BizA) { //差異化處理 } if(biz == BizB) { //差異化邏輯 } }例如上面的代碼,不同的業(yè)務線若有差異化邏輯,需要新增分支單獨處理。想象一下,當有 10 多個業(yè)務接入了你的系統(tǒng),那么一定讓人抓狂……
任何一個人都無法保證對 10 多種業(yè)務完全熟悉,每個人可能只負責 1 個業(yè)務,然而如果沒有代碼邏輯的隔離,維護者只能在千絲萬縷中,才能找到目標代碼邏輯。更可怕的是,每次新增一個業(yè)務,需要在原有的屎山中繼續(xù),不斷新增 if else。直到有一天,有一個倒霉蛋改錯了代碼,導致其他重要業(yè)務受影響,引發(fā)線上故障。
想象一下,當你改了幾行代碼以后,要求測試同學,回歸10 多個業(yè)務線的全部邏輯?這顯然不現(xiàn)實。
以上的問題和痛點可歸納為:代碼隔離性和業(yè)務擴展點問題。解決這兩類問題有如下手段!
使用流程引擎,為不同的業(yè)務配置不同的流程執(zhí)行鏈
使用插件擴展引擎,不同的業(yè)務實現(xiàn)差異化部分。
MemberClub 中大量使用流程引擎和插件擴展引擎解決業(yè)務隔離性和擴展性 問題。
MemberClub是托管在Gitee平臺的開源項目,提供了付費會員的交易解決方案,在各類購買場景下提供各類會員形態(tài)的履約及售后結算能力,具體介紹可參見
https://gitee.com/juejinwuyang/memberclub
配置流程執(zhí)行鏈
考慮到不同的會員產(chǎn)品交易提單流程不同,不同的產(chǎn)品應配置不同的流程,DemoMemberPurchaseExtension實現(xiàn)了購買擴展點,并且定義了三個流程執(zhí)行鏈的配置方式。如截圖所示~
![]()
定義流程節(jié)點
流程節(jié)點中的方法包括process、success、rollback和callback方法。
![]()
流程執(zhí)行
流程執(zhí)行時 需提供流程上下文對象。調(diào)用FlowChain.execute方法即可
![]()
實際執(zhí)行階段,各個流程節(jié)點被流程引擎串聯(lián)起來依次執(zhí)行,類似于責任鏈的設計模式,具體執(zhí)行順序如下圖所示。
依次執(zhí)行每個流程節(jié)點的process方法,若process方法出現(xiàn)異常,則執(zhí)行rollback方法。若所有的process方法執(zhí)行成功,則倒序依次執(zhí)行success方法。
![]()
流程引擎執(zhí)行原理
以下是FlowChain.execute方法執(zhí)行原理。
public void execute(FlowChain chain, T context) { Exception exception = null; int index = -1; for (FlowNode node : chain.getNodes()) { try { node.process(context); index++; } catch (Exception e) { if (e instanceof SkipException) { CommonLog.warn("當前流程:{} 發(fā)出 Skip請求,后續(xù)流程不再執(zhí)行", node.getClass().getSimpleName()); break; } exception = e; break; } } if (exception != null) { for (int i = index; i >= 0; i--) { FlowNode node = chain.getNodes().get(i); try { node.rollback(context, exception); } catch (Exception e) { CommonLog.error("rollback執(zhí)行異常,忽略 name:{}", node.getClass().getSimpleName(), e); } } } else { for (int i = index; i >= 0; i--) { FlowNode node = chain.getNodes().get(i); try { node.success(context); } catch (Exception e) { CommonLog.error("success 執(zhí)行異常,忽略 name:{}", node.getClass().getSimpleName(), e); } } } for (int i = index; i >= 0; i--) { FlowNode node = chain.getNodes().get(i); try { node.callback(context, exception); } catch (Exception e) { CommonLog.error("callback執(zhí)行異常,忽略 name:{}", node.getClass().getSimpleName(), e); } } if (exception != null) { throw exception; } }以上全部代碼地址,可以參見 MemberClub:
https://gitee.com/-/ide/project/juejinwuyang/memberclub/edit/master/-/memberclub.common/src/main/java/com/memberclub/common/flow/FlowChainService.java
MemberClub是托管在Gitee平臺的開源項目,提供了付費會員的交易解決方案,在各類購買場景下提供各類會員形態(tài)的履約及售后結算能力,一個非常好的項目,適合用來學習業(yè)務中臺系統(tǒng),具體介紹可參見
Gitee開源地址:
https://gitee.com/juejinwuyang/memberclub
GitHub開源地址:
https://github.com/juejin-wuyang/memberclub
在這個項目中你可以學習到 SpringBoot 集成 以下框架或組件。
Mybatis-plus
Sharding-sphere 多數(shù)據(jù)源分庫分表
Redis/redisson
Apollo
Springcloud(feign/enreka)
RabbitMQ
H2 內(nèi)存數(shù)據(jù)庫
Swagger
Lombok+MapStruct
同時你也可以學習到以下組件的實現(xiàn)原理
流程引擎
擴展點引擎
分布式重試組件
通用日志組件
商品庫存
分布式鎖組件
Redis Lua的使用
Spring 上下文工具類
來源:https://juejin.cn/post/7469330882945318922
公眾號“Java精選”所發(fā)表內(nèi)容注明來源的,版權歸原出處所有(無法查證版權的或者未注明出處的均來自網(wǎng)絡,系轉載,轉載的目的在于傳遞更多信息,版權屬于原作者。如有侵權,請聯(lián)系,筆者會第一時間刪除處理!
最近有很多人問,有沒有讀者交流群!加入方式很簡單,公眾號Java精選,回復“加群”,即可入群!
特別推薦:專注分享最前沿的技術與資訊,為彎道超車做好準備及各種開源項目與高效率軟件的公眾號,「大咖筆記」,專注挖掘好東西,非常值得大家關注。點擊下方公眾號卡片關注。
文章有幫助的話,點在看,轉發(fā)吧!
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.