LiteFlow: 可编排的组件式规则引擎
背景
在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。
LiteFlow简介
🍬LiteFlow特性
组件定义统一: 所有的逻辑都是组件,为所有的逻辑提供统一化的组件实现方式,小身材,大能量。
脚本语言支持: 可以定义脚本语言节点,支持Groovy,Javascript,QLExpress,Python,Lua,Aviator。未来还会支持更多的脚本语言。
脚本和Java全打通: 所有脚本语言均可调用Java方法,甚至于可以引用任意的实例,在脚本中调用RPC也是支持的。
规则嵌套支持: 只要你想的出,你可以利用简单的表达式完成多重嵌套的复杂逻辑编排。
组件重试支持: 组件可以支持重试,每个组件均可自定义重试配置和指定异常。
上下文隔离机制: 可靠的上下文隔离机制,你无需担心高并发情况下的数据串流。
声明式组件支持: 你可以让你的任意类秒变组件。
性能卓越: 框架本身几乎不消耗额外性能,性能取决你的组件执行效率。
自带简单监控: 框架内自带一个命令行的监控,能够知道每个组件的运行耗时排行。
规则多样化: 规则支持xml、json、yml三种规则文件写法方式,喜欢哪种用哪个。
任意编排: 再复杂的逻辑过程,利用LiteFlow的规则,都是很容易做到的,看规则文件就能知道逻辑是如何运转的。
规则持久化: 框架原生支持把规则存储在标准结构化数据库,Nacos,Etcd,Zookeeper,Apollo。您也可以自己扩展,把规则存储在任何地方。
优雅热刷新机制: 规则变化,无需重启您的应用,即时改变应用的规则。高并发下不会因为刷新规则导致正在执行的规则有任何错乱。
支持广泛: 不管你的项目是不是基于Springboot,Spring还是任何其他java框架构建,LiteFlow都能游刃有余。
✨LiteFlow框架的优势
组件可实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。
LiteFlow的脚本组件,支持众多脚本语言,完全和Java打通,你可以用脚本来实现任何逻辑。
LiteFlow支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便你定制。
你有想过,要在代码中实现下面这种复杂逻辑流程该如何实现吗?
同时要保证所有组件都是灵活可变的。我相信肯定有人能实现,但是是需要付出一定的开发成本的。而以上这一切,利用LiteFlow,轻而易举,你立马唾手可得!
🧱LiteFlow的设计原则
LiteFlow是基于工作台模式进行设计的,何谓工作台模式?
每个工人无需和其他工人进行沟通。工人只需要关心自己的工作内容和工作台上的资源。这样就做到了每个工人之间的解耦和无差异性。
即便是工人之间调换位置,工人的工作内容和关心的资源没有任何变化。这样就保证了每个工人的稳定性。
如果是指派某个工人去其他的工作台,工人的工作内容和需要的资源依旧没有任何变化,这样就做到了工人的可复用性。
因为每个工人不需要和其他工人沟通,所以可以在生产任务进行时进行实时工位更改:替换,插入,撤掉一些工人,这样生产任务也能实时的被更改。这样就保证了整个生产任务的灵活性。
这个模式映射到LiteFlow框架里,工人就是组件,工人坐的顺序就是流程配置,工作台就是上下文,资源就是参数,最终组装的这个机器就是这个业务。正因为有这些特性,所以LiteFlow能做到统一解耦的组件和灵活的装配。
🍀LiteFlow 适用场景
LiteFlow是一款编排式的规则引擎,适用于拥有复杂逻辑的业务,最擅长去解耦你的系统,如果你的系统业务复杂,并且代码臃肿不堪,,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。
🍃Springboot整合LiteFlow
LiteFlow提供了liteflow-spring-boot-starter依赖包,提供自动装配功能
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.11.0</version>
</dependency>
@Component("a")
public class ACmp extends NodeComponent {
@Override
public void process() {
//do your business
}
}
@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
}
}
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="chain1">
THEN(a, b, c);
</chain>
</flow>
在你的SpringBoot的application.properties或application.yml里添加配置
liteflow.rule-source=config/flow.el.xml
5、修改springboot启动类
@SpringBootApplication
//把你定义的组件扫入Spring上下文中
@ComponentScan({"com.xxx.xxx.cmp"})
public class LiteflowExampleApplication {
public static void main(String[] args) {
SpringApplication.run(LiteflowExampleApplication.class, args);
}
}
然后你就可以在任意的service类中拿到flowExecutor实例对象:
@Service
public class YourService{
@Resource
private FlowExecutor flowExecutor;
public void testConfig(){
LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
}
}
#规则文件路径
liteflow.rule-source=config/flow.el.xml
#-----------------以下非必须-----------------
#liteflow是否开启,默认为true
liteflow.enable=true
#liteflow的banner是否开启,默认为true
liteflow.print-banner=true
#zkNode的节点,只有使用zk作为配置源的时候才起作用
liteflow.zk-node=/lite-flow/flow
#上下文的最大数量槽,默认值为1024
liteflow.slot-size=1024
#FlowExecutor的execute2Future的线程数,默认为64
liteflow.main-executor-works=64
#FlowExecutor的execute2Future的自定义线程池Builder,LiteFlow提供了默认的Builder
liteflow.main-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultMainExecutorBuilder
#自定义请求ID的生成类,LiteFlow提供了默认的生成类
liteflow.request-id-generator-class=com.yomahub.liteflow.flow.id.DefaultRequestIdGenerator
#并行节点的线程池Builder,LiteFlow提供了默认的Builder
liteflow.thread-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultWhenExecutorBuilder
#异步线程最长的等待时间(只用于when),默认值为15000
liteflow.when-max-wait-time=15000
#异步线程最长的等待时间单位(只用于when),默认值为MILLISECONDS,毫秒
liteflow.when-max-wait-time-unit=MILLISECONDS
#when节点全局异步线程池最大线程数,默认为16
liteflow.when-max-workers=16
#when节点全局异步线程池等待队列数,默认为512
liteflow.when-queue-limit=512
#是否在启动的时候就解析规则,默认为true
liteflow.parse-on-start=true
#全局重试次数,默认为0
liteflow.retry-count=0
#是否支持不同类型的加载方式混用,默认为false
liteflow.support-multiple-type=false
#全局默认节点执行器
liteflow.node-executor-class=com.yomahub.liteflow.flow.executor.DefaultNodeExecutor
#是否打印执行中过程中的日志,默认为true
liteflow.print-execution-log=true
#是否开启本地文件监听,默认为false
liteflow.enable-monitor-file=false
#监控是否开启,默认不开启
liteflow.monitor.enable-log=false
#监控队列存储大小,默认值为200
liteflow.monitor.queue-limit=200
#监控一开始延迟多少执行,默认值为300000毫秒,也就是5分钟
liteflow.monitor.delay=300000
#监控日志打印每过多少时间执行一次,默认值为300000毫秒,也就是5分钟
liteflow.monitor.period=300000
#并行循环子项线程池最大线程数,默认为16
liteflow.parallelLoop-max-workers=16
#并行循环子项线程池等待队列数,默认为512
liteflow.parallelLoop-queue-limit=512
#并行循环子项的线程池Builder,LiteFlow提供了默认的Builder
liteflow.parallelLoop-executor-class=com.yomahub.liteflow.test.customThreadPool.CustomThreadBuilder
提示:
只要使用了规则,那么rule-source
配置必须得有!
rule-source
配置自动失效。因为代码构造是用代码来装配规则,不需要规则文件。💯总结
LiteFlow为解耦逻辑而生,为编排而生,在使用LiteFlow之后,你会发现打造一个低耦合,灵活的系统会变得易如反掌!
如果你正在对复杂业务逻辑进行新写或者重构,那LiteFlow框架会是一个非常好的解决方案,小编强烈推荐你应用到项目之中!
附官方链接:
官网:
https://liteflow.cc/
gitee地址:
https://gitee.com/daisyrae/liteFlow
示例代码参考 message-demo:
https://github.com/bryan31/message-demo
示例工程参考 liteflow-example:
https://gitee.com/bryan31/liteflow-example
END
本文发表于公众号【爱编程爱技术】
关注我们,阅读更多精彩内容▽▽▽
往期推荐:
He3:一款垂直于开发者的免费工具箱
96.6k Stars 微软亲自操刀的开源软件工具:PowerToys
ShareX:截图工具,功能强悍,免费开源!IObit Uninstaller:天花板级软件卸载工具,一键卸载流氓软件
36.6K Stars 一款轻量,迅速,可无限定制的高颜值命令行工具,让终端工作更高效!