Spring Boot + liteflow 规则引擎,太香了!

打印 上一主题 下一主题

主题 878|帖子 878|积分 2634

作者:豫州牧
链接:https://juejin.cn/post/7296771770098745344
1、前言

在日常的开发过程中,经常会遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。
在如许的场景下,使用策略和模板模式的结合可以很好的解决这个问题,但是使用编码的方式会使得文件太多,在业务的部门环节可以如许操作,在项目角度就无法一眼洞穿其中的环节和逻辑。在本文中,将引入规则引擎从全局角度来解决这个问题,这就是今天要先容的主角 liteflow。
2、liteflow 规则引擎

liteflow 是一个轻便而且强大的规则引擎,能够实现开箱即用,可以在短时间内就可以完成复杂的规则编排,下图是 liteflow 的团体架构。liteflow 支持较多的规则文件格式,好比 xml/json/yaml, 对于规则文件的存储方式可以有sql/zk/nacos/apollo 等。

liteflow 的使用是从获取上下文开始的,通过数据上下文来解析对应的规则文件,通过 liteflow 实行器来实行对应的链路,每个链路上都有需要实行的业务 node(即节点组件,可以支持多种语言脚本, groovy/js/python/lua等), 各个业务node 之间是独立的。
liteflow 对应的官方网址和依靠如下所示:
  1. # liteflow 规则引擎官方网址
  2. https://liteflow.yomahub.com
  3. # springboot 集成 liteflow
  4. <dependency>
  5.     <groupId>com.yomahub</groupId>
  6.     <artifactId>liteflow-spring-boot-starter</artifactId>
  7.     <version>2.10.6</version>
  8. </dependency>
复制代码
liteflow 可以支持如下所示的复杂流程

此外,liteflow 可以支持热摆设,可以实时更换或者增加节点,即修改规则文件后可以实时生效。

3、liteflow 的使用方法

3.1 组件

liteflow 的组件在规则文件中即对应的节点,组件对应的种类有许多,具体的如下所示:

  • 普通组件
普通组件需要集成的是 NodeComponent, 可以用在 when 和 then 逻辑中,具体的业务需要在 process 中去实行。同时在 node 节点中,可以覆盖 iaAccess 方法,表示是否进入该节点实行业务逻辑,isContinueOnError 判定在堕落的情况下是否继续实行下一个组件,默认为 false。 isEnd 方法表示是否停止流程,默认为true。

  • 选择组件
选择组件是通过业务逻辑来判定接下来的动作要实行哪一个节点,类似于 Java中的 switch , 在代码中则需要继续 NodeSwitchComponent 实现 processWitch 方法来处理业务。
  1. # flow 规则表达式 选择组件
  2. SWITCH(a).to(b, c);
  3. # processWitch 表达式需要返回的是 b 或者 c 字符串来执行相应的业务逻辑
  4. # flow 规则表达式 条件组件
  5. IF(x, a, b);
复制代码

  • 条件组件
条件组件称之为 if 组件,返回的效果是 true 或者 false,  代码需要集成 NodeIfComponent  重写 processIf 方法,返回对应的业务节点,这个和选择组件类似。
在官方文档中,还有次数循环组件,条件循环组件,循环迭代组件,和退出循环组件,作者认为其应用场景比力复杂,可以使用简朴的普通组件来替代,毕竟是轻量级的规则引擎,重要作用就是为了编排流程顺序,复杂的场景就升级使用工作流了,所以这里只先容以上三种组件。
3.2 EL 规则文件

规则文件的编写和组件的使用是对应的,这里使用xml 的情势来编写。
  1. # 文件编排, then 代表串行执行  when 表示并行执行
  2. # 串行编排示例
  3. THEN(a, b, c, d);
  4. # 并行编排示例
  5. WHEN(a, b, c);
  6. # 串行和并行嵌套结合
  7. THEN( a, WHEN(b, c, d), e);
  8. # 选择编排示例
  9. SWITCH(a).to(b, c, d);
  10. # 条件编排示例
  11. THEN(IF(x, a),b );
复制代码
3.3 数据上下文

在 liteflow 中,数据上下文的概念非常重要,上下文对象起到参数通报的作用,因为不同业务需要的输入输出参数是不同的,所以上下文非常的重要。
  1. # 执行流程时,需要传递el文件,初始化参数以及上下文对象,这里的上下文可以设置多个
  2. LiteflowResponse response = flowExecutor.execute2Resp("chain1", 流程初始参数, CustomContext.class);
复制代码
因为上下文传入的是一个 class 范例参数,流程参数是可以传入参数的,一般情况下是在第一个节点中,将传入参数设置到上下文对象中。
Spring Boot 底子就不先容了,保举看这个实战项目:
https://github.com/javastacks/spring-boot-best-practice
3.4 参数配置

在 liteflow 中,需要配置的内容有规则文件地址,节点重试(实行报错时可以进行重试,类似于 spring-retry), 流程并行实行线程池参数配置,流程的请求ID配置。
  1. liteflow:
  2.   # 规则文件 失败重试次数 打印执行日志 监控日志
  3.   ruleSource : liteflow/*.el.xml
  4.   retry-count: 0
  5.   print-execution-log: true
  6.   monitor:
  7.     enable-log: true
  8.     period: 300000
  9.   request-id-generator-class: com.platform.orderserver.config.AppRequestIdGenerator
  10.   # 上下文的最大数量槽
  11.   slot-size : 10240
  12.   # 线程数,默认为64
  13.   main-executor-works: 64
  14.   # 异步线程最长等待时间 秒
  15.   when-max-wait-seconds: 15
  16.   # when 节点全局异步线程池最大线程数
  17.   when-max-workers: 16
  18.   # when 节点全局异步线程池队列数
  19.   when-queue-limit: 5120
  20.   # 在启动的时候就解析规则
  21.   parse-on-start: true
  22.   enable: true
复制代码
4、业务实践

之前先容了 liteflow 的一些概念,在这里结合一些业务场景来进行演示:
  1. # 主要使用电商场景的应用,订单完成后,进行积分的发放,消息发送,同时并行发送短信和邮件。
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <flow>
  4.     <chain name="test_flow">
  5.         THEN(
  6.            prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone)
  7.         );
  8.     </chain>
  9. </flow>
复制代码
在订单完成之后异步实行,通报参数并实行相应的规则流程。

在正式处理业务流程之前,需要先进行数据的预处理,将流程入参转转换成上下文对象,方便参数的通报和设置。

在具体的业务处理环节,以积分发放为例,可以获取上下文对象进行业务操作,同时也可以重写 isAccess 方法,来判定是否处理该节点。

如上图所示,具体的业务流程都可以抽象成一个 node 节点,存放在 test_flow.el.xml 中进行实行,其它的代码都和积分发放类似,这里就不再赘述,可以参见代码。
5、总结

liteflow 中的绝大部门是在启动时完成的,包括规则解析、注册组件以及组装信息,其实行性能很高,同时也可以打印每个业务环节的耗时以及统计信息。
在本文中,先容了 liteflow 的基本概念,以及具体的使用方法,具体的代码已经上传到 github:https://github.com/thedestiny/springboot-auth/
更多文章保举:
1.Spring Boot 3.x 教程,太全了!
2.2,000+ 道 Java面试题及答案整理(2024最新版)
3.免费获取 IDEA 激活码的 7 种方式(2024最新版)
觉得不错,别忘了随手点赞+转发哦!

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

耶耶耶耶耶

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表