---
title: 借助流程引擎降低系统的复杂度!
---
# 借助流程引擎降低系统的复杂度!
> 作者:Tom哥
>
公众号:微观技术
>
博客:[https://offercome.cn](https://offercome.cn)
>
人生理念:知道的越多,不知道的越多,努力去学
作为软件架构师,当面对复杂的业务逻辑,我们常用的解决方案就是拆分
1. 将一个大的业务域拆分为若干子域
2. 将相似业务逻辑抽象成若干组件,并结合 23 种软件设计模式,提升系统扩展性
以流量网关为例:
我们会定义 `Filter` 接口,子类通过实现 `filter()` 方法来满足自己的业务逻辑,如:`限流逻辑` 、`鉴权逻辑` 等,如果某些业务流程不需要执行该 `Filter` 组件,我们可以在 `isSkip` 方法里定义跳出逻辑,直接跳过该组件,继续执行下一个组件。
最后我们定义了这么多的 Filter 组件,通过 Spring 框架扫描优先级注解,完成了组件链的串联。
当然这个编排比较单一,不够灵活。无法实现一些`串行` 、`并行` 的自由组合。
比如,我们面对上图这样的业务流程该如何应对?是自己借助 JUC 并发包以及各种 if else 定制化实现流程控制吗?
另外,随着业务后续迭代,这些任务间的关系还会发生变化,每次都去改动代码,违反软件的`开闭原则` ,很容易发生线上故障。
**🚀 给大家推荐一款轻量级的流程引擎 **
## LiteFlow
LiteFlow 是一款国产开源的,具有轻量,快速,稳定可编排的组件式规则引擎,帮助我们拆解实现各种复杂的业务逻辑,开箱即用,上手容易。
## 主要特性
1. **组件定义统一:** 所有的逻辑都是组件,为所有的逻辑提供统一化的组件实现方式,小身材,大能量。
2. **规则轻量:** 基于规则文件来编排流程,学习规则入门只需要5分钟,一看既懂。
3. **规则多样化:** 规则支持xml、json、yml三种规则文件写法方式,喜欢哪种用哪个。
4. **任意编排:** 同步异步混编,再复杂的逻辑过程,利用LiteFlow的规则,都是很容易做到的,看规则文件就能知道逻辑是如何运转的。
5. **规则能从任意地方加载:** 框架中提供本地文件配置源和zk配置源的实现,也提供了扩展接口,您可以把规则存储在任何地方。
6. **优雅热刷新机制:** 规则变化,无需重启您的应用,即时改变应用的规则。高并发下不会因为刷新规则导致正在执行的规则有任何错乱。
7. **支持广泛:** 不管你的项目是不是基于Springboot,Spring还是任何其他java框架构建,LiteFlow都能游刃有余。
8. **JDK支持:** 从JDK8到JDK17,统统支持。无需担心JDK版本。
9. **脚本语言支持:** 可以定义脚本语言节点,支持QLExpress和Groovy两种脚本。未来还会支持更多的脚本语言。
10. **规则嵌套支持:** 只要你想的出,你可以利用简单的表达式完成多重嵌套的复杂逻辑编排。
11. **组件重试支持:** 组件可以支持重试,每个组件均可自定义重试配置和指定异常。
12. **上下文隔离机制:** 可靠的上下文隔离机制,你无需担心高并发情况下的数据串流。
13. **声明式组件支持:** 你可以让你的任意类秒变组件。
14. **详细的步骤信息:** 你的链路如何执行的,每个组件耗时多少,报了什么错,一目了然。
15. **稳定可靠:** 历时2年多的迭代,在各大公司的核心系统上稳定运行。
16. **性能卓越:** 框架本身几乎不消耗额外性能,性能取决你的组件执行效率。
17. **自带简单监控:** 框架内自带一个命令行的监控,能够知道每个组件的运行耗时排行。
LiteFlow 设计了非常强大的规则表达式,一切复杂的流程在 LiteFlow 表达式的加持下,都异常丝滑简便。
我们来一起看下 EL 规则的写法
## LiteFlow 规则语法
### 1、串行编排
依次执行 a、b、c、d四个组件,用 THEN 关键字
```
THEN(a, b, c, d);
```
### 2、并行编排
并行执行a、b、c三个组件,用`WHEN` 关键字
```
WHEN(a, b, c);
```
### 3、选择编排
根据组件 a 的运行结果,选择执行 b、c、d 中的一个,用 `SWITCH` 关键字
```
SWITCH(a).to(b, c, d);
```
### 4、条件编排
条件编排就是变成语言中的 if else,使用 IF 关键字
其中 x 为条件节点,为真的情况下,执行链路就为x->a->c,为假链路就为x->b->c
```
THEN(
IF(x, a, b),
c
);
```
比如,我们要实现这样一个复杂的流程
对应的 EL 表达式为:
```
IF(x1, a).ELIF(x2, b).ELIF(x3, c).ELIF(x4, d).ELSE(THEN(m, n));
```
### 5、子流程
当遇到一些复杂的业务,表达式嵌套多层,很不直观,我们可以先定义子流程,然后在主流程中引用。这样逻辑会比较清晰
定义子流程 `sub_chain` ,串行执行 a、b 两个组件
```
THEN(a,b);
```
然后,在主流程中引入之前定义的子流程 sub_chain
```
WHEN(
sub_chain,
c,d
);
```
## 实战案例
### 1、需求描述
看完介绍是不是很手痒,接下来我们就以一个电商的 订单价格计算 为例子,讲解下 LiteFlow 如何使用
首先,我们看下订单价格计算接口 都涉及哪些业务逻辑,为了快速切入,画了个流程图便于大家理解
毕竟,一图胜千言哈
### 2、项目代码实现
以 Spring Boot 应用为例,首先在 pom.xml 文件添加下面的依赖
修改 application.yml 配置文件,添加 LiteFlow 的规则文件路径
定义组件,继承 NodeComponent 类 ,并重写 process() 方法,里面实现自己负责的业务逻辑,比如:促销满减计算、会员折扣计算、运费计算等
通过重写 isAccess() 方法来决定是否执行该组件
MemberDiscountCmp 负责会员折扣计算,根据 memberCode 查询会员等级,并获取对应的会员折扣,然后计算订单可以减免多少优惠
PostageCondCmp 组件比较特殊,根据 是否境外购 选择对应的运费计算组件,继承了 NodeSwitchComponent ,并实现了 processSwitch() 方法
其他业务组件 基本类似,就不一一介绍了,感兴趣的同学可以自己看下代码
所有组件实例无缝支持 Spring 框架,通过`@Component `注解标识,所有的Bean实例全部交由 Spring 容器统一管理
定义好组件后,接下来就要编写 EL 规则表达式,将所有的流程关联起来
最后,启动 Spring Boot 工程,访问地址:http://localhost:8580/
## 代码地址
> https://gitee.com/aalansehaiyang/liteflow-example