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

告别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.

相关推荐
热点推荐
不要乱接盘!今明两年,国内贬值最快的不是现金,而是这3样东西

不要乱接盘!今明两年,国内贬值最快的不是现金,而是这3样东西

三农老历
2026-07-16 04:00:07
邹市明2亿身家8年亏光!亏损项目流出,郭广昌回应妻子管钱:“你是开玩笑么,这不是过家家”

邹市明2亿身家8年亏光!亏损项目流出,郭广昌回应妻子管钱:“你是开玩笑么,这不是过家家”

火山詩话
2026-07-15 12:15:54
阿森纳拟用28岁锋将换阿尔瓦雷斯

阿森纳拟用28岁锋将换阿尔瓦雷斯

体育硬核说
2026-07-16 01:31:20
无佛得角!国足4大热身对手曝光:1支世界杯参赛队+3队亚洲3流

无佛得角!国足4大热身对手曝光:1支世界杯参赛队+3队亚洲3流

足球大腕
2026-07-16 17:09:53
一小时内,伊朗向美军航母发射111枚导弹,特朗普:不打持久战

一小时内,伊朗向美军航母发射111枚导弹,特朗普:不打持久战

临云史策
2026-07-12 14:45:37
两天内态度180度转弯,日本外相为何突然对华“服软”?

两天内态度180度转弯,日本外相为何突然对华“服软”?

飘逸语人
2026-07-16 09:10:10
环球华裔小姐王艺凝,一出场便自带焦点,身姿气质惊艳全场

环球华裔小姐王艺凝,一出场便自带焦点,身姿气质惊艳全场

娱你同欢
2026-07-03 22:20:06
二季度GDP增长4.3%,怎么看?

二季度GDP增长4.3%,怎么看?

澎湃新闻
2026-07-16 07:18:04
33岁娱乐经理生日当天离世,疑为自杀

33岁娱乐经理生日当天离世,疑为自杀

娱圈观察员
2026-07-16 00:26:10
持续半个月的相互拉扯,哈登赢得尊重和认可!詹姆斯团队该妥协了

持续半个月的相互拉扯,哈登赢得尊重和认可!詹姆斯团队该妥协了

野渡舟山人
2026-07-16 13:55:18
爱奇艺即将开播的3部电视剧,每一部都是经典,你期待哪部呢?

爱奇艺即将开播的3部电视剧,每一部都是经典,你期待哪部呢?

一个小豹子
2026-07-16 14:35:04
成都一女子不洗手抱孙子,儿媳怒斥不卫生,儿子一拳打面中,母亲扬言要儿子坐牢,儿子却说:她活该!6年后现状曝光...

成都一女子不洗手抱孙子,儿媳怒斥不卫生,儿子一拳打面中,母亲扬言要儿子坐牢,儿子却说:她活该!6年后现状曝光...

背包旅行
2026-07-02 14:33:11
凯文·凯利因何预言:未来5年,中国完全有可能造出全球最先进芯片

凯文·凯利因何预言:未来5年,中国完全有可能造出全球最先进芯片

电科技网
2026-07-15 19:55:43
满屏荷尔蒙!这一脱,又是9分新剧

满屏荷尔蒙!这一脱,又是9分新剧

i书与房
2026-07-14 07:23:57
“摸奶子”再惹争议,OPPO的流量反噬开始了

“摸奶子”再惹争议,OPPO的流量反噬开始了

品牌头版
2026-05-13 10:18:15
不下课!图赫尔自杀式出局后宣布留任 英足总满意:继续带队踢欧洲杯

不下课!图赫尔自杀式出局后宣布留任 英足总满意:继续带队踢欧洲杯

念洲
2026-07-16 09:14:56
1天3奖杯!布伦森!真的赢麻了!

1天3奖杯!布伦森!真的赢麻了!

篮球实录
2026-07-16 23:36:15
一对中国夫妇在印尼浮潜时溺亡,当地警方称2人下水时“未穿救生衣也无人监管”,目前仍在调查此事;水下救援画面曝光

一对中国夫妇在印尼浮潜时溺亡,当地警方称2人下水时“未穿救生衣也无人监管”,目前仍在调查此事;水下救援画面曝光

大象新闻
2026-07-16 18:06:06
特朗普深夜下令:若不推翻哈梅内伊接班人,美国将丢掉中东!

特朗普深夜下令:若不推翻哈梅内伊接班人,美国将丢掉中东!

离离言几许
2026-07-15 16:40:39
凌晨巨响,美国躲在后面急着撇清,两个小国偷偷点火想拖全世界下水

凌晨巨响,美国躲在后面急着撇清,两个小国偷偷点火想拖全世界下水

扬子的故事屋
2026-07-12 17:51:35
2026-07-17 00:59:00
Java精选
Java精选
一场永远也演不完的戏
1796文章数 3859关注度
往期回顾 全部

科技要闻

苹果AI终于要来了:还能追上华为豆包们吗

头条要闻

扎波罗热核电站总工遭袭身亡 被指或改变俄乌冲突性质

头条要闻

扎波罗热核电站总工遭袭身亡 被指或改变俄乌冲突性质

体育要闻

逆天6后卫神阵,图赫尔活活坑死英格兰

娱乐要闻

天下无不散宴席!白鹿官宣告别欢娱

财经要闻

韩国股市暴涨暴跌 借钱炒股的散户快疯了

汽车要闻

新一代理想L6正式上市 24.98万元 标配高阶智驾/四驱

态度原创

家居
亲子
时尚
游戏
军事航空

家居要闻

2026建博会(广州) 公装联探展交流活动

亲子要闻

老婆总是问一些很奇怪的问题,让我不知道如何回答

酒鬼之家 | 当代年轻人微醺图鉴

PS6最全爆料:2027年底 性能约PS5三倍 还有掌机

军事要闻

美对伊战事真实花费被指高达千亿美元

无障碍浏览 进入关怀版