告别if-else噩梦:流程编排技术真的太香了!

向量数据库大模型微服务

picture.image

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

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

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

直到我来到一个中台团队,才意识到流程编排能力是保命的能力。

最近建了一些工作内推群,各大城市都有,欢迎各位HR和找工作的小伙伴进群交流,群里目前已经收集了不少的工作内推岗位。

扫码加苏三的微信:li_su223,备注:所在城市,即可进群。

picture.image

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

新增业务代码时,务必要保证原有业务不受影响,如果没有流程编排能力,就会充斥大量的 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 实现了购买扩展点,并且定义了三个流程执行链的配置方式。如截图所示~

picture.image

定义流程节点

流程节点中的方法包括 processsuccessrollbackcallback方法。

picture.image

流程执行

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

picture.image

实际执行阶段,各个流程节点被流程引擎串联起来依次执行,类似于责任链的设计模式,具体执行顺序如下图所示。

依次执行每个流程节点的 process 方法,若 process 方法出现异常,则执行 rollback 方法。若所有的 process 方法执行成功,则倒序依次执行 success方法。

picture.image

流程引擎执行原理

以下是 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 上下文工具类

来源:juejin.cn/post/7469330882945318922

最后欢迎加入苏三的星球,你将获得:商城微服务实战、AI开发项目课程、苏三AI项目、秒杀系统实战、商城系统实战、秒杀系统实战、代码生成工具、系统设计、性能优化、技术选型、底层原理、Spring源码解读、工作经验分享、痛点问题、面试八股文等多个优质专栏。

还有1V1答疑、修改简历、职业规划、送书活动、技术交流。

扫描下方二维码,即可加入星球(非常有价值的一次决定):

picture.image

目前星球已经更新了5200+篇优质内容,还在持续爆肝中.....

星球已经被官方推荐了3次,收到了小伙伴们的一致好评。戳我加入学习,已有1700+小伙伴加入学习。

最后推荐一下我的技术专栏《性能优化35讲》,里面包含了:接口调用、Java、JVM、并发编程、MySQL、Redis、ElasticSearch、Spring、SpringBoot等多个性能优化技巧。无论在工作,还是在面试中,都会经常遇到,非常有参考价值。

picture.image

picture.image

0
0
0
0
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论