网易首页 > 网易号 > 正文 申请入驻

告别if-else噩梦!流程编排技术真的太香了!

0
分享至

Java精选面试题(微信小程序):5000+道面试题和选择题,真实面经简历模版,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计、大厂真题等,在线随时刷题!

作为一个优秀的程序员,要守住职业的底线。能简单快速的完成的一件事,就一定要用简单的方案快速完成。不可过度的设计,始终保持系统的简洁!

曾几何时,我对于流程编排这件事 嗤之以鼻,为什么呢?我认为流程编排是典型地过度设计。

在我看来,代码越直观越可靠,我不喜欢看代码的时候跳来跳去。但是流程编排后,要把各个方法放到扩展类,通过组合各个扩展类新建一个流程,实现业务功能,这能有什么好处呢?

直到我来到一个中台团队,才意识到流程编排能力是保命的能力。

业务中台要接入很多的业务方,每个业务方并不是完全相同。很多时候无法完全复用,需要改造系统适应新的业务。

新增业务代码时,务必要保证原有业务不受影响,如果没有流程编排能力,就会充斥大量的 if else 。

if (biz == BizA || biz == BizB) {
//do some thing
//这部分逻辑相同
if (biz == BizA) {
//差异化处理
}
if(biz == BizB) {
//差异化逻辑
}
}

例如上面的代码,不同的业务线若有差异化逻辑,需要新增分支单独处理。想象一下,当有 10 多个业务接入了你的系统,那么一定让人抓狂……

任何一个人都无法保证对 10 多种业务完全熟悉,每个人可能只负责 1 个业务,然而如果没有代码逻辑的隔离,维护者只能在千丝万缕中,才能找到目标代码逻辑。更可怕的是,每次新增一个业务,需要在原有的屎山中继续,不断新增 if else。直到有一天,有一个倒霉蛋改错了代码,导致其他重要业务受影响,引发线上故障。

想象一下,当你改了几行代码以后,要求测试同学,回归10 多个业务线的全部逻辑?这显然不现实。

以上的问题和痛点可归纳为:代码隔离性和业务扩展点问题。解决这两类问题有如下手段!

  • 使用流程引擎,为不同的业务配置不同的流程执行链

  • 使用插件扩展引擎,不同的业务实现差异化部分。

MemberClub 中大量使用流程引擎和插件扩展引擎解决业务隔离性和扩展性 问题。

MemberClub是托管在Gitee平台的开源项目,提供了付费会员的交易解决方案,在各类购买场景下提供各类会员形态的履约及售后结算能力,具体介绍可参见

https://gitee.com/juejinwuyang/memberclub

配置流程执行链

考虑到不同的会员产品交易提单流程不同,不同的产品应配置不同的流程,DemoMemberPurchaseExtension实现了购买扩展点,并且定义了三个流程执行链的配置方式。如截图所示~


定义流程节点

流程节点中的方法包括processsuccessrollbackcallback方法。


流程执行

流程执行时 需提供流程上下文对象。调用FlowChain.execute方法即可


实际执行阶段,各个流程节点被流程引擎串联起来依次执行,类似于责任链的设计模式,具体执行顺序如下图所示。

依次执行每个流程节点的process方法,若process方法出现异常,则执行rollback方法。若所有的process方法执行成功,则倒序依次执行success方法。


流程引擎执行原理

