关于后端:规则引擎框架LiteFlow在渠道API项目中的应用

42次阅读

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

作者:随风

一、渠道 API 我的项目简介
“渠道 API”是一种通过流量平台间接获取用户流量的形式。传统上咱们获取流量的形式有:投放广告,吸引用户下载主营 APP 进而应用借款服务;投放 H5 服务,用户通过不同渠道关上 H5 页面应用借款服务。
“渠道 API”的形式是指用户间接在流量方的原生 APP 中应用咱们的借款服务,这就须要将咱们的零碎能力依照约定的标准封装成一套 API 接口提供给流量方服务端调用。这里的标准能够是我方定义的,也能够是流量方定义的。这里次要探讨依照流量方规范进行接入的形式。
为了进步对接的效率,咱们冀望在接入一家新渠道的时候,所做的工作越简略越好,越少越好。最好每个 API 只须要适配申请参数,调用底层服务,封装响应后果。但要积淀这样的底层服务何谈容易,就借款来说波及的次要流程有:准入判断、授信申请、银行卡绑定、借款、还款。首先,单个业务流程的逻辑就很简单,拿授信申请来说,须要实现用户注册、前置校验判断、实名认证、保留用户根底信息、联系人信息、支出信息、身份证照片认证、活体照片认证、戳额等,而且身份证照片认证、活体照片认证、戳额都是异步服务,须要期待认证后果来驱动流程进行。其次,不同流量方的流程也是不一样的,有的有独自的绑卡流程,有的绑卡是嵌入到借款流程中的;有的用户信息是在授信申请流程中提交,有的是在借款流程中提交;有的能够在借款流程中从新进行身份证照片认证,以防认证过期,有的则不能够。

二、引入 LiteFlow 的起因
若以传统形式实现各业务流程,则很难防止大量硬编码判断逻辑, 导致系统可扩展性差,保护老本高。咱们心愿能够将一个个业务片段封装成组件,在这些组件根底上为不同流量方的不同流程编排不同的解决逻辑。因而,咱们引入了 LiteFlow 框架。

三、LiteFlow 简介
LiteFlow 是一个十分弱小的现代化的规定引擎框架,交融了编排个性和规定引擎的所有个性。
LiteFlow 为解耦逻辑而生,为编排而生,在应用 LiteFlow 之后,你会发现打造一个低耦合,灵便的零碎会变得大海捞针!
利用 LiteFlow,你能够将瀑布流式的代码,转变成以组件为外围概念的代码构造,这种构造的益处是能够任意编排,组件与组件之间是解耦的,组件能够用脚本来定义,组件之间的流转全靠规定来驱动。LiteFlow 领有开源规定引擎最为简略的 DSL 语法。十分钟就可上手。

组件可实时热更替,也能够给编排好的逻辑流里实时减少一个组件,从而扭转你的业务逻辑。

LiteFlow 的脚本组件,反对泛滥脚本语言,齐全和 Java 买通,你能够用脚本来实现任何逻辑。

LiteFlow 反对把编排规定和脚本放在数据库,注册核心中,还有能够任意扩大的接口,不便你定制。

编排语法弱小到能够编排出任何你想要的逻辑流程。

LiteFlow 具备如下个性:
• 组件定义对立:所有的逻辑都是组件,为所有的逻辑提供统一化的组件实现形式,小身材,大能量。
• 规定轻量:基于规定文件来编排流程,学习规定入门只须要 5 分钟,一看即懂。
• 规定多样化:规定反对 xml、json、yml 三种规定文件形式,喜爱哪种用哪个。
• 任意编排:再简单的逻辑过程,利用 LiteFlow 的规定,都是很容易做到的,看规定文件就能晓得逻辑是如何运行的。
• 规定长久化:框架原生反对把规定存储在规范结构化数据库,Nacos,Etcd,Zookeeper,Apollo,Redis。您也能够本人扩大,把规定存储在任何中央。
• 优雅热刷新机制:规定变动,无需重启您的利用,即时扭转利用的规定。高并发下不会因为刷新规定导致正在执行的规定有任何错乱。
• 反对宽泛:不论你的我的项目是不是基于 Springboot,Spring 还是任何其余 java 框架构建,LiteFlow 都能熟能生巧。
• JDK 反对:从 JDK8 到 JDK17,通通反对。无需放心 JDK 版本。
• Springboot 反对全面:反对 Springboot 2.X 到最新的 Springboot 3.X。
• 脚本语言反对:能够定义脚本语言节点,反对 Groovy,Java,Javascript,QLExpress,Python,Lua,Aviator。将来还会反对更多的脚本语言。
• 脚本和 Java 全买通:所有脚本语言均可调用 Java 办法,甚至于能够援用任意的实例,在脚本中调用 RPC 也是反对的。
• 规定嵌套反对:只有你想的出,你能够利用简略的表达式实现多重嵌套的简单逻辑编排。
• 组件重试反对:组件能够反对重试,每个组件均可自定义重试配置和指定异样。
• 上下文隔离机制:牢靠的上下文隔离机制,你无需放心高并发状况下的数据串流。
• 申明式组件反对:你能够让你的任意类秒变组件。
• 具体的步骤信息:你的链路如何执行的,每个组件耗时多少,报了什么错,高深莫测。
• 稳固牢靠:历时 2 年多的迭代在各大公司的外围零碎上稳固运行。
• 性能卓越:框架自身简直不耗费额定性能,性能取决你的组件执行效率。
• 自带简略监控:框架内自带一个命令行的监控,可能晓得每个组件的运行耗时排行。
四、LiteFlow 集成示例

  1. 引入依赖
  1. 实现业务组件

  1. spring boot 配置
  2. 新增规定表
    在数据库中,新建一张表来存储编排规定。在规定表中,一行数据就是一个规定。在脚本表中,一行数据就是一个脚本组件。
    规定表:liteflow_chain
  3. 加载规定并执行

    而后你就能够在 Springboot 任意被 Spring 托管的类中拿到 flowExecutor,进行执行链路:

五、我的项目中应用 liteflow 的教训
对于存在多种驱动形式的业务流程,咱们倡议编排一个残缺的解决逻辑,而后通过 isAccess()办法针对特定节点进行跳过解决。这种形式能够防止逻辑扩散,更加直观。
以“授信申请”流程为例,授信申请须要实现用户注册、前置校验、实名认证、保留用户信息、身份证照片认证、戳额操作。咱们个别会编排如下流程:
用户被动发动授信申请的流程

收到身份证认证后果告诉 MQ 的流程

执行状态弥补定时工作流程

但这种形式有如下毛病:因为流程的解决逻辑扩散在不同的中央,导致咱们无奈直观地理解流程的整体解决逻辑,在需要变更的时候,就有可能考虑不周,脱漏某些批改。
倡议咱们能够编排一个残缺的业务解决流程,无论是用户被动发动、接管到告诉音讯、还是定时工作都走同样的流程。这样将解决逻辑集中在一块,让咱们对授信流程有个整体的把握,减少程序的可读性、可维护性。残缺流程如下:

此时有一个问题,流程中有些组件应该只执行一次,怎么防止每次流程运行都执行这些组件呢?LiteFlow 的组件基类 NodeComponent 有一个办法 public boolean isAccess(),如果返回 false,则跳过该组件。这样咱们能够重写组件的 isAccess 办法并将组件的执行状态记录在数据库中,每次执行到该组件的时候,依据状态判断是否须要执行。

正文完
 0