LiteFlow v2.11.1发布!一个高速迭代,社区活跃的新一代规则引擎

LiteFlow介绍

LiteFlow是一个开源编排式规则引擎,能够让你的系统逻辑任意编排,可选用脚本书写逻辑,支持多达6种脚本语言,支持丰富的第三方存储的支持,所有的逻辑和规则均可热变更。设计系统和重构系统的神器。

LiteFlow是Gitee的高star项目,过去一年来保持了非常快的增长趋势。

同时LiteFlow也是国内优秀的社区驱动型开源项目,开源将近3年,目前已经被各大公司应用在核心系统上。特性以及支持度都非常好。社区人数超过3500人。测试用例1500个,质量有保障。

如果你是第一次知道这个项目,可以去官网或相关的主页进行了解:

项目官网:

liteflow.cc

gitee托管仓库:

gitee.com/dromara/lit...

github托管仓库:

github.com/dromara/lit...

前言

上一个版本是9月1日发布的,经过了一个半月,LiteFlow新的v2.11.1和大家见面了。

这个版本总共带来了7个大特性,3个增强,2个修复。总计12个issue的更新。

其实这已经比上一个大版本已经有过之而无不及了。

这一切归功于LiteFlow的团队小伙伴们,他们贡献了这个版本中的诸多的特性,感谢他们。尤其这个版本又有2位新成员加入团队,目前团队成员一共有11位,接下来的迭代将会变的更加迅速。

我们在确保新特性推出的同时,项目质量也同样出色。LiteFlow截止到新版本,一共有1515个测试用例,每一个特性的提交,我们每一个成员都会全部通过测试用例,这也是我们每一次发版的底气,测试用例我们是认真的。并且我们的测试用例代码行覆盖率达到了非常高的90%覆盖率。

其实不吹不黑,在拥有1500个测试用例以上的开源项目中,90%的行覆盖率算得上是一个优秀的程度了。

SQL插件支持轮询自动更新模式

LiteFlow支持把规则和脚本存入任意的关系型数据库,由于关系型数据库不像注册中心会进行推送变更,所以一直以来,规则和脚本在数据库中发生改变,是需要开发者自己手动的去刷新的。并且需要每个应用实例都进行刷新。这对开发者来说,是繁琐了点。

所以我们在v2.11.1中推出了数据库自动轮询更新模式。这一切只需要在你原来的配置中加入:

yaml 复制代码
liteflow:
  rule-source-ext-data-map:
    ...
    #是否开启SQL数据轮询自动刷新机制 默认不开启
    pollingEnabled: true
    ...

默认LiteFlow会每1分钟去进行SHA值的对比,由此来判断是否需要更新。

具体使用方式请参考规则文件->SQL数据库配置源

WHEN增加must语法

之前WHEN推出过any语法,意思是任意一个完成即继续,而忽略其他。但是在社区里有小伙伴碰到真实的场景,需要异步并行中对指定的节点先完成就忽略其他。

为此这次新版本中推出了全新的must语法,提供在并行编排中更多的多样性。

ini 复制代码
<chain name="chain1">
    THEN(
        a,
        WHEN(b, c, d).must(b, c),
        f
    );
</chain>

也可以指定一个或多个表达式:

less 复制代码
<chain name="chain1">
    THEN(
        a,
        WHEN(b, THEN(c, d).id("t1"), e).must(b, "t1"),
        f
    );
</chain>

具体使用方式请参考EL规则的写法->并行编排->指定任意节点先执行完则忽略其他

推出EL表达式的动态组装API

之前LiteFlow推出过动态构建chain的API,类似于这样:

scss 复制代码
LiteFlowChainELBuilder.createChain().setChainName("chain1").setEL(
  "THEN(a, b, WHEN(c, d))"
).build();

但是EL表达式还是需要你自己以字符串的方式填入,这并不能算真正意义上动态。

这次我们推出了全新的EL表达式的动态组装API,对于上面的EL,你可以如下进行动态构建:

less 复制代码
ThenELWrapper el = ELBus.then(
    "a","b",ELBus.when("c", "d")
);
LiteFlowChainELBuilder.createChain().setChainName("chain1").setEL(el.toEL()).build();

值得一说的是,用java语言构建EL表达式,几乎和EL的写法完全一致。如果你已经熟悉了LiteFlow的规则语法,应该是零成本上手的。

目前API支持了所有的EL语法。具体使用方式请参考用代码构造规则->构造EL

链路继承

LiteFlow每一个chain独立,之前的版本不存在继承关系。但在这个新版本中,我们推出了链路继承这个特性。

如同类的继承一样,链路可以继承,那么对于拥有复杂链路的业务系统,可以对链路进行抽象,得到一个非常优雅的表现方式。

我们定义的继承也非常容易看懂:

ini 复制代码
<chain id="base">
    THEN(a, b, {0}, {1});
</chain>

<chain id="implA" extends="base">
    {0}=IF(c, d, e);
    {1}=SWITCH(f).to(j,k);
</chain>

还可以多级继承:

