在每个公司的系统中,总有一些拥有复杂业务逻辑的系统,这些系统承载着核心业务逻辑,几乎每个需求都和这些核心业务有关,这些核心业务业务逻辑冗长,涉及内部逻辑运算,缓存操作,持久化操作,外部资源调取,内部其他系统 RPC 调用等等。时间一长,项目几经易手,维护的成本就会越来越高。各种硬代码判断,分支条件越来越多。代码的抽象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其他模块,需要进行完整回归测试来验证。如要灵活改变业务流程的顺序,则要进行代码大改动进行抽象,重新写方法。实时热变更业务流程,几乎很难实现。
如何打破僵局?LiteFlow 为解耦逻辑而生,为编排而生,在使用 LiteFlow 之后,会发现打造一个低耦合,灵活的系统会变得易如反掌!
功能特性
-
「组件定义统一:」 所有的逻辑都是组件,为所有的逻辑提供统一化的组件实现方式,小身材,大能量。 -
「规则轻量:」基于规则文件来编排流程,学习规则入门只需要 5 分钟,一看即懂。 -
「规则多样化:」规则支持 xml、json、yml 三种规则文件写法方式,喜欢哪种用哪个。 -
「任意编排:」同步异步混编,再复杂的逻辑过程,利用 LiteFlow 的规则,都是很容易做到的,看规则文件就能知道逻辑是如何运转的。 -
「规则能从任意地方加载:」框架中提供本地文件配置源和 zk 配置源的实现,也提供了扩展接口,您可以把规则存储在任何地方。 -
「优雅热刷新机制:」规则变化,无需重启应用,即时改变应用的规则。高并发下不会因为刷新规则导致正在执行的规则有任何错乱。 -
「支持广泛:」不管你的项目是不是基于 Springboot,Spring 还是任何其他 java 框架构建,LiteFlow 都能游刃有余。 -
「JDK 支持:」从 JDK8 到 JDK17,统统支持。无需担心 JDK 版本。 -
「脚本语言支持:」可以定义脚本语言节点,支持 QLExpress 和 Groovy 两种脚本。未来还会支持更多的脚本语言。 -
「规则嵌套支持:」只要想得出,可以利用简单的表达式完成多重嵌套的复杂逻辑编排。 -
「组件重试支持:」组件可以支持重试,每个组件均可自定义重试配置和指定异常。 -
「上下文隔离机制:」可靠的上下文隔离机制,无需担心高并发情况下的数据串流。 -
「声明式组件支持:」可以让任意类秒变组件。 -
「详细的步骤信息:」链路如何执行的,每个组件耗时多少,报了什么错,一目了然。 -
「稳定可靠:」历时 2 年多的迭代,在各大公司的核心系统上稳定运行。 -
「性能卓越:」框架本身几乎不消耗额外的性能,性能取决组件执行效率。 -
「自带简单监控:」框架内自带一个命令行的监控,能够知道每个组件的运行耗时排行。
系统架构
框架优势
如果要对复杂业务逻辑进行新写或者重构,用 LiteFlow 最合适不过。它是一个编排式的规则引擎框架,组件编排,帮助解耦业务代码,让每一个业务片段都是一个组件。
利用 LiteFlow,你可以将瀑布流式的代码,转变成以组件为核心概念的代码结构,这种结构的好处是可以任意编排,组件与组件之间是解耦的,组件可以用脚本来定义,组件之间的流转全靠规则来驱动。LiteFlow 拥有开源规则引擎最为简单的 DSL 语法。十分钟就可上手。
组件可实时热更替,也可以给编排好的逻辑流里实时增加一个组件,从而改变你的业务逻辑。
LiteFlow 的脚本组件,支持众多脚本语言,完全和 Java 打通,可以用脚本来实现任何逻辑。
LiteFlow 支持把编排规则和脚本放在数据库,注册中心中,还有可以任意扩展的接口,方便定制。
LiteFlow 编排语法强大到可以编排出任何想要的逻辑流程,你有想过,要在代码中实现下面这种复杂逻辑流程该如何实现吗?
「例如:」
同时要保证所有组件都是灵活可变的。
我相信肯定有人能实现,但是是需要付出一定的开发成本的。
而以上这一切,利用 LiteFlow,轻而易举,你立马唾手可得!
适用场景
适用于哪些场景:
LiteFlow 适用于拥有复杂逻辑的业务,比如说价格引擎,下单流程等,这些业务往往都拥有很多步骤,这些步骤完全可以按照业务粒度拆分成一个个独立的组件,进行装配复用变更。使用 LiteFlow,你会得到一个灵活度高,扩展性很强的系统。因为组件之间相互独立,也可以避免改一处而动全身的这样的风险。
不适用于哪些场景:
LiteFlow 自开源来,经常有一些小伙伴来问我,如何做角色任务之间的流转,类似于审批流,A 审批完应该是 B 审批,然后再流转到 C 角色。
「提示:」 这里申明下,LiteFlow 只做基于逻辑的流转,而不做基于角色任务的流转。如果你想做基于角色任务的流转,推荐使用 flowable (opens new window),activiti (opens new window)这 2 个框架。
Springboot 场景安装运行
依赖:
<dependency>
<groupId>com.yomahub</groupId>
<artifactId>liteflow-spring-boot-starter</artifactId>
<version>2.8.2</version>
</dependency>
配置:
组件的定义:
-
在依赖了以上 jar 包后,需要定义并实现一些组件,确保 SpringBoot 会扫描到这些组件并注册进上下文
@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 配置文件:」
然后,在 SpringBoot 的 application.properties 或者 application.yml 里添加配置(这里以 properties 为例,yaml 也是一样的)
liteflow.rule-source=config/flow.el.xml
「规则文件的定义:」
同时,得在 resources 下的 config/flow.el.xml 中定义规则
<?xml version="1.0" encoding="UTF-8"?>
<flow>
<chain name="chain1">
THEN(a, b, c);
</chain>
</flow>
SpringBoot 在启动时会自动装载规则文件。
执行:
声明启动类:
@SpringBootApplication
//把你定义的组件扫入Spring上下文中
@ComponentScan({"com.xxx.xxx.cmp"})
public class LiteflowExampleApplication {
public static void main(String[] args) {
SpringApplication.run(LiteflowExampleApplication.class, args);
}
}
然后就可以在 Springboot 任意被 Spring 托管的类中拿到 flowExecutor,进行执行链路:
@Component
public class YourClass{
@Resource
private FlowExecutor flowExecutor;
public void testConfig(){
LiteflowResponse response = flowExecutor.execute2Resp("chain1", "arg");
}
}
「提示:」这个 DefaultContext 是默认的上下文,用户可以用最自己的任意 Bean 当做上下文传入,如果需要传入自己的上下文,则需要传用户 Bean 的 Class 属性,具体请看数据上下文这一章节。
示例
这个案例为一个价格计算引擎,其目的是模拟了电商中对订单价格的计算。
传送门
开源协议:Apache2.0
开源地址:https://github.com/dromara/liteflow
「回复【加群】加入开源技术交流群,干货很多!」
-END-
原文始发于微信公众号(开源技术专栏):开箱即用的轻量级组件式规则引擎 LiteFlow
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135617.html