写在前面
这里只介绍liteflow的简单基础使用以及作者对liteflow进行可视化扩展的相关阐述
一、背景及意义
背景:对于拥有复杂业务逻辑的系统承载着核心业务逻辑,这些核心业务逻辑涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。项目几经易手,维护的成本就会越来越高。各种硬代码判断,分支条件越来越多。代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更业务流程,几乎很难实现
意义:逻辑解耦、提高扩展性、降低维护成本、能力充分复用、流程灵活编排
二、常用流程编排框架
liteflow(开源) | asyncTool(开源) | JDEasyFlow(开源) | disruptor | |
---|---|---|---|---|
介绍 | LiteFlow是一个非常强大的现代化的规则引擎框架,融合了编排特性和规则引擎的所有特性。如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。它是一个编排式的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。 | 解决任意的多线程并行、串行、阻塞、依赖、回调的并发框架,可以任意组合各线程的执行顺序,带全链路回调和超时控制。 | 通用流程编排技术组件,适用于服务编排、工作流、审批流等场景 | |
地址 | LiteFlow | asyncTool: 解决任意的多线程并行、串行、阻塞、依赖、回调的并行框架,可以任意组合各线程的执行顺序,带全链路执行结果回调。多线程编排一站式解决方案。来自于京东主App后台。 | 流程编排、如此简单-通用流程编排组件JDEasyFlow介绍-京东云开发者社区 | |
优点 | 复杂业务流程编排、社区成熟活跃 | 基于jdk8 CompletableFuture、轻量级 | 简单、灵活、易扩展 | 基于生产-消费模型、无锁设计 |
缺点 | 开源框架较重,有一定学习成本 | 新框架稳定性待验证 | 较为底层,针对业务场景需要二次封装 | |
示例 | liteflow-example: liteflow的一个业务示例工程https://gitee.com/bryan31/liteFlow |
三、liteflow基础使用
1.添加依赖jar包
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring</artifactId>
<version>2.10.4</version>
</dependency>
2.定义组件
定义组件和实现某些组件,注册进上下文
@Component("a")
public class ACmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
3.配置
添加对应的配置类及配置文件
Spring xml中的配置
<context:component-scan base-package="com.yomahub.flowtest.components" />
<bean id="springAware" class="com.yomahub.liteflow.spi.spring.SpringAware"/>
<bean class="com.yomahub.liteflow.spring.ComponentScanner"/>
<bean id="liteflowConfig" class="com.yomahub.liteflow.property.LiteflowConfig">
<property name="ruleSource" value="config/flow.el.xml"/>
</bean>
<bean id="flowExecutor" class="com.yomahub.liteflow.core.FlowExecutor">
<property name="liteflowConfig" ref="liteflowConfig"/>
</bean>
<!-- 如果上述enableLog为false,下面这段也可以省略 -->
<bean class="com.yomahub.liteflow.monitor.MonitorBus">
<property name="liteflowConfig" ref="liteflowConfig"/>
</bean>
4.规则文件的定义
--流程的定义(第3步中liteflowConfig指定了规则文件为config/flow.xml),所以需要在resources下新建文件夹config,在新建flow.xml文件,配置要定义的流程
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="chain1">
THEN(a, b, c)
</chain>
</flow>
5.执行
编排好的流程,在需要执行的地方注入FlowExecutor,执行execute2Resp
@Component
public class YourClass{
@Resource
private FlowExecutor flowExecutor;
@Test
public void testConfig(){
LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
}
}
四、liteflow在实际中的应用
这里弱化背后的实际业务只展示作者在实际中的应用案例
1.添加依赖jar包
<properties>
<liteflow-spring.version>2.8.0</liteflow-spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring</artifactId>
<version>${liteflow-spring.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
2.定义组件
定义组件和实现某些组件,注册进上下文
@LiteflowComponent("checkRealNameAuthCmp")
@LiteflowCmpDefine
public class CheckRealNameAuthCmp {
private static final Logger log = LoggerFactory.getLogger(CheckRealNameAuthCmp.class);
@LiteflowMethod(LiteFlowMethodEnum.PROCESS)
public void process(NodeComponent nodeComponent) throws Exception {
// 获取请求参数
GeneratePolicyRightsParam generatePolicyRightsParam = nodeComponent.getSlot().getRequestData();
// 如果pin为空则结束流程
if (generatePolicyRightsParam == null || StringUtil.isEmpty(generatePolicyRightsParam.getUserPin())) {
log.info("CheckRealNameAuthCmp -> process end, nodeComponent={},pin is null.", JsonUtil.toJSONString(nodeComponent));
nodeComponent.setIsEn