以下是FlowChain.execute方法执行原理。

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("当前流程:{} 发出 Skip请求,后续流程不再执行", 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执行异常,忽略 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 执行异常,忽略 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执行异常,忽略 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平台的开源项目,提供了付费会员的交易解决方案,在各类购买场景下提供各类会员形态的履约及售后结算能力,一个非常好的项目,适合用来学习业务中台系统,具体介绍可参见

Gitee开源地址:

https://gitee.com/juejinwuyang/memberclub

GitHub开源地址:

https://github.com/juejin-wuyang/memberclub

在这个项目中你可以学习到 SpringBoot 集成 以下框架或组件。

  • Mybatis-plus

  • Sharding-sphere 多数据源分库分表

  • Redis/redisson

  • Apollo

  • Springcloud(feign/enreka)

  • RabbitMQ

  • H2 内存数据库

  • Swagger

  • Lombok+MapStruct

同时你也可以学习到以下组件的实现原理

  • 流程引擎

  • 扩展点引擎

  • 分布式重试组件

  • 通用日志组件

  • 商品库存

  • 分布式锁组件

  • Redis Lua的使用

  • Spring 上下文工具类

来源:https://juejin.cn/post/7469330882945318922

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

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.

相关推荐
热点推荐
黑丝好看还是光腿好看:把这个问题还给提问的人

黑丝好看还是光腿好看:把这个问题还给提问的人

疾跑的小蜗牛
2026-04-25 22:09:42
海狮08上市了,价格没冲高反而压到20万出头,技术配置却拉满

海狮08上市了,价格没冲高反而压到20万出头,技术配置却拉满

芭比衣橱
2026-04-26 18:44:57
爱吃西红柿的要留意,我也后悔没早点看到,很重要,记得告诉家人

爱吃西红柿的要留意,我也后悔没早点看到,很重要,记得告诉家人

江江食研社
2026-04-26 00:00:04
“大龄剩女”正在集体消失!不是嫁人了,是被现实一巴掌扇到隐形

“大龄剩女”正在集体消失!不是嫁人了,是被现实一巴掌扇到隐形

王二哥老搞笑
2026-04-23 18:52:04
蜜语纪:要不是聂予诚患胃癌,鲁贞贞永远不知许蜜语的报复有多狠

蜜语纪:要不是聂予诚患胃癌,鲁贞贞永远不知许蜜语的报复有多狠

慢半拍sir
2026-04-26 23:51:12
2-2,9分钟连丢2球,国米爆冷遭意甲第12逼平,无缘5连胜

2-2,9分钟连丢2球,国米爆冷遭意甲第12逼平,无缘5连胜

俯身冲顶
2026-04-27 05:22:35
再遭四大皆空!记者:姆巴佩已身心俱疲,他来皇马本想夺全部冠军

再遭四大皆空!记者:姆巴佩已身心俱疲,他来皇马本想夺全部冠军

兰亭墨未干
2026-04-26 17:22:08
宋祖儿刘宇宁的分手真相!

宋祖儿刘宇宁的分手真相!

八卦疯叔
2026-04-24 11:09:42
比小法强太多!切尔西瞄准“欧洲最佳主帅”,清湖要变天了?

比小法强太多!切尔西瞄准“欧洲最佳主帅”,清湖要变天了?

澜归序
2026-04-27 01:16:19
87岁刘诗昆:住美国600平豪宅,和三婚妻子儿女双全,享天伦之乐

87岁刘诗昆:住美国600平豪宅,和三婚妻子儿女双全,享天伦之乐

白面书誏
2026-04-22 14:46:57
未来10年最吃香的 “铁饭碗”,这6个行业,抓住一个终身躺赢!

未来10年最吃香的 “铁饭碗”,这6个行业,抓住一个终身躺赢!

细说职场
2026-04-25 19:55:42
普贤菩萨曾言:无名指超过食指的人,这一生注定有6件事躲不过

普贤菩萨曾言:无名指超过食指的人,这一生注定有6件事躲不过

卡西莫多的故事
2025-11-13 09:54:48
张檬儿子周岁宴排面拉满,爸爸全程温柔抱哄,被全家宠成小宝贝

张檬儿子周岁宴排面拉满,爸爸全程温柔抱哄,被全家宠成小宝贝

黔乡小姊妹
2026-04-26 09:35:09
老师多次提醒:军校是没有回头路的,如果因为军队待遇好而报考,建议别报!

老师多次提醒:军校是没有回头路的,如果因为军队待遇好而报考,建议别报!

谭老师地理大课堂
2026-04-24 00:05:13
77岁资深艺人加拿大抱孙享天伦,曾被TVB封杀

77岁资深艺人加拿大抱孙享天伦,曾被TVB封杀

老好人的愤怒
2026-04-26 20:44:34
可乐再次被关注!医生发现:高血压者喝可乐,不用多久或有6变化

可乐再次被关注!医生发现:高血压者喝可乐,不用多久或有6变化

荆医生科普
2026-04-14 15:08:47
749局退休人员自述:秦岭恶龙事件,从发现到斩杀仅用了三天

749局退休人员自述:秦岭恶龙事件,从发现到斩杀仅用了三天

千秋文化
2026-04-10 20:03:43
高峰也没想到,他当年抛弃的儿子,如今开始给那英争光了

高峰也没想到,他当年抛弃的儿子,如今开始给那英争光了

趣文说娱
2026-01-04 16:34:24
21岁击败王菲的童颜巨乳富婆,巅峰期却选择主动过气

21岁击败王菲的童颜巨乳富婆,巅峰期却选择主动过气

悠悠说世界
2026-04-25 14:03:58
火车下铺被大妈霸占,我补票去软卧。半小时后,硬卧那边打起来了

火车下铺被大妈霸占,我补票去软卧。半小时后,硬卧那边打起来了

瓜哥的动物日记
2026-04-27 04:40:20
2026-04-27 06:12:49
Java精选
Java精选
一场永远也演不完的戏
1786文章数 3859关注度
往期回顾 全部

科技要闻

涨价浪潮下,DeepSeek推动AI“价格战”

头条要闻

特朗普内阁又一女部长落马:强迫男下属为其提供性服务

头条要闻

特朗普内阁又一女部长落马:强迫男下属为其提供性服务

体育要闻

森林狼3比1掘金:逆境中杀出了多孙穆?!

娱乐要闻

仅次《指环王》的美剧,有第二季

财经要闻

事关新就业群体,中办、国办发文

汽车要闻

预售19.38万元起 哈弗猛龙PLUS七座版亮相

态度原创

数码
旅游
时尚
艺术
军事航空

数码要闻

三星Tab S12系列进入固件测试阶段 或配10500mAh大电池

旅游要闻

2000余场特色活动邀市民欢度五一

比阔腿裤还时髦?今年夏天一定要有“这条裤子”,减龄又松弛

艺术要闻

72米舞台被拆!华晨宇这次玩文旅,翻车了!

军事要闻

伊朗总统:不会在压力、威胁下进行谈判

无障碍浏览 进入关怀版