ini 复制代码
<chain id="base">
    THEN(a, b, {0}, {1});
</chain>

<chain id="base2" extends="base">
  {0}=THEN(a,b,{3});
  {1}=SWITCH(f).to({4},k);
</chain>

<chain id="implB" extends="base2">
  {3}=THEN(a,b);
  {4}=j;
</chain>

如果你有此方面的场景,不妨尝试下继承特性。

具体使用方式请参考高级特性->链路继承

组件降级

LiteFlow之前的替补组件全面升级成组件降级特性。

组件降级允许你定义各个类型组件的降级组件。新版本提供了@FallbackCmp注解用于定义。

在EL规则中,如果你用node关键字包裹组件,便开启了降级特性:

bash 复制代码
<chain id="chain1">
    THEN(node("a"), b, c);
</chain>

当a组件不存在时,便会走到用@FallbackCmp注解定义的降级组件中去。

具体用法请参考高级特定->组件降级

支持绝对路径的模糊匹配

LiteFlow对项目内的规则文件的模糊匹配是早就支持的。但是之前的版本一直不支持绝对路径的模糊匹配。

这个版本,我们予以了支持。

你可以使用*或者**来模糊匹配多层级的任意名字的文件:

javascript 复制代码
liteflow.rule-source=/data/lf/**/*Rule.xml

如果开启了文件监听功能,还能对模糊路径匹配到的每一个文件进行监听。当文件改变的时候,实现自动刷新功能。是不是很酷。

具体用法请参考规则文件->本地规则文件配置高级功能->本地文件监听

WHEN线程池隔离

LiteFlow在v2.11.1版本中新推出了一个配置,在执行WHEN中的并行组件时,每一个when的线程池隔离,在运行复杂的嵌套WHEN链路时,这个特性非常有用。可以有效提高运行速度并且避免死锁问题。

你只需要开启这个配置即可,默认是关闭的。

ini 复制代码
liteflow.when-thread-pool-isolate=true

具体用法请参考EL规则的写法->并行编排->开启WHEN线程池隔离

完整的更新列表

bash 复制代码
特性 #I7Y0Y1 SQL插件支持轮询模式

https://gitee.com/dromara/liteFlow/issues/I7Y0Y1

特性 #I7XAIB WHEN增加must语法

https://gitee.com/dromara/liteFlow/issues/I7XAIB

特性 #I878WV EL表达式动态组装

https://gitee.com/dromara/liteFlow/issues/I878WV

特性 #I7SVZF 支持chain的继承关系特性

https://gitee.com/dromara/liteFlow/issues/I7SVZF

特性 #I7YYLF 组件降级特性

https://gitee.com/dromara/liteFlow/issues/I7YYLF

特性 #I7ZJRH 支持绝对路径的模糊匹配

https://gitee.com/dromara/liteFlow/issues/I7ZJRH

特性 #I883LB when线程池隔离支持

https://gitee.com/dromara/liteFlow/issues/I883LB

增强 #I821F1 检测链路的循环依赖问题

https://gitee.com/dromara/liteFlow/issues/I821F1

增强 #I7G6BB 自定义异步线程池初始化存在并发问题

https://gitee.com/dromara/liteFlow/issues/I7G6BB

增强 #I855YM sql 插件重构

https://gitee.com/dromara/liteFlow/issues/I855YM

修复 #I82M4G 回滚组件无法获得tag的问题

https://gitee.com/dromara/liteFlow/issues/I82M4G

修复 #I7ZMVM 普通组件isContinueOnError和isEnd为true时,process直接抛异常会导致isEnd失效

https://gitee.com/dromara/liteFlow/issues/I7ZMVM

如何加群

LiteFlow的社区群已经有大约3000人以上了。你有任何问题,都可以在群里问。

关于加群的方式,请参考:liteflow.cc/pages/73c2c...

相关推荐
星栈1 小时前
MCP 从 stdio 迁到 SSE,踩了 5 个传输层坑
人工智能·后端·架构
Conan在掘金1 小时前
鸿蒙报错速查:struct 里嵌 enum 声明就炸,根因 + 真解法
后端
回家路上绕了弯1 小时前
Java双数据源实战全指南:Spring Boot多数据源配置、原理与踩坑避坑
后端
维基框架2 小时前
GitHub重构漏洞赏金计划 向AI批量报告说不
人工智能·重构·github
神奇小汤圆2 小时前
Redis主从切换后,旧主恢复竟触发全量同步?——我猜错了,原因比想象中更严谨
后端
咖啡星人k2 小时前
【无标题】
前端·ai·github
JoyT2 小时前
滚动MAD与孤立森林在时序异常检测中的协同应用
后端
程序员cxuan2 小时前
白嫖 Claude Max 20x 漏洞完整事件始末
人工智能·后端·程序员
颜进强2 小时前
LangChain 从入门到实践:用最小案例理解 RAG 的 5 个核心抽象
前端·后端·ai编程
颜进强2 小时前
MCP 从入门到实践:用 TypeScript 实现第一个 MCP Server
前端·后端·ai编程