Hi,我是阿昌
,今天介绍一个规则引擎框架
,LiteFlow;
那首先得知道什么是规则引擎
?规则引擎是 一种用于自动化处理业务规则的软件组件。
在软件行业中,规则引擎通常用于解决复杂的业务逻辑处理问题。它可以将业务规则
从应用程序中分离出来,并以一种易于管理
和维护
的方式进行配置和修改。
规则引擎能够根据预先定义的规则集对输入数据进行评估和处理,并根据规则的结果执行相应的操作。这样可以提高软件系统的灵活性、可扩展性和可维护性。
规则引擎在许多软件领域都有广泛的应用,比如金融行业的风险评估、保险业的理赔处理、电子商务的促销活动等。
一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长
,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。时间一长,项目几经易手,维护成本就会越来越高。各种硬代码判断,分支条件越来越多。
代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。
如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更业务流程,几乎很难实现,那LiteFlow为解耦
逻辑而生,为编排
而生。
编排式
的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。
热更替
,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。支持众多脚本语言
,完全和Java打通,你可以用脚本来实现任何逻辑。配置存放灵活
,支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便定制。组件都是灵活可变
的。LiteFlow适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度
拆分成一个个独立的组件,进行装配复用变更。
可得到一个灵活度高,扩展性很强的系统。
因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。
LiteFlow只做基于逻辑的流转,而不做基于角色任务的流转。如果你想做基于角色任务的流转,推荐使用flowable (opens new window),activiti (opens new window)这2个框架。
liteflow支持多种框架的引入,场景的springboot、spring或非spring场景
下面的代码是基于此版本进行演示:
- springboot:2.3.4.RELEASE
- jdk:1.8
- liteflow-springboot:2.11.4.2
LiteFlow提供了liteflow-spring-boot-starter依赖包,提供自动装配功能
<dependency>
<groupId>com.yomahubgroupId>
<artifactId>liteflow-spring-boot-starterartifactId>
<version>2.11.4.2version>
dependency>
在依赖了以上jar包后,需要定义并实现一些组件,确保SpringBoot会扫描到这些组件并注册进上下文。
定义如下:a,b,c组件
/**
* @author achang
* @date 2024/2/8 - 12:27 下午
**/
@Component(value = "a")
public class AComponent extends NodeComponent {
@Override
public void process() throws Exception {
System.out.println("do A");
}
}
/**
* @author achang
* @date 2024/2/8 - 12:27 下午
**/
@Component(value = "b")
public class BComponent extends NodeComponent {
@Override
public void process() throws Exception {
System.out.println("do B");
}
}
/**
* @author achang
* @date 2024/2/8 - 12:27 下午
**/
@Component(value = "c")
public class CComponent extends NodeComponent {
@Override
public void process() throws Exception {
System.out.println("do C");
}
}
在SpringBoot的application.properties或者application.yml里添加配置(这里以properties为例,yaml也是一样的),更多的配置项
liteflow.rule-source=config/flow.el.xml
在上面flow.el.xml
文件中编写流程规则
<flow>
<chain name="achang">
THEN(a, b, c);
chain>
flow>
SpringBoot在启动时会自动装载规则文件。
编写测试执行类
/**
* @author achang ([email protected])
* @date 2024/2/8 - 12:34 下午
* 执行测试组件
**/
@Component("testHandleComponent")
public class TestHandleComponent {
@Resource
private FlowExecutor flowExecutor;
public void testHandle(String arg){
LiteflowResponse liteflowResponse = flowExecutor.execute2Resp("tagChain", arg);
System.out.println("done");
}
}
提示:
这个DefaultContext是默认的上下文,用户可以用最自己的任意Bean当做上下文传入,如果需要传入自己的上下文,则需要传用户Bean的Class属性,具体请看数据上下文这一章节。
编写测试入口:
@SpringBootTest
class LiteFlowDemoApplicationTests {
@Autowired
private TestHandleComponent testHandleComponent;
@Test
void contextLoads() {
testHandleComponent.testHandle("achang");
}
}
执行结果控制台:
那这样子用liteflow写了一个最简单的一个demo,可以看到用代码定于组件的代码然后,在流程规则中编写对组件之间流程执行的编写,这样子就可以将业务之间抽象成一个一个的组件,然后进行编排解藕达成目的,
那liteflow还有很多的高级特性,如:配置源的设置/多重组件的编写/EL规则的写法/数据上下文的玩法/执行器/脚本组件等等等等特性,在官方文档都有介绍,有兴趣的可以看:LiteFlow