什么是流程编排?
流程编排就是将接口或者一段复杂的业务代码拆分成一个个节点/步骤然后聚合成一条执行链,流程编排适合复杂的业务系统,列如电商交易系统。
名词
-
流程: 执行处理的整个过程(通常可以理解为一个接口,如下单接口)
-
节点/步骤:一个完整的流程可以分为多个节点,每个节点可以完成单一的业务行为,比如下单流程中的限流、限购、拆单等。一个节点通常是一个类或者spring bean。
-
上下文:将节点返回的数据设置到上下文context中,让后续节点能够获取到相关数据(如拆单节点需要获取到初始化购物车节点中的信息)
流程编排的优缺点
优点
-
实现代码重用。一个公共节点可以在多套流程中复用
2.符合设计模式单一职责,开闭原则思想。一个节点只需要聚焦某一块业务上,如果产品需要在新增一个需求,只需要在新增一个节点,不需要再原先节点上进行修改。
3.方便理解业务。通过xml配置配上每个节点的注释很好的能够帮助新同学理解该流程实现的过程
<bean id="obmTradeCreateTradeExecutorFlow" class="com.beibei.ws.trade.flow.SequenceTradeStageExecutorFlow">
<property name="paramCheckStageList">
<list>
<!--入参校验-->
<ref bean="tradeCreateParamsCheckStage"/>
<!--用户限流-->
<ref bean="tradeCreateUserLimitStage"/>
<!--发票入参校验-->
<ref bean="tradeCreateInvoiceCheckStage"/>
<!--余额校验-->
<ref bean="tradeCreateBalanceCheckStage"/>
</list>
</property>
缺点:
1.增加代码编写和理解的难度(毕竟新增一个节点需要新起一个类)
流程示例:
代码实现
uml关系图:
TradeFlowParam:流程入参
TradeFlowResult:流程出参
TradeFlowContext:流程上下文,用于传递各个节点数据
TradeExecutorFlow:流程编排接口,只有一个execute方法
TradeStageExecutorFlow:流程编排抽象类,用于定制整套流程模板执行顺序
SequenceTradeStageExecutorFlow:具体实现类
TradeExecutorFlow:
public interface TradeExecutorFlow<I extends TradeFlowParam, O extends TradeFlowResult> { O execute(I param); }
SequenceTradeStageExecutorFlow:
/**
* 顺序执行 trade stage 编排执行器
*/
public class SequenceTradeStageExecutorFlow exten