业务流程编排框架LiteFlow

2,151 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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>

image.png

流程引擎的编排

<?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";
    }
}

image.png

总结

liteflow 很好的满足了普通业务系统中复杂流程的设计和编排,简化了代码实现的难度,是一个小而美的开源流程引擎编排的框架