FIELD NOTE / 架构与中间件
规则引擎实践:LiteFlow 快速上手
介绍规则引擎的适用场景、LiteFlow 快速开始、规则编排和工程内配置方式。
LiteFlow
点击跳转官网查看详细内容
规则引擎的定义
很多人容易把规则引擎和流程引擎的概念混在一起,这里我们先将规则引擎和流程引擎区分开:
- 规则引擎:通常是嵌入在应用程序组件中的,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。接受数据输入,解释业务规则,并根据业务规则做出业务决策。
- 流程引擎:实现了将多个业务参与者之间按照某种预定义的规则进行流转,通常需要涉及到角色与流程的交互。
LiteFlow 适用于哪些场景
LiteFlow适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。
快速开始
示例:demo
@Component("a")
public class ACmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
以此类推再分别定义b,c组件:
@Component("b")
public class BCmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
@Component("c")
public class CCmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
在你的SpringBoot的application.properties或者application.yml里添加配置
liteflow:
rule-source: config/flow.el.yml
然后在config/flow.el.yml里添加配置:
flow:
nodes:
node:
- id: a
class: com.sbc.liteflow.component.ACmp
- id: b
class: com.sbc.liteflow.component.BCmp
- id: c
class: com.sbc.liteflow.component.CCmp
- id: d
class: com.sbc.liteflow.component.DCmp
chain:
- name: test-chain
value: "THEN(a, b, WHEN(c, d))"

规则
工程内指定多个路径
liteflow:
// 规则文件之间可以用,或者;隔开:
rule-source: classpath*:config/flow.el.yml,classpath*:config/flow2.el.yml
// Spring EL表达式进行模糊匹配,加载多个配置文件:
rule-source: config/**/*.el.xml
// 绝对路径指定多个路径
rule-source: /data/lf/flow1.el.xml,/data/lf/flow2.el.xml
规则配置源
支持本地、ZK、SQL、Redis、Nacos、Etcd、Apollo等多种规则配置源,默认使用本地文件。
规则编排
串行编排
<chain name="chain1">
THEN(a, b, c, d);
</chain>
并行编排
<chain name="chain1">
THEN(
a,
WHEN(b, THEN(c, d)),
e
);
</chain>
选择编排
<chain name="chain1">
SWITCH(a).to(b, c, d);
</chain>
条件编排
<chain name="chain1">
THEN(
IF(x, a),
b
);
</chain>
循环编排
<chain name="chain1">
FOR(5).DO(THEN(a, b));
</chain>
组件类型
普通组件
普通组件节点需要继承NodeComponent,可用于THEN和WHEN关键字中。
选择组件
在实际业务中,往往要通过动态的业务逻辑判断到底接下去该执行哪一个节点,这就引申出了选择节点,选择节点可以用于SWITCH关键字中。 选择节点a需要继承 NodeSwitchComponent。 需要实现方法 processSwitch 方法。
布尔组件
布尔组件是以前IF组件,WHILE组件,BREAK组件的统一。他们三个组件有共同特征,都是返回布尔类型,所以将三个组件类型合三为一,成为了布尔组件。 布尔组件的定义,需要继承 NodeBooleanComponent。
性能
LiteFlow 绝大部分工作都是在启动时完成,包括解析规则,注册组件,组装元信息。而执行链路时几乎对系统没有额外的消耗。
实际表现中,LiteFlow 执行效率很高,在公司级核心业务上面,50多个业务组件组成的链路,在实际压测中单点达到了 1500 的 TPS(每秒处理事务数),集群达到了 1W 以上的 TPS,也经历过双11,明星顶流带货等大流量的考验。
虽然 LiteFlow 框架本身性能很好,但是整体执行效率却依赖实际业务组件的快慢,如果你的组件有大量的循环数据库请求 IO,或者有 bad sql,又或者有大量的 rpc 同步调用,那实际 TPS 也不会很高。