关于开源框架:别再用硬编码写业务流程了试试这款轻量级流程编排框架

3次阅读

共计 4482 个字符,预计需要花费 12 分钟才能阅读完成。

前言

在每个公司的零碎中,总有一些领有简单业务逻辑的零碎,这些零碎承载着外围业务逻辑,简直每个需要都和这些外围业务无关,这些外围业务业务逻辑简短,波及外部逻辑运算,缓存操作,长久化操作,内部资源调取,外部其余零碎 RPC 调用等等。工夫一长,我的项目几经易手,保护的老本得就会越来越高。各种硬代码判断,分支条件越来越多。代码的形象,复用率也越来越低,各个模块之间的耦合度很高。一小段逻辑的变动,会影响到其余模块,须要进行残缺回归测试来验证。如要灵便扭转业务流程的程序,则要进行代码大改变进行形象,从新写办法。实时热变更业务流程?简直很难实现。

开源解决方案

说到流程引擎,开源界有赫赫有名的老牌开源软件 JBPM,也有近几年十分风行的 Activiti 和 Flowable。他们都是基于 BPM 协定,能够做到基于角色工作的流传,逻辑的流转。并且很多基于 BPM 协定的编辑工具都能做可视化的编辑。

但明天我要介绍的,是一款轻量级的流程编排框架——Liteflow。

Liteflow 次要致力于逻辑驱动的编排。能够满足于大部分的生产业务场景。和以上驰名的开源流程引擎相比,尽管不如他们那么全面,然而胜在轻量,高性能和极少的学习老本。而且这些我的项目都是国外开源我的项目,集成起来绝对比拟重,文档本地化也做的不够好。Liteflow 领有欠缺的本地文档和应用范例。能帮忙你的外围零碎变得更加灵便,更加易扩大。是一个解耦你零碎的利器。

https://gitee.com/bryan31/lit…

Liteflow 框架的作用

Liteflow 就是为解耦简单逻辑而生,如果你要对简单业务逻辑进行新写或者重构,用 liteflow 最合适不过。它是一个轻量,疾速的组件式流程引擎框架,组件编排,帮忙解耦业务代码,让每一个业务片段都是一个组件。

应用 Liteflow,你须要去把简单的业务逻辑按代码片段拆分成一个个小组件,并定义一个规定流程配置。这样,所有的组件,就能依照你的规定配置去进行简单的流转。同时 Liteflow 反对规定文件的热加载,即时实现批改失效。并提供多种长久化规定的形式的扩大。

Liteflow 的设计准则

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

n 个工人依照肯定程序围着一张工作台,按程序各自生产整机,生产的整机最终能组装成一个机器,每个工人只须要实现本人手中整机的生产,而无需晓得其余工人生产的内容。每一个工人生产所须要的资源都从工作台上拿取,如果工作台上有生产所必须的资源,则就进行生产,若是没有,就等到有这个资源。每个工人所做好的整机,也都放在工作台上。

这个模式有几个益处:

  • 每个工人无需和其余工人进行沟通。工人只须要关怀本人的工作内容和工作台上的资源。这样就做到了每个工人之间的解耦和无差异性。
  • 即使是工人之间调换地位,工人的工作内容和关怀的资源没有任何变动。这样就保障了每个工人的稳定性。
  • 如果是指派某个工人去其余的工作台,工人的工作内容和须要的资源仍旧没有任何变动,这样就做到了工人的可复用性。
  • 因为每个工人不须要和其余工人沟通,所以能够在生产工作进行时进行实时工位更改:替换,插入,撤掉一些工人,这样生产工作也能实时的被更改。这样就保障了整个生产工作的灵活性。

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

springboot 里疾速配置

Liteflow 反对了 springboot 的主动拆卸,当然 Liteflow 也为非 springboot 和非 spring 的我的项目也提供了反对,这里仅以 springboot 我的项目为示例进行介绍:

依赖最新的依赖包:

<dependency>
  <groupId>com.yomahub</groupId>
  <artifactId>liteflow-spring-boot-starter</artifactId>
  <version>2.3.3</version>
</dependency>

配置上规定门路:

liteflow.rule-source=config/flow.xml

定义组件

Liteflow 心愿用户把简单逻辑拆分成一个个可复用的组件,所以你得定义你的组件,组件的定义很简略,你须要继承 NodeComponent 类,而后实现process 办法就行,以下为示例:

@Component("test")
public class TestComponent extends NodeComponent {

 @Override
 public void process() {Slot slot = this.getSlot();//slot 为这个申请的上下文
  // 这里为你的业务解决逻辑
 }
}

这里会有童鞋问,我的业务办法须要入参和出参怎么办,如何传递呢?

Liteflow 为每个线程都主动调配了惟一的一个 slot,能够了解为上下文。想一想下面说的那个模型,每个组件不须要和其余组件进行信息互通,所须要的参数从 slot 里取就是了,同时,执行完业务逻辑之后,把后果也放入 slot 里。所以每个组件都是独立的无参结构,这样就打消了每个组件的差异性。

