查看原文
其他

LiteFlow: 可编排的组件式规则引擎

小奇 爱编程爱技术 2023-12-13

背景

在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统RPC调用等等。

时间一长,项目几经易手,维护成本就会越来越高。各种硬代码判断,分支条件越来越多。代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更业务流程,几乎很难实现。

LiteFlow简介

LiteFlow是一个轻量且强大的国产规则引擎框架,该项目于2020年全面开源迅速获得了很多人的关注。LiteFlow也获得了2021 年度 OSC 中国开源项目评选「最佳人气项目」。于2022年获得Gitee最有价值开源项目(GVP)荣誉。

LiteFlow是一个由社区驱动的项目,非常重视社区建设,拥有一个2500多人的使用者社区,在使用中碰到任何问题或者建议都可以在社区中反应。
目前,该项目在github上以获得2K+的star

🍬LiteFlow特性

  • 组件定义统一: 所有的逻辑都是组件,为所有的逻辑提供统一化的组件实现方式,小身材,大能量。

  • 脚本语言支持: 可以定义脚本语言节点,支持Groovy,Javascript,QLExpress,Python,Lua,Aviator。未来还会支持更多的脚本语言。

  • 脚本和Java全打通: 所有脚本语言均可调用Java方法,甚至于可以引用任意的实例,在脚本中调用RPC也是支持的。

  • 规则嵌套支持: 只要你想的出,你可以利用简单的表达式完成多重嵌套的复杂逻辑编排。

  • 组件重试支持: 组件可以支持重试,每个组件均可自定义重试配置和指定异常。

  • 上下文隔离机制: 可靠的上下文隔离机制,你无需担心高并发情况下的数据串流。

  • 声明式组件支持: 你可以让你的任意类秒变组件。

  • 性能卓越: 框架本身几乎不消耗额外性能,性能取决你的组件执行效率。

  • 自带简单监控: 框架内自带一个命令行的监控,能够知道每个组件的运行耗时排行。

  • 规则多样化: 规则支持xml、json、yml三种规则文件写法方式,喜欢哪种用哪个。

  • 任意编排: 再复杂的逻辑过程,利用LiteFlow的规则,都是很容易做到的,看规则文件就能知道逻辑是如何运转的。

  • 规则持久化: 框架原生支持把规则存储在标准结构化数据库,Nacos,Etcd,Zookeeper,Apollo。您也可以自己扩展,把规则存储在任何地方。

  • 优雅热刷新机制: 规则变化,无需重启您的应用,即时改变应用的规则。高并发下不会因为刷新规则导致正在执行的规则有任何错乱。

  • 支持广泛: 不管你的项目是不是基于Springboot,Spring还是任何其他java框架构建,LiteFlow都能游刃有余。

✨LiteFlow框架的优势

如果你要对复杂业务逻辑进行新写或者重构,用LiteFlow最合适不过。它是一个编排式的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。
利用LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow拥有开源规则引擎最为简单的DSL语法。十分钟就可上手。

组件可实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。

LiteFlow的脚本组件,支持众多脚本语言,完全和Java打通,你可以用脚本来实现任何逻辑。

LiteFlow支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便你定制。

你有想过,要在代码中实现下面这种复杂逻辑流程该如何实现吗?

图示1
图示2
你有想过类似以下的多线程流程编排该如何写吗?
图示3

同时要保证所有组件都是灵活可变的。我相信肯定有人能实现,但是是需要付出一定的开发成本的。而以上这一切,利用LiteFlow,轻而易举,你立马唾手可得!

🧱LiteFlow的设计原则

LiteFlow是基于工作台模式进行设计的,何谓工作台模式?

n个工人按照一定顺序围着一张工作台,按顺序各自生产零件,生产的零件最终能组装成一个机器,每个工人只需要完成自己手中零件的生产,而无需知道其他工人生产的内容。每一个工人生产所需要的资源都从工作台上拿取,如果工作台上有生产所必须的资源,则就进行生产,若是没有,就等到有这个资源。每个工人所做好的零件,也都放在工作台上。
这个模式有几个好处:
  • 每个工人无需和其他工人进行沟通。工人只需要关心自己的工作内容和工作台上的资源。这样就做到了每个工人之间的解耦和无差异性。

  • 即便是工人之间调换位置,工人的工作内容和关心的资源没有任何变化。这样就保证了每个工人的稳定性。

  • 如果是指派某个工人去其他的工作台,工人的工作内容和需要的资源依旧没有任何变化,这样就做到了工人的可复用性。

  • 因为每个工人不需要和其他工人沟通,所以可以在生产任务进行时进行实时工位更改:替换,插入,撤掉一些工人,这样生产任务也能实时的被更改。这样就保证了整个生产任务的灵活性。

这个模式映射到LiteFlow框架里,工人就是组件,工人坐的顺序就是流程配置,工作台就是上下文,资源就是参数,最终组装的这个机器就是这个业务。正因为有这些特性,所以LiteFlow能做到统一解耦的组件和灵活的装配。

🍀LiteFlow 适用场景

