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

告别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-08-26 12:47:44
李宗伟警告:有诉求走正规渠道,绝不接受要挟

李宗伟警告:有诉求走正规渠道,绝不接受要挟

杨晨大神
2026-08-28 12:20:42
广东:废止公安派出所消防监督检查规定

广东:废止公安派出所消防监督检查规定

靠山屯闲话
2026-08-28 12:32:36
国内成品油价今晚上调,加满一箱油多花14.5元

国内成品油价今晚上调,加满一箱油多花14.5元

界面新闻
2026-08-28 14:59:45
每天从城市厕所中排出的大量粪便,最终都被排到哪里去了?

每天从城市厕所中排出的大量粪便,最终都被排到哪里去了?

向航说
2026-08-26 11:10:48
余文乐宣布离婚

余文乐宣布离婚

扬子晚报
2026-07-20 14:21:04
前皇马22岁4000万前锋加西亚在英格兰,表现出色,2场2球

前皇马22岁4000万前锋加西亚在英格兰,表现出色,2场2球

福酱的小时光
2026-08-28 18:25:04
孙宇晨,美梦成真

孙宇晨,美梦成真

巴山侃侃
2026-08-28 01:30:29
湖北学霸杨元元带母上学,最终厕所自缢身亡,活生生被母亲吸干血

湖北学霸杨元元带母上学,最终厕所自缢身亡,活生生被母亲吸干血

青杉依旧啊啊
2026-08-26 15:49:20
哈佛揭秘:毁掉孩子自律的元凶,不是贪玩,是泛滥的廉价多巴胺

哈佛揭秘:毁掉孩子自律的元凶,不是贪玩,是泛滥的廉价多巴胺

户外阿毽
2026-08-27 01:41:54
多名院士呼吁快停止食用,吃一口等于14斤塑料袋,女子因肾衰走了

多名院士呼吁快停止食用,吃一口等于14斤塑料袋,女子因肾衰走了

任医生聊健康
2026-06-18 22:00:09
凌晨仍在医院!39岁赵丽颖被紧急送医,难堪的事出现,主持人曝内情

凌晨仍在医院!39岁赵丽颖被紧急送医,难堪的事出现,主持人曝内情

赶鸭子上架
2026-08-26 15:23:02
专家警告:每天吃一根香蕉,就等于给心脏“踩刹车”?真相来了!

专家警告:每天吃一根香蕉,就等于给心脏“踩刹车”?真相来了!

侯医生谈健康
2026-08-27 15:20:06
金正恩访问越南,乘专列耗时65时40分,为什么不坐飞机?大有讲究

金正恩访问越南,乘专列耗时65时40分,为什么不坐飞机?大有讲究

文史达观
2025-07-05 06:45:03
30多国宣布:准备向乌克兰派兵

30多国宣布:准备向乌克兰派兵

闪电新闻
2026-08-26 15:53:26
逃到海外3年,丁玉梅再迎噩耗,原来许家印还给她留了一张底牌

逃到海外3年,丁玉梅再迎噩耗,原来许家印还给她留了一张底牌

翰飞观事
2026-08-27 12:12:21
卫冕冠军坐冷板凳!肖国栋的遭遇,值得斯诺克国内赛事反思

卫冕冠军坐冷板凳!肖国栋的遭遇,值得斯诺克国内赛事反思

小欣欣聊体育
2026-08-27 13:17:18
大结局!常州星宇批量劝退应届毕业生风波,人力资源总监被停职,网友:代价之低,令人发指

大结局!常州星宇批量劝退应届毕业生风波,人力资源总监被停职,网友:代价之低,令人发指

火山詩话
2026-08-26 10:07:43
65岁宋丹丹被曝做财产公证,坐拥12亿资产,每月给儿孙80万生活费,却没给现任丈夫赵玉吉留一分。

65岁宋丹丹被曝做财产公证,坐拥12亿资产,每月给儿孙80万生活费,却没给现任丈夫赵玉吉留一分。

背包旅行
2026-08-26 15:33:59
“无比幸运又沉重的一天”,西藏吉隆口岸带客导游称换行程救了命

“无比幸运又沉重的一天”,西藏吉隆口岸带客导游称换行程救了命

极目新闻
2026-08-27 07:46:47
2026-08-28 19:47:00
Java精选
Java精选
一场永远也演不完的戏
1800文章数 3859关注度
往期回顾 全部

科技要闻

AI牛马永不下班!OpenAI让智能体自己找活

头条要闻

湖北21岁大学生3年考了100本证书 自称三本证"最难啃"

头条要闻

湖北21岁大学生3年考了100本证书 自称三本证"最难啃"

体育要闻

曼城花1个亿,买下了摩洛哥的“国民女婿”

娱乐要闻

景甜分手风波,网友:难怪张继科抽身

财经要闻

刑自强:AI投资下半场中国蓄势待发

汽车要闻

东风日产NX8“喜柿橙意”限定色正式上市

态度原创

手机
旅游
健康
本地
公开课

手机要闻

2799元起!海信墨水屏5G手机A10系列发布:可磁吸彩色LCD背屏

旅游要闻

旅业采购 | 寻找上海入境旅行社、韩国酒店资源等合作

脑出血两大夺命风险,早治早保命!

本地新闻

昆明的雨,解锁汪曾祺的浪漫雨季

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版