大家好,今天,我将引入轻巧,快速且稳定的组件-Type规则-Type引擎框架LiteFlow。
1. LiteFlow简介
LiteFlow官方网站和代码仓库地址
官方网站:https://yomahub.com/liteflow
Gitee托管仓库:https://gitee.com/dromara/liteflow
github托管仓库:https://github.com/dromara/liteflow
前言
在每个公司的系统中,总是有一些具有复杂业务逻辑的系统。这些系统具有核心业务逻辑。几乎所有需求都与这些核心业务有关。这些核心业务业务逻辑是漫长的。操作,持续操作,检索到其他内部系统RPC呼叫等等。依此类推。很长时间后,该项目易于维护,并且维护成本将越来越高。各种硬码判断,越来越多的分支。代码的抽象越来越低,每个模块之间的耦合都很高。逻辑的一小部分的变化会影响其他模块,并且需要执行完整的回归测试要验证。如果您想灵活地更改业务流程的顺序,则需要更改代码以抽象和重写方法。REAL-时机更改业务流程几乎很难实现。
LiteFlow框架的角色
LiteFlow诞生于Decouple和复杂的逻辑。如果您想编写或调和复杂的业务逻辑,最适合使用LiteFlow。它是一种轻巧,快速的组件流程引擎框架,组件安排可帮助解除业务代码,允许每个业务剪辑成为一个组件,并支持热力加载规则配置以实现即时修改。
使用LiteFlow,您需要根据数字片段将复杂的业务逻辑分为一个组件之一,并定义规则过程配置。这样,可以根据规则对所有组件进行配置。
LiteFlow设计原理
LiteFlow是根据工作台模式设计的。什么是工作台模式?
n个工人被一定顺序的工作台包围,他们会按顺序产生零件。他们生产的零件最终可以组装到机器中。每个工人只需要在不了解其他工人的内容的情况下完成手中的零件的生产。每个工人的生产所需的资源都是从工作台上获取的。如果在工作台上有必要的生产资源,如果没有,则等待此资源。每个工人制造的零件也都放在工作台上。
该模型有几个好处:
此模式映射到LiteFlow框架中。工人是组成部分。坐着的工人顺序是过程配置。工作台是上下文,资源是参数,最终组装的机器是该业务。由于这些特征,LiteFlow可以实现统一的解耦组件和灵活的组装。
1)非弹簧环境
引入POM依赖性
第一步是构建您自己的业务节点,即继承nodeComponent,重写过程的过程。在业务执行过程中,该过程将被调用以执行节点的业务。
我在这里写了三本
然后编写XML文件并将其直接放在资源下
它将分析。然后执行此演示
构建一个LiteFlowConfig,通过XML的路径,然后构建FlowExecutor,最后调用FlowExecutor的execute2Respp,传递需要执行的业务过程名称链1,该名称需要执行,并在XML中配置。
结果
如果更改业务更改,现在不需要B进程,则直接完成规则文件,如图所示。
操作结果
在这里发现B没有执行。
2)Springboot环境
引入POM依赖性
要构建自己的业务节点,但是在春季的环境下,您可以使用@liteflowcomponenenenere在XML中配置标签
XML中没有声明标签
application.properties配置XML文件的路径
测试代码
结果
与非春季的环境结果一致。
如果您有一个想获得演示的朋友,则可以在三个微信公共帐户的Java日记后的Java日记中获得LiteFlow。
通过上面的示例,我们可以看到实际上,每个业务节点之间都没有耦合。用户只需要根据某些业务规则来配置节点的执行顺序,而LiteFlow可以实现业务执行。
3. LiteFlow核心组件说明
如果您解释核心组件,如果您不了解太多,则可以继续看不起,稍后将进行源代码分析。
下图显示了LiteFlow的整体体系结构
1)解析器
该组件的作用是分析进程配置的规则,即,您配置的规则规则被解释到Java代码中以运行。支持的文件格式为XML,JSON,YAML。实际上,无论哪种格式,都只有不同。用户可以根据自己的配置的习惯选择常规文件的格式。
同时,规则文件的存储当前由ZK或本地文件正式支持,还支持自定义表格。
对于XML,解析器将标签解析到节点对象中,将其解析到链对象中,然后将内部(例如和其他标签)解析为条件对象。
如下所示。
条件与节点之间的关系
条件分为以下类型
链与状况之间的关系
链实际上是用一堆条件封装的。链的执行是指在不同条件下的节点执行。首先,将执行预核中的节点节点。节点节点,最终执行后,最终将执行节点节点。
2)flowbus
该组件主要用于存储节点和链的先前步骤
3)FlowExecutor
实际上,这用于执行上面的业务流程。从flowbus找到需要执行的业务过程链,然后执行链,即以条件顺序(即业务节点)执行每个条件的节点。
4)插槽
老虎机可以理解为业务的背景。在业务流程中,该插槽被共享。
插槽具有默认默认设备。尽管可以使用默认点,但在实际业务中,将有很多弱类型。访问数据时强制数据是不方便的。因此,官员建议自己实现自己的插槽,您可以继承abslot。
5)数据库
用于管理老虎机,您可以从此获得当前业务流程执行的插槽。
第四,LiveFlow源代码探索
在谈到核心组件之后,让我们分析源代码以查看如何布置LiteFlow。
1)FlowExecutor的建设性过程
在我们的非弹簧环境的示例中,我们基于Springboot环境,FlowExecutor是由Spring创建的,但是创建过程与非弹簧示例相同。
这是构建一个FlowExecutor,该FlowExecutor被传递到规则路径Flow.xml,即规则库属性值。
输入LoadInstance方法实际上是直接的FlowExecutor。
输入FlowExecutor构造函数,以前的简单分配操作。然后调用LiveFlowConfig.isparseonStart()。此方法默认为返回true。接下来,您将调用INIT方法,即,在启动时,它将分析规则文件以确保运行时的效率。
接下来输入初始方法。
初始方法很长,让我们逐步遵循分析
较早的验证,没有案例
这条代码意味着将我们传递到多个路径的规则规则。由此我们可以看到支持多个规则的文件。对于我们的演示,只有一个是flow.xml。
分割后,您将遍历每条路径,然后判断文件的格式,例如XML,JSON,YAML,然后根据文件格式找到相应的FlowParser。
然后确定它是否支持基于LiteFlowConfig.issupportMultipletype()的多种类型。什么是多种类型,这意味着规则文件配置多个,并且文件的格式不同。然后文件的格式必须相同,可以在上次统一分析中解析相同的内容,并分析解析通过调用FlowParser的牧师。
分析后,整个初始方法将结束,然后继续调用Databus Init方法,该方法实际上是初始化的数据库。
实际上,FlowExecutor的构建已经完成。从上面我们得出一个结论,也就是说,当构建FlowExecutor时,它将通过FlowParser的牧师处理相应规则文件的路径,因此让我们分析此FlowParser如何分析XML的XML。分析。
2)流程度规则分析过程
接下来,让我们输入FlowParser,看看一个人如何分析规则。
以本文的示例为例,因为它是使用本地XML文件配置的,因此找到的FlowParser的实现是LocalXMlFlowParser。
接下来,将调用牧师方法。副群方法的实现非常简单。第一个Allflow.xml content。然后调用父类的解析方法以分析XML的内容,因此解析方法是分析XML的核心方法。
这是一个细节。PathContentParserHolder实际上使用内部的Java SPI机制来加载PathContentParser的实现,然后分析路径,获取内容并默认为春季环境中的春季优先级,但是无论它如何实现它如何实现实现角色,也就是说,获取与路径相对应的XML文件的内容。在这里,您将不会继续研究PathContentParser如何加载文件的源代码。
实际上,它不仅是PathContentparser。LiteFlow内部使用了许多SPI机制,但基本上,集成Spring实施的优先级高于框架本身的实现。
接下来,让我们看一下LocalxmlFlowser的父亲中解析方法的实现。
首先遍历每个文件的内容,然后将其转到文档。该文档实际上是DOM4J软件包。实际上,XML转换为Java对象。这可以通过Java中的方法获得XML中每个标签的数据。
将文件转换为文档后,调用Paredocument方法。
第一个调用ContectCmpinitholder.loadContextCmpinit()。INITCMP(),此代码线还通过SPI机制加载ContectCmpinit并调用InitCMP方法。框架本身具有INITCMP的空实现,但是在Spring环境中,它主要用于在Spring和Spring和Spring和将节点节点添加到flowbus。XML文件中配置的原因是因为LiteFlow会自动识别这些节点节点的弹簧bean。作为如何集成弹簧的弹簧bean,感兴趣的学生可以查看ComponentScanner的实现班级。它主要是在豆初始化之后判断的。这是总结InitCMP方法角色的图片。
至于为什么您需要在春季添加节点节点到Flowbus,实际上非常简单,主要是因为建筑链需要节点。在构建链条之前,弹簧中的节点节点已添加到Flowbus中。
接下来,您将继续遍历每个文档,即每个XML,然后在解析中获取每个标签,取出每个节点标签中的属性,通过liteFlownodeBuilder构建节点,然后将其放入flowbus。将其放入flowbus中。,您可以查看LiteFlownodeBuilder的实现。
分析节点后,下一步是解析标签。获得与每个标签相对应的元素后,请致电PareseoneChain来解析标签的内容。
parseonechain方法,首先将所有标签放在底部,然后确定标签的类型。标签有四种类型:然后,何时,预先,最终,然后获取每个标签的值以构建相应条件,即上述条件。连锁,链条。至于如何将节点设置为条件,它主要由liteFlowConditionBuilder的setValue方法实现。至于为什么需要相同的业务节点不会彼此干扰,因此您必须克隆一个新的节点对象。
构建条件后,将其设置为相应的链,最后将链条添加到Flowbus。
实际上,在这一点上,分析了整个XML。FlowParser的最重要作用是根据配置分析XML并构建节点,条件和链对象。在这些基本组件之后,可以运行业务流程。实际上,我们可以看到如何布置该过程。实际上,根据配置,将节点添加到条件中,并将条件添加到链条中。通过这种方式,相同的业务节点可以分布在不同的链条中,可重用业务代码和流程处理。
3)连锁的执行过程
在分析了流程度的作用后,即节点和链的构造函数过程,然后查看如何执行链条。
流程执行由FlowExectur执行。有许多用于执行FlowExecutor的方法。上面的演示调用的execute2Resp最终将转到下面的重载方法。
Execute2Resp方法将调用DoExecute方法来实现它,然后获取插槽,将其封装到LiveFlodResponse后退中,因此可以从这里可以看出Doexecute是核心方法。
接下来,查看DoExecute方法的实现。
doececute方法相对较长,我剪了两张图片
首先从Databus获得一个插槽,该插槽是当前业务执行的上下文。在获得需要从Flowbus执行的链条之后,最后称为链的执行,执行,执行方法。实际上,您不需要看到这些方法在做什么。实际上,调用了不同条件的节点方法。
执行和执行方法
最后两个方法称为相同的方法,即找到前提条件和最终条件,将节点节点内部取出,然后执行concute方法。
这是解释的重点。实际上,直接节点存在于该条件下,但可执行的节点。可执行文件有两个实现。一个是我们所说的节点,另一个是我们一直说的链条。我一直在谈论节点。实际上,此处可执行的可执行文件可能是链条,具体取决于规则的配置。当它是链条时,它实际上是嵌套的子过程,即在一个过程中嵌套在一个过程中的含义。只需注意它即可,因为它是链条,它将继续执行而不是停止。在该过程是节点时,只有最后一个过程的可执行文件才能执行。
在执行和执行方法之后发言之后,请查看执行方法的实现。
执行方法是确定条件的类型,然后判断它是密码条件还是条件。实际上是直接执行thencondition。如果是条件时,它实际上是在执行每个节点节点并行执行。这也是thencondition和何时条件之间的主要区别。
该图总结了链的执法过程
4)节点的执行过程
从上面,我们可以看到链的执行实际上已移交给节点以执行,但是它只是在不同阶段调用不同的节点。实际上,它最终将调用Node的执行方法,因此我们将查看它以查看它。节点的执行方法。
实例是nodeComponent对象,它是我们自定义实现的节点对象。一些人可能对如何将nodeComponent设置为节点对象感到好奇。实际上,将节点添加到flowbus时是设置的。不清楚的朋友可以关闭相关的源代码。我已经在XML的分析中说过。
首先调用NodeComponent的ISACCESS方法,以确定是否应执行业务。默认值为真。您可以重写此方法。您可以根据其他节点的情况来确定当前业务的节点是否执行。节点的执行结果可以放置在插槽中。
然后通过此方法获得了Nodeexecutor。Nodeexecutor可以通过执行方法执行NodeComponent,即执行业务。Nodeexecutor默认使用DefaultNodeexecutor子类。当然
DefaultNodeexecutor的执行方法还直接调用父级nodeexecutor的执行方法。接下来,让我们看一下Nodeexecutor的执行方法。
从实现此方法,我们可以看到LiteFlow的业务执行支持重试功能,但是无论您如何尝试,都必须在最后调用NodeComponent的执行方法。
输入NodeComponent的执行方法
红色框架由核心代码圈出。self是一个引用当前nodeComponent对象的变量,因此直接调用当前nodecorment的程序,即用于执行业务的方法。
实际上,在执行NodeComponent的过程之前和之后都有回调,即可以实现拦截的效果,这将在春季环境中生效。
至于为什么您使用自我变量而不是直接使用它,实际上,源代码还会注释。简而言之,如果过程方法是动态表示的,那么动态代理将不会生效。单独使用自我变量来引用自己。就像为什么不生效一样,这是春季的类别,所以我不会在这里重复。
实际上,此时,一个节点执行。节点的执行实际上是执行NodeComponent,而NodeComponent实际上是对Nodeexecutor执行的。
在执行每个条件中的节点后,返回插槽,以便可以由呼叫方获得整个过程的执行结果。
在这一点上,实际上,核心过程源代码分析已完成。通常,将规则配置文件转换为代码,生成节点和链条,然后通过调用链条执行业务流程。在内语中
最后绘制图片以总结整个核心源代码。
在图中,我们省略了条件的钻石,因为条件实际上是在执行节点。
以上是本文的所有内容。如果您有任何不理解或不想交流的地方,则可以注意我的个人微信公共帐户的Java日记。如果您想在关注公共帐户之后,请收到一个大型工厂的面试问题,请回答面试两个词以获取面试问题。在下一篇文章中再见。
如果您认为本文对您有帮助,请帮助您喜欢它,观看并将其转发给更多的人。代码字并不容易,非常感谢!
由上一篇流行文章推荐
原始:https://juejin.cn/post/709799114888882362381