找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

975

积分

0

好友

139

主题
发表于 5 天前 | 查看: 10| 回复: 0

作为程序员,应遵循简洁设计原则,避免过度工程化。然而,在处理复杂业务逻辑时,简单的if-else语句可能导致代码维护困难,尤其在多业务线系统中。

起初,我对流程编排技术持保留态度,认为它可能引入不必要的复杂性。但加入中台团队后,我意识到流程编排对于处理业务差异化和扩展性至关重要。业务中台需接入众多业务方,每个都有独特需求,如果没有良好的代码隔离机制,系统将充斥大量if-else分支,增加维护成本和错误风险。

例如,以下代码展示了不同业务线的处理逻辑:

if (biz == BizA || biz == BizB) {
    // 公共逻辑
    if (biz == BizA) {
        // 差异化处理A
    }
    if (biz == BizB) {
        // 差异化逻辑B
    }
}

当业务线增多时,这种模式会变得难以管理,测试回归成本高昂。核心问题在于代码隔离性和业务扩展性。解决方案包括使用流程引擎配置不同执行链,以及插件扩展引擎实现差异化部分。

MemberClub项目大量应用流程引擎和扩展点引擎来解决这些问题。MemberClub是一个基于Java的开源中台系统,提供会员交易解决方案,适用于学习业务中台架构和流程编排实践。

配置流程执行链

针对不同会员产品,可配置独立的流程执行链。DemoMemberPurchaseExtension实现了购买扩展点,并定义了三种流程配置方式。

配置流程执行链截图

定义流程节点

流程节点包含processsuccessrollbackcallback方法,支持灵活的业务逻辑封装。

定义流程节点截图

流程执行

执行时需提供上下文对象,调用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,可以深入理解流程引擎、扩展点引擎、分布式重试、通用日志等组件的实现原理,提升系统设计和编码能力。




上一篇:豆包AI手机深度集成与自动化操作引发的行业生态博弈
下一篇:Certimate:开源SSL证书自动化管理工具,支持ACME协议与多平台部署
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2025-12-17 19:06 , Processed in 0.114566 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表