news 2026/5/24 4:10:09

告别if-else噩梦:流程编排技术

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
告别if-else噩梦:流程编排技术

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

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

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

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

新增业务代码时,务必要保证原有业务不受影响,如果没有流程编排能力,就会充斥大量的 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 <T> void execute(FlowChain<T> chain, T context) { Exception exception = null; int index = -1; for (FlowNode<T> 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<T> 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<T> 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<T> 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 上下文工具类

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/21 11:20:03

软件测试—即时通讯测试方法

一、即时通讯实现方式 1.短轮询&#xff08;Short Polling&#xff09; 短轮询是一种客户端定期向服务器发送HTTP请求以检查是否有新数据的简单技术。无论服务器是否有新数据&#xff0c;客户端都会在固定的时间间隔后再次请求。 实现机制 客户端向服务器发送HTTP请求&#xff…

作者头像 李华
网站建设 2026/5/23 18:38:04

免费在线制作家庭小户型平面图的详细教程和设计模板大全

良功绘图网站 (https://www.lghuitu.com ) 一、引言&#xff1a;小户型平面图设计的核心价值与工具选择逻辑 在房价高企的当下&#xff0c;小户型住宅成为众多家庭的首选。如何在有限的空间内实现功能与美观的平衡&#xff0c;平面图设计是关键第一步。一份精准的小户型平面图…

作者头像 李华
网站建设 2026/5/20 22:27:23

小型工厂工艺流程图制作_在线设计装配/焊接/冲压工艺流程模板

良功绘图网站 (https://www.lghuitu.com ) 在小型工厂的日常运营中&#xff0c;工艺流程图是连接生产环节、规范操作标准、提升效率的核心工具。无论是装配、焊接还是冲压等核心生产流程&#xff0c;一份清晰、准确的工艺流程图能帮助工厂梳理工序逻辑、减少操作失误、降低沟通…

作者头像 李华
网站建设 2026/5/23 5:28:36

大语言模型训练原理解析:ChatGPT背后的技术原理与应用价值

大语言模型训练分为三步&#xff1a;预训练阶段通过互联网数据训练基础预测模型&#xff1b;监督微调阶段通过问答数据让模型学会回答问题&#xff1b;强化学习阶段让模型自行探索最佳解法&#xff0c;产生思维链。大模型本质是统计学预测器&#xff0c;通过预测下一个token生成…

作者头像 李华
网站建设 2026/5/24 0:25:05

【实时无功-有功控制器的动态性能】【带有电流控制的两级电压源变流器(VSC)】采用αβ阿尔法-贝塔转换进行电流反馈的实时无功功率控制器附Simulink仿真

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。 &#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室 &#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真…

作者头像 李华
网站建设 2026/5/22 14:49:28

Flutter for OpenHarmony:用 StatefulWidget 实现基础用户交互

Flutter for OpenHarmony&#xff1a;用 StatefulWidget 实现基础用户交互 作者&#xff1a;灰灰勇闯IT 时间&#xff1a;2026年1月 适用环境&#xff1a;OpenHarmony 4.0 Flutter for OpenHarmony SDK 本文目标&#xff1a;掌握 StatefulWidget、setState()、按钮点击、文本输…

作者头像 李华