这里的 slot 能贯通所有组件,每一个组件都能够拜访到 slot 里所有的数据。当然每个申请之间的 slot,Liteflow 做了严格的隔离,不必放心数据会串的问题。

Liteflow 提供的默认 Slot 是一个弱类型的对象,这里倡议使用者本人定义一个值对象,只须要继承 AbsSlot 类,便可成为你本人的 Slot。更加贴合业务。

组件除了必须要实现的process 办法,还有几个可选实现:

isAccess:示意是否进入该节点,能够用于业务参数的预先判断

isContinueOnError:示意出错是否持续往下执行下一个组件,默认为 false

isEnd:示意是否立刻完结整个流程,默认为 false,也能够在业务日志里依据业务判断来调用 this.setIsEnd(true)来完结整个流程。

@Component("test")
public class TestComponent extends NodeComponent {

 @Override
 public void process() {Slot slot = this.getSlot();//slot 为这个申请的上下文
  // 这里为你的业务解决逻辑
 }
  
  @Override
 public boolean isAccess() {Slot slot = this.getSlot();
  // 这里做你的参数查看,如果没获取到必须的业务参数,就不会进入该组件
  boolean checkResult = true;// 模仿查看后果为 true
  return checkResult;
 }
  
  @Override
 public boolean isContinueOnError() {return super.isContinueOnError();// 默认为 false
 }
  
  @Override
 public boolean isEnd() {return super.isEnd();// 默认为 false
 }
}

你只需定义你的业务组件,之后,在启动时,Liteflow 会主动扫描到你定义的所有组件,并进行加载。

编辑规定文件

实现完了组件之后,你须要定义规定文件,之前规定文件的门路配置在了 config/flow.xml 中,所以咱们要编辑这个文件。

Liteflow 的规定文件定义非常简单好了解。简略的配置,然而能笼罩大部分的利用场景。

先来看一个示例:

<chain name="chain1">
    <then value="a,c"/> 
    <when value="b,d"/> 
    <then value="e,f,g"/>
</chain>

在 Liteflow 中,定义了 then 和 when 两种线程执行形式,then 代表串行,下面的示例中,c 必须要等 a 执行完能力执行。when 代表并行,下面的示例中,b,d 同时执行。并且 b,d 都执行完了,上面的 e,f,g 能力挨个程序执行。

再来看个略微简单点的:

<chain name="chain1">
   <then value="a,c(b|d)"/> 
   <then value="e,f,g"/>
</chain>

Liteflow 提供了条件组件,这种节点的职责就是路由,依据业务逻辑来路由到 b 节点还是 d 节点。

条件组件的定义示例如下,须要去继承 NodeCondComponent 这个类,最终返回的 b 就是最终要路由到的节点

@Component("c")
public class CComponent extends NodeCondComponent {

 @Override
 public String processCond() throws Exception {
    // 你的业务逻辑
  return "b";
 }
}

Liteflow 容许你编辑嵌套的流程,例子如下:

<chain name="chain1">
  <then value="a,c,strategy1,g"/>
</chain>

<chain name="strategy1">
  <then value="m(m1|m2|strategy2)"/>
</chain>

<chain name="strategy2">
  <then value="q,p(p1|p2)"/>
</chain>

在这个例子中,这 3 条链路是串起来执行的,在 xml 里,能够写你的组件 id,也能够写流程 id。配合之前的例子,是不是能表白的流程就更加丰盛了点呢。

以上 3 个例子涵盖了 Liteflow 最次要的性能,当然 Liteflow 还提供一些其余的个性,比方如何进行循环执行,如何打印步骤,并且 Liteflow 还提供了一个繁难的监控模块,用于统计你的组件执行状况。这里就不一一介绍了。具体你能够点击 Liteflow 的 Gitee 主页进行查看:

https://gitee.com/bryan31/lit…

示例工程

为了不便用户的应用,Liteflow 在我的项目里提供了一个测试用例,你能够间接拿来跑:

同时作者还做了一个带简略业务的示例工程,来演示如何具体实际:

https://gitee.com/bryan31/lit…

这个简略业务是一个电商场景的价格计算的案例,如何通过拆分组件来组合不同的影响价格的业务。并且这个示例工程还提供了一个简略的页面供大家进行调试:

最初

在流程编排开源上,国内始终没有特地驰名的开源我的项目。Liteflow 的体量尽管无奈和业界驰名的流程引擎相比,然而在某些场景,确实提供了轻量级的解决方案。并且 Liteflow 通过了公司生产大流量业务的考验,在稳定性和性能方面有肯定保障。心愿 Liteflow 这个开源框架能帮忙到有这方面业务须要的同学们。

对于我

我是一个开源作者,也是一名内容创作者。「元人部落」是一个保持做原创的技术科技分享号,会始终分享原创的技术文章,陪你一起成长。关注回复 liteflow 能退出群聊,这里有很多大佬能和你一起探讨技术,答复你的问题。

正文完
 0