LiteFlow是一款编排式的规则引擎,适用于拥有复杂逻辑的业务,最擅长去解耦你的系统,如果你的系统业务复杂,并且代码臃肿不堪,,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。

🍃Springboot整合LiteFlow

1、导入依赖包

LiteFlow提供了liteflow-spring-boot-starter依赖包,提供自动装配功能

<dependency> <groupId>com.yomahub</groupId> <artifactId>liteflow-spring-boot-starter</artifactId> <version>2.11.0</version></dependency>
2、自定义组件
定义组件a,b,c
@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 }}
3、定义规则文件
在resources下的config/flow.el.xml中定义规则:
<?xml version="1.0" encoding="UTF-8"?><flow> <chain name="chain1"> THEN(a, b, c); </chain></flow>
4、修改springboot配置文件

在你的SpringBoot的application.propertiesapplication.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实例对象:

@Servicepublic class YourService{
@Resource private FlowExecutor flowExecutor;
public void testConfig(){ LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg"); }}
补充:
🌿Springboot下的其他配置项
#规则文件路径liteflow.rule-source=config/flow.el.xml#-----------------以下非必须-----------------#liteflow是否开启,默认为trueliteflow.enable=true#liteflow的banner是否开启,默认为trueliteflow.print-banner=true#zkNode的节点,只有使用zk作为配置源的时候才起作用liteflow.zk-node=/lite-flow/flow#上下文的最大数量槽,默认值为1024liteflow.slot-size=1024#FlowExecutor的execute2Future的线程数,默认为64liteflow.main-executor-works=64#FlowExecutor的execute2Future的自定义线程池Builder,LiteFlow提供了默认的Builderliteflow.main-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultMainExecutorBuilder#自定义请求ID的生成类,LiteFlow提供了默认的生成类liteflow.request-id-generator-class=com.yomahub.liteflow.flow.id.DefaultRequestIdGenerator#并行节点的线程池Builder,LiteFlow提供了默认的Builderliteflow.thread-executor-class=com.yomahub.liteflow.thread.LiteFlowDefaultWhenExecutorBuilder#异步线程最长的等待时间(只用于when),默认值为15000liteflow.when-max-wait-time=15000#异步线程最长的等待时间单位(只用于when),默认值为MILLISECONDS,毫秒liteflow.when-max-wait-time-unit=MILLISECONDS#when节点全局异步线程池最大线程数,默认为16liteflow.when-max-workers=16#when节点全局异步线程池等待队列数,默认为512liteflow.when-queue-limit=512#是否在启动的时候就解析规则,默认为trueliteflow.parse-on-start=true#全局重试次数,默认为0liteflow.retry-count=0#是否支持不同类型的加载方式混用,默认为falseliteflow.support-multiple-type=false#全局默认节点执行器liteflow.node-executor-class=com.yomahub.liteflow.flow.executor.DefaultNodeExecutor#是否打印执行中过程中的日志,默认为trueliteflow.print-execution-log=true#是否开启本地文件监听,默认为falseliteflow.enable-monitor-file=false#监控是否开启,默认不开启liteflow.monitor.enable-log=false#监控队列存储大小,默认值为200liteflow.monitor.queue-limit=200#监控一开始延迟多少执行,默认值为300000毫秒,也就是5分钟liteflow.monitor.delay=300000#监控日志打印每过多少时间执行一次,默认值为300000毫秒,也就是5分钟liteflow.monitor.period=300000#并行循环子项线程池最大线程数,默认为16liteflow.parallelLoop-max-workers=16#并行循环子项线程池等待队列数,默认为512liteflow.parallelLoop-queue-limit=512#并行循环子项的线程池Builder,LiteFlow提供了默认的Builderliteflow.parallelLoop-executor-class=com.yomahub.liteflow.test.customThreadPool.CustomThreadBuilder

提示:

只要使用了规则,那么rule-source配置必须得有!

但是如果你是用代码动态构造规则,那么rule-source配置自动失效。因为代码构造是用代码来装配规则,不需要规则文件。

💯总结

LiteFlow解耦逻辑而生,为编排而生,在使用LiteFlow之后,你会发现打造一个低耦合,灵活的系统会变得易如反掌!

LiteFlow可用于复杂的组件化业务的编排领域,独有的DSL规则驱动整个复杂业务,并可实现平滑刷新热部署,支持多种脚本语言规则的嵌入。帮助系统变得更加丝滑且灵活。

如果你正在对复杂业务逻辑进行新写或者重构,那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




本文发表于公众号【爱编程爱技术】

关注我们,阅读更多精彩内容

▽▽▽

往期推荐:

TLog:轻量级的分布式日志标记追踪神器
He3:一款垂直于开发者的免费工具箱
96.6k Stars 微软亲自操刀的开源软件工具:PowerToys
ShareX:截图工具,功能强悍,免费开源!IObit Uninstaller:天花板级软件卸载工具,一键卸载流氓软件
36.6K Stars 一款轻量,迅速,可无限定制的高颜值命令行工具,让终端工作更高效!
继续滑动看下一个

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存