ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

告别if else!试试这款轻量级规则引擎框架,真香!

告别if else!试试这款轻量级规则引擎框架,真香! 来源/post/前言日常开展开发工作时, 常常会碰到某些串行或者并行的业务流程方面的问题, 并且业务间不存在必然的相关性。处于这样的情形之下, 运用策略以及模板模式相结合这种方式能够很好地处理这个问题, 然而采用编码的办法会致使文件数量过多, 在业务的部分运转阶段能够如此操作, 从项目层面就没办法一下子看透里边的环节以及逻辑情况。于此时此刻, 将会引入规则引擎从整体角度去处理这个问题, 这便是今日要予以介绍的关键所在。规则引擎这是个具备轻巧特性且拥有强大功能的规则引擎, 它能够达成开箱即用的状态, 经过短时间便能够去完成复杂的规则编排工作, 相应的整体架构呈现于下图。它支持较多模式的规则文件格式化形式, 诸如 xml/json/yaml 这类, 对于规则文件所采用的存储方式存在 sql/zk/nacos 等多个选项。开始要去获取上下文, 然后才是其使用, 借助数据上下文进而对对应的规则文件予以解析, 依靠执行器去执行对应的链路, 每个链路上都存在着需要执行的业务node, 也就是节点组件, 它能够支持多种语言脚本, 像/js//lua等, 各个业务node彼此之间是独立的, 对应的官方网址和依赖如下呈现:#规则引擎官方网址#集成com.--boot-2.10.6可以支持如下所示的复杂流程另外, 能够给予热部署方面的支持, 这种支持能够实现实时对节点开展替换或者增添的操作, 这也就是说, 只要对规则文件作出修改, 那么就能够实现实时生效的结果。的使用方法组件在规则文件里对应节点的相应组件, 其对应的组件种类存在诸多类别, 详细情况是这样的:用于 when 和 then 逻辑里的普通组件所需集成的, 是在其中执行具体业务的特定内容。与此同时, 在 node 节点当中, 能够覆盖一个方法, 以此来表明是否进入该节点去执行业务逻辑, 还能判断在出错情形下是否持续执行下一个组件, 其默认值为 false。而 isEnd 方法则是用来表示是否终止流程, 默认值为 true。选择组件借助业务逻辑去判定接下来要执行的动作是哪一个节点, 其情形等同于Java里的状况 , 于代码当中需要继承 , 并实现 方法去处理业务。#flow规则表达式选择组件(a).to(b,c);#表达式需要返回的是b或者c字符串来执行相应的业务逻辑#flow规则表达式条件组件IF(x,a,b);被称作 if 组件的条件组件, 其返回结果为 true 或者 false, 代码要集成重写方法来返回对应的业务节点, 这与选择组件相似。在官方文档当中, 存在次数循环组件, 存在条件循环组件, 存在循环迭代组件, 还存在退出循环组件, 作者以为其应用场景相对复杂, 能够运用简单的普通组件予以替代, 毕竟这是轻量级的规则引擎, 主要起到的作用便是编排流程顺序, 复杂的场景便升级运用工作流了, 所以此处仅介绍上述三种组件。EL 规则文件规则文件的编写, 其形式是对应组件的使用情况, 编写当前采用的是 xml 这种形式。# 进行文件编排时, then所代表的是串行执行操作, 而when所表示的则为并行执行操作。# 串行编排示例THEN(a, b, c, d);# 并行编排示例WHEN(a, b, c);# 串行和并行嵌套结合THEN( a, WHEN(b, c, d), e);# 选择编排示例(a).to(b, c, d);# 条件编排示例THEN(IF(x, a),b );数据上下文在其中情况下, 数据上下文的概念格外重要哩, 进而能发现, 上下文对象起到参数传递的用场, 由于各个不同的业务所需的输入输出参数是不一样的, 故而能够知晓, 上下文真的是具相当重要性的。执行流程之际要传递el文件, 还要初始化参数, 并且要传递上下文对象, 此处的上下文能够设置多个。 .(, 流程初始参数, .class);由于上下文所传入的, 乃是一个class类型的参数, 流程参数具备能够传入参数的特性, 通常情形下, 是于第一个节点里, 把传入参数设定至上下文对象当中。参数配置其中, 要配置的内容包含规则文件地址, 有着节点重试, 即执行报错时能够进行重试, 类似 -retry, 还存在流程并行执行线程池参数配置, 以及流程的请求ID配置。:#规则文件失败重试次数打印执行日志监控日志:/*.el.xmlretry-count:0print--log:true:-log:true:-id--class:com....r#上下文的最大数量槽slot-size:10240#线程数默认为64main--works:64#异步线程最长等待时间秒when-max-wait-:15#when节点全局异步线程池最大线程数when-max-:16#when节点全局异步线程池队列数when-queue-limit:5120#在启动的时候就解析规则parse-on-start:true:true业务实践之前介绍了 的一些概念在这里结合一些业务场景来进行演示:对主要应用于电商场景的情况而言, 在订单完成之后, 会开展积分的发放工作, 还会进行消息发送, 并且会同时以并行的方式发送短信以及邮件。THEN(,,,WHEN(,));在订单完成之后异步执行传递参数并执行相应的规则流程。正式处理业务流程之前, 要先做数据的预处理, 把流程入参转成上下文对象, 借此方便参数的传递, 方便参数的设置。在具体的业务处理环节之中, 就拿积分发放当作例子来说, 能够获取上下文对象用以开展业务操作, 与此同时, 还能够重写方法, 以此来判断是不是要处理该节点。如下图所呈现的那样, 确切的业务流程能够都被抽象成为一个 node 节点, 放置于 .el.xml 当中以便执行, 其余的代码均与积分发放相类似, 此处便不再过多叙述, 能够参见代码。总结开展的绝大多数是于启动之际达成的, 涵盖规则解析、注册组件以及组装信息, 其执行效能颇高, 并且能够打印每个业务环节的耗时以及统计信息。于本文里, 阐述了的基本概念, 以及具体的运用方式。
返回列表