news 2026/4/23 12:53:39

告别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/4/23 13:01:23

AI原生应用领域:思维树带来的变革

AI原生应用领域&#xff1a;思维树带来的变革 关键词&#xff1a;AI原生应用、思维树&#xff08;Tree of Thoughts&#xff09;、大语言模型、多步推理、认知架构、智能决策、生成式AI 摘要&#xff1a;传统AI应用常因“单步思维”局限于简单任务&#xff0c;而“思维树&#…

作者头像 李华
网站建设 2026/4/23 15:00:30

人群仿真软件:Vadere_(1).Vadere简介

Vadere简介 什么是Vadere Vadere是一款开源的人群仿真软件&#xff0c;专为研究和评估人群动态行为而设计。它提供了高度可配置的仿真环境&#xff0c;支持多种场景设置和人群行为模型。Vadere的主要特点包括&#xff1a; 多尺度仿真&#xff1a;Vadere可以在不同尺度上进行仿…

作者头像 李华
网站建设 2026/4/23 13:30:33

大模型学习宝典:收藏这份系统性技术框架,从零开始构建LLM

本文基于Stanford CS336课程&#xff0c;系统介绍大模型开发关键技术&#xff0c;涵盖BPE分词、网络结构设计、超参数选择、训练技巧、MoE架构、GPU优化、分布式训练及推理优化等核心内容。详细解析从LayerNorm到RMSNorm、RoPE位置编码、Flash Attention等实现方法&#xff0c;…

作者头像 李华
网站建设 2026/4/23 14:59:55

【使用Copulas对金融时间序列进行波动率估计与预测,涵盖GARCH、EWMA和EqWMA等模型】基于件风险价值(CVaR)、极值理论(EVT)、风险因子及蒙特卡洛模拟进行市场风险管理附Matlab

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

作者头像 李华
网站建设 2026/4/23 12:10:14

【数据驱动】【航空航天结构的高效损伤检测技术】一种数据驱动的结构健康监测(SHM)方法,用于进行原位评估结构健康状态,即损伤位置和程度,在其中利用了选定位置的引导式兰姆波响应附Matlab代码

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

作者头像 李华
网站建设 2026/4/23 12:15:09

兰亭妙微:以交互与网站设计之力,重塑行业门户新标杆

在数字化浪潮席卷各行业的当下&#xff0c;优质的交互设计与网站设计早已不是品牌的“加分项”&#xff0c;而是承载业务价值、提升用户体验的核心载体。兰亭妙微深耕交互设计与网站设计领域&#xff0c;凭借对行业需求的精准洞察、对设计细节的极致追求&#xff0c;为众多政企…

作者头像 李华