作为程序员,应遵循简洁设计原则,避免过度工程化。然而,在处理复杂业务逻辑时,简单的if-else语句可能导致代码维护困难,尤其在多业务线系统中。
起初,我对流程编排技术持保留态度,认为它可能引入不必要的复杂性。但加入中台团队后,我意识到流程编排对于处理业务差异化和扩展性至关重要。业务中台需接入众多业务方,每个都有独特需求,如果没有良好的代码隔离机制,系统将充斥大量if-else分支,增加维护成本和错误风险。
例如,以下代码展示了不同业务线的处理逻辑:
if (biz == BizA || biz == BizB) {
// 公共逻辑
if (biz == BizA) {
// 差异化处理A
}
if (biz == BizB) {
// 差异化逻辑B
}
}
当业务线增多时,这种模式会变得难以管理,测试回归成本高昂。核心问题在于代码隔离性和业务扩展性。解决方案包括使用流程引擎配置不同执行链,以及插件扩展引擎实现差异化部分。
MemberClub项目大量应用流程引擎和扩展点引擎来解决这些问题。MemberClub是一个基于Java的开源中台系统,提供会员交易解决方案,适用于学习业务中台架构和流程编排实践。
配置流程执行链
针对不同会员产品,可配置独立的流程执行链。DemoMemberPurchaseExtension实现了购买扩展点,并定义了三种流程配置方式。

定义流程节点
流程节点包含process、success、rollback和callback方法,支持灵活的业务逻辑封装。

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

实际执行中,流程节点按顺序串联,类似责任链设计模式。依次执行每个节点的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项目中查看。该项目托管于Gitee,集成了SpringBoot等多种框架和组件,如Mybatis-plus、Redis、Sharding-sphere、RabbitMQ等,是学习现代Java中台开发的优秀资源。
通过MemberClub,可以深入理解流程引擎、扩展点引擎、分布式重试、通用日志等组件的实现原理,提升系统设计和编码能力。