Springcloud:LiteFlow

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

一、LiteFlow简介

二、规则编排关键字及语法

1、THEN:

2、WHEN:

3、AND:

4、OR:

5、IF:

6、ELSE:

7、RETRY:

8、RETRY_FOR_EACH:

9、RETRY_WHILE:

10、RETRY_UNTIL:

三、Springcloud接入LiteFlow例子

1、定义节点nodeA、nodeB

2、定义配置文件

3、配置文件配置

4、编写测试类

四、跳出节点的方式

1、抛异常

五、规则编排适合使用的场景

总结


提示:以下是本篇文章正文内容,下面案例可供参考

一、LiteFlow简介

在日常的开发过程中,经常会遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。

在这样的场景下,使用策略和模板模式的结合可以很好的解决这个问题,但是使用编码的方式会使得文件太多,在业务的部分环节可以这样操作,在项目角度就无法一眼洞穿其中的环节和逻辑。

在本文中,将引入规则引擎从全局角度来解决这个问题,这就是今天要介绍的主角 liteflow。

liteflow 是一个轻巧而且强大的规则引擎,能够实现开箱即用,可以在短时间内就可以完成复杂的规则编排,下图是 liteflow 的整体架构。liteflow 支持较多的规则文件格式,比如 xml/json/yaml, 对于规则文件的存储方式可以有sql/zk/nacos/apollo 等。

官网地址:LiteFlow

二、规则编排关键字及语法

1、THEN:

用于定义流程链中的节点顺序。节点按照THEN关键字后面的顺序执行

<chain name="chain1">

THEN(nodeA, nodeB, nodeC)

</chain>

2、WHEN:

用于定义条件节点。WHEN关键字后面的节点只有在满足条件时才会执行

<chain name="chain1">

WHEN(conditionNode)

THEN(nodeA, nodeB)

</chain>

3、AND:

用于并行执行多个节点。AND关键字后面的节点会同时执行

<chain name="chain1">

AND(nodeA, nodeB)

</chain>

4、OR:

用于定义多个节点中的任意一个执行。OR关键字后面的节点会按照顺序执行,直到找到一个成功执行的节点

<chain name="chain1">

OR(nodeA, nodeB)

</chain>

5、IF:

用于条件判断。IF关键字后面的节点只有在满足条件时才会执行

<chain name="chain1">

IF(conditionNode)

THEN(nodeA, nodeB)

</chain>

6、ELSE:

用于条件判断的否定分支。ELSE关键字后面的节点只有在IF关键字后面的条件判断失败时才会执行

<chain name="chain1">

IF(conditionNode)

THEN(nodeA, nodeB)

ELSE(nodeC, nodeD)

</chain>

7、RETRY:

用于重试失败的节点。RETRY关键字后面的节点会在失败时重试执行

<chain name="chain1">

RETRY(nodeA, 3)

</chain>

8、RETRY_FOR_EACH:

用于重试失败的节点,并且对每个节点进行重试

<chain name="chain1">

RETRY_FOR_EACH(nodeA, nodeB, 3)

</chain>

9、RETRY_WHILE:

用于重试失败的节点,直到满足指定的条件

<chain name="chain1">

RETRY_WHILE(nodeA, conditionNode)

</chain>

10、RETRY_UNTIL:

用于重试失败的节点,直到满足指定的条件

<chain name="chain1">

RETRY_UNTIL(nodeA, conditionNode)

</chain>

三、Springcloud接入LiteFlow例子

1、定义节点nodeA、nodeB

复制代码
@LiteflowComponent("nodeA")
public class NodeA extends NodeComponent {
    @Override
    public void process() {
        System.out.println("NodeA executed");
        throw new RuntimeException("测试异常");
    }
}

@LiteflowComponent("nodeB")
public class NodeB extends NodeComponent {
    @Override
    public void process() {
        System.out.println("NodeB executed");
    }
}

2、定义配置文件

新增配置文件flow.xml文件

复制代码
<?xml version="1.0" encoding="UTF-8"?>
<flow name="myFlow">
	<chain name="chainabc">
		THEN(nodeA, nodeB);
	</chain>
</flow>

注意,首次接入时,配置文件中如果按照以下方式书写,在加载时会报错:init flow executor cause error for path classpath:flow.xml,reason: no content in this chain

<flow name="myFlow">

<chain name="chain1">

<then name="nodeA" />

<then name="nodeB" />

</chain>

</flow>

3、配置文件配置

application.yml文件中添加配置

复制代码
liteflow:
  rule-source: classpath:flow.xml

4、编写测试类

复制代码
@RestController
public class FlowController {

    @Resource
    private FlowExecutor flowExecutor;

    @GetMapping("/executeFlow")
    public String executeFlow() {
        LiteflowResponse response = flowExecutor.execute2Resp("chainabc");
        return response.getExecuteStepStr();
    }

}

@Resource
private FlowController flowController;

@Test
public void liteFlowTest() {
    flowController.executeFlow();
}

四、跳出节点的方式

1、抛异常

THEN(nodeA, nodeB, nodeC)

当 nodeA 节点抛出异常后,整个流程不再向下执行,失败之后的策略,可以在配置文件里配置,例如:重试几次、一直重试直到成功等等

五、规则编排适合使用的场景

在上边这个图中,A和B是顺序执行,C、D、H三个节点所在的线是并行的。三条线都执行完毕后,再接着执行X。

1、在金融系统中

复杂的渠道和资方,各自的流程有一样的,也有区别很大的,很适合编排,如果将配置文件放在nacos中,就能实现动态编排,实时生效。

2、在电商系统中

如果一个商品有M个优惠活动,有些能叠加,那么我们可以编排优惠的顺序,快速适应新需求调整计算顺序。


总结

实用,实用,实用,重要的事情说三遍!

相关推荐
砚底藏山河5 分钟前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
慢云智慧空间8 分钟前
从设备智能到空间理解,空间智能终端解决方案商如何重新定义行业标准
后端
利威尔xu18 分钟前
Go IM 源码实战(13):30 个会话只有 2 个红点,未读数错在三条路径
redis·后端·微服务·面试·golang
猿究院_夏燊1 小时前
MySQL 的四种隔离级别
java·数据库·mysql
薛定谔的猫-菜鸟程序员1 小时前
软件架构设计师开发资料大全(从入门到精通)
后端·python·系统架构·flask·架构设计师
码流子1 小时前
移动收费怎么做?手持终端+App+收费中心的架构实践
java·开发语言·架构
霸道流氓气质2 小时前
AI 流式对话与实时聊天平台:SSE 解码竞态、有状态会话隔离与背压取消的 Vue3 + Spring AI 生产级实战
java·人工智能·spring
云创智城-yuncitys2 小时前
YunParking 4.0:JDK 17 与 Spring Boot 3.2 的停车云升级
java·开发语言·spring boot
文丑颜不良啊2 小时前
LeetCode1661~1680题目解析
java·leetcode
子非鱼@Itfuture2 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端