株洲做网站定制,珠海做网站三年多少钱,wordpress 教 模版,国外设计公司网站1前言
在日常的开发过程中#xff0c;经常会遇到一些串行或者并行的业务流程问题#xff0c;而业务之间不必存在相关性。
在这样的场景下#xff0c;使用策略和模板模式的结合可以很好的解决这个问题#xff0c;但是使用编码的方式会使得文件太多,在业务的部分环节可以这…1前言
在日常的开发过程中经常会遇到一些串行或者并行的业务流程问题而业务之间不必存在相关性。
在这样的场景下使用策略和模板模式的结合可以很好的解决这个问题但是使用编码的方式会使得文件太多,在业务的部分环节可以这样操作在项目角度就无法一眼洞穿其中的环节和逻辑。
在本文中将引入规则引擎从全局角度来解决这个问题这就是今天要介绍的主角 liteflow。
2liteflow 规则引擎
liteflow 是一个轻巧而且强大的规则引擎能够实现开箱即用可以在短时间内就可以完成复杂的规则编排下图是 liteflow 的整体架构。liteflow 支持较多的规则文件格式比如 xml/json/yaml 对于规则文件的存储方式可以有sql/zk/nacos/apollo 等。 liteflow 的使用是从获取上下文开始的通过数据上下文来解析对应的规则文件通过 liteflow 执行器来执行对应的链路每个链路上都有需要执行的业务 node即节点组件可以支持多种语言脚本 groovy/js/python/lua等, 各个业务node 之间是独立的。liteflow 对应的官方网址和依赖如下所示
liteflow 规则引擎官方网址 https://liteflow.yomahub.com
dependencygroupIdcom.yomahub/groupIdartifactIdliteflow-spring-boot-starter/artifactIdversion2.10.6/version
/dependency
liteflow 可以支持如下所示的复杂流程 此外liteflow 可以支持热部署可以实时替换或者增加节点即修改规则文件后可以实时生效。 3liteflow 的使用方法
3.1 组件
liteflow 的组件在规则文件中即对应的节点组件对应的种类有很多具体的如下所示 普通组件
普通组件需要集成的是 NodeComponent, 可以用在 when 和 then 逻辑中具体的业务需要在 process 中去执行。同时在 node 节点中可以覆盖 iaAccess 方法表示是否进入该节点执行业务逻辑isContinueOnError 判断在出错的情况下是否继续执行下一个组件默认为 false。isEnd 方法表示是否终止流程默认为true。 选择组件
选择组件是通过业务逻辑来判断接下来的动作要执行哪一个节点类似于 Java中的 switch , 在代码中则需要继承 NodeSwitchComponent 实现 processWitch 方法来处理业务。
# flow 规则表达式 选择组件
SWITCH(a).to(b, c);
# processWitch 表达式需要返回的是 b 或者 c 字符串来执行相应的业务逻辑
# flow 规则表达式 条件组件
IF(x, a, b);条件组件
条件组件称之为 if 组件返回的结果是 true 或者 false, 代码需要集成 NodeIfComponent 重写 processIf 方法返回对应的业务节点这个和选择组件类似。
在官方文档中还有次数循环组件条件循环组件循环迭代组件和退出循环组件作者认为其应用场景比较复杂可以使用简单的普通组件来替代毕竟是轻量级的规则引擎主要作用就是为了编排流程顺序复杂的场景就升级使用工作流了所以这里只介绍以上三种组件。
3.2 EL 规则文件
规则文件的编写和组件的使用是对应的这里使用xml 的形式来编写。
# 文件编排 then 代表串行执行 when 表示并行执行
# 串行编排示例
THEN(a, b, c, d);
# 并行编排示例
WHEN(a, b, c);
# 串行和并行嵌套结合
THEN( a, WHEN(b, c, d), e);
# 选择编排示例
SWITCH(a).to(b, c, d);
# 条件编排示例
THEN(IF(x, a),b );3.3 数据上下文
在 liteflow 中数据上下文的概念非常重要上下文对象起到参数传递的作用因为不同业务需要的输入输出参数是不同的所以上下文非常的重要。
# 执行流程时需要传递el文件初始化参数以及上下文对象这里的上下文可以设置多个
LiteflowResponse response flowExecutor.execute2Resp(chain1, 流程初始参数, CustomContext.class);因为上下文传入的是一个 class 类型参数流程参数是可以传入参数的一般情况下是在第一个节点中将传入参数设置到上下文对象中。
3.4 参数配置
在 liteflow 中需要配置的内容有规则文件地址节点重试执行报错时可以进行重试类似于 spring-retry, 流程并行执行线程池参数配置流程的请求ID配置。
liteflow:# 规则文件 失败重试次数 打印执行日志 监控日志ruleSource : liteflow/*.el.xmlretry-count: 0print-execution-log: truemonitor:enable-log: trueperiod: 300000request-id-generator-class: com.platform.orderserver.config.AppRequestIdGenerator# 上下文的最大数量槽slot-size : 10240# 线程数默认为64main-executor-works: 64# 异步线程最长等待时间 秒when-max-wait-seconds: 15# when 节点全局异步线程池最大线程数when-max-workers: 16# when 节点全局异步线程池队列数when-queue-limit: 5120# 在启动的时候就解析规则parse-on-start: trueenable: true4业务实践
之前介绍了 liteflow 的一些概念在这里结合一些业务场景来进行演示: 主要使用电商场景的应用订单完成后进行积分的发放消息发送同时并行发送短信和邮件。 ?xml version1.0 encodingUTF-8?
flowchain nametest_flowTHEN(prepareTrade, grantScore, sendMq, WHEN(sendEmail, sendPhone));/chain
/flow在订单完成之后异步执行传递参数并执行相应的规则流程。 在正式处理业务流程之前需要先进行数据的预处理将流程入参转转换成上下文对象方便参数的传递和设置。 在具体的业务处理环节以积分发放为例可以获取上下文对象进行业务操作同时也可以重写 isAccess 方法来判断是否处理该节点。 如上图所示具体的业务流程都可以抽象成一个 node 节点存放在 test_flow.el.xml 中进行执行其它的代码都和积分发放类似这里就不再赘述可以参见代码。
5总结
liteflow 中的绝大部分是在启动时完成的包括规则解析、注册组件以及组装信息其执行性能很高同时也可以打印每个业务环节的耗时以及统计信息。
最后说一句(求关注!别白嫖)
如果这篇文章对您有所帮助或者有所启发的话求一键三连点赞、转发、在看。
关注公众号woniuxgg在公众号中回复笔记 就可以获得蜗牛为你精心准备的java实战语雀笔记回复面试、开发手册、有超赞的粉丝福利