持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情
前言
相对复杂的业务系统中,都会存在复杂的业务逻辑编排问题,区别于oa审批流,比如说电商的营销活动,618大促活动,各种五花八门的优惠券,铜板,积分……,一系列规则约定之后才得出一个最终优惠的价格。比如说们约定优先扣红包,然后在扣支付券,支付券付的时候还有一堆的校验,比如需要达到一定的门金额,等等。
还有一种场景,比如说,会员注册实名场景, app上实名注册,实名注册可能需要调用很多三方的接口,比如风控, 比如公安证件照识别的接口,这些接口当然有些可以并发执行,有些只能串行。还有一些不同场景的实名对应的流程又有些区分。 看到这些流程产品画流程图可能都很复杂,那么在我们代码中如何去做抽象。
业务流程编排
简单的流程编排,当然可以用责任链的方法模式去做,比如Sential限流的规则校验。也可以用xml,Bean配置的方式实现一个流程的编排,也可以用模板方法的模式实现。
LiteFlow
最近发现的一个开源的轻量级的流程引擎,项目中引入了还是挺好用的, LiteFlow (yomahub.com)
DEMO
引入pom依赖
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.6.14</version>
</dependency>
流程引擎的编排
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="mainChain">
<then value="checkCmp, slotInitCmp, priceStepInitCmp"/>
<then value="promotionConvertCmp"/>
<then value="memberDiscountCmp"/>
<then value="promotionChain"/>
<then value="couponCmp"/>
<then value="postageCondCmp( postageCmp | overseaPostageCmp )"/>
<when value="priceResultCmp, stepPrintCmp"/>
</chain>
</flow>
接口层调用流程引擎计算优惠券的结果
@RequestMapping(value = "/submit", method = RequestMethod.POST)
@ResponseBody
public String submit(@Nullable @RequestBody String reqData){
try{
PriceCalcReqVO req = JSON.parseObject(reqData,PriceCalcReqVO.class);
LiteflowResponse<PriceSlot> response = flowExecutor.execute2Resp("mainChain", req, PriceSlot.class);
return response.getSlot().getPrintLog();
}catch (Throwable t){
t.printStackTrace();
return "error";
}
}
总结
liteflow 很好的满足了普通业务系统中复杂流程的设计和编排,简化了代码实现的难度,是一个小而美的开源流程引擎编排的框架