规则引擎LiteFlow发布v2.12.1版本,决策路由特性

news2024/11/25 21:21:53

个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview


简介

标题其实是不准确的,了解过的会知道在LiteFlow2.12.0已经有了决策路由的特性,但我为什么标题这么讲呢?且往下看。

因为这篇文章LF的重磅特性预告:决策路由,我一直期待着决策路由功能的发布,终于有一天它发布了!

决策路由特性来袭,LiteFlow大版本2.12.0发布,Make your code amaing!。

虽然这次是大更新,发布的不只是决策路由,但是我心心念念的决策路由并没有我期待的那样好用,因为这个版本的路由是全局匹配,没有分组或分级的概念,在实际使用中并不那么好用。虽然能通过一些代码来实现类似的分组功能,但是肯定不如框架实现的好,同时也不想因此将代码来回变动,所以通过社区向作者提意见,正好作者早有此想法,非常nice!

这次规则引擎LiteFlow发布v2.12.1版本,有多猛用过才知道,2.12.1版本带来此功能,我也默默的将许久未编辑的《LiteFlow大版本2.12.0发布,决策路由发布》的文章重命名了标题《规则引擎LiteFlow发布v2.12.1版本,决策路由特性》。

参考

🏖概念以及介绍 | LiteFlow

2.12.0升级指南 | LiteFlow

决策路由

说明

关于LiteFlow,不想再过多介绍了。之前的文章也有说明了风控系统之普通规则条件,使用LiteFlow实现。

非常推荐通过官网来学习,很有帮助!

路由嘛,知道Nginx吧,可以理解为location的配置,不知道Nginx,类比微服务网关也一样。

2.12.0版本加入了路由特性,新增了routebody标签。

<chain name="chain1">
    <route>
        AND(r1, r2, r3)
    </route>
    <body>
        THEN(a, b, c);
    </body>
</chain>

<chain name="chain2">
    <route>
        AND(OR(r4, r5), NOT(r3))
    </route>
    <body>
        SWITCH(x).TO(d, e, f);
    </body>
</chain>

同时提供了专门用于执行路由chain的方法。

List<LiteflowResponse> responseList = flowExecutor.executeRouteChain(requestData, YourContext.class);

在此版本中存在一个很大的问题,或者说是不便。

此方法会执行所有的路由chain,那么所有的路由chain就被限制住了。

举个例子,如果业务需要如下这样决策流程,数据接入后想利用决策路由的特性确定跑哪个策略集,到这里决策路由还是很有用的,但是策略集下其实还有很多规则的,进入策略集后应该还要继续进行决策路由,并行跑所有规则。那么这里就出问题了,因为策略集路由明显和规则路由不是一个概念,而且还不能同时跑,是要策略路由跑完后再进行规则路由的。

LiteFlow2.12.1版本,加入了路由分组管理。

<chain name="chain1" namespace="n1">
    <route>
        AND(r1, r2, r3)
    </route>
    <body>
        THEN(a, b, c);
    </body>
</chain>

同时加入执行分组的方法,很好的解决了此问题。

List<LiteflowResponse> responseList = flowExecutor.executeRouteChain("n1", requestData, YourContext.class);

但是

就那上面这张图举例子,步骤有:

1、数据接入

2、判断要执行哪个策略集(唯一)

3、判断要执行策略下的哪些规则(多个)

原先判断要执行哪个策略集需要硬编码确认,有了决策路由就可以配置好route,每个策略集route分配好唯一的namespace,如:每个策略集namespace命名可以是ss-${appName}-${strategySetCode}ssstrategySet的简写,标识namespace属于策略集,唯一性由${appName}-${strategySetCode}动态决定。判断要执行策略下哪些规则的namespace可以命名为rule-${strategyId}rule代表规则路由,后面拼上策略id用于确认规则在哪个策略下,这样确认策略后就可以并行多个执行了。

但写着写着发现还有一个问题,当前决策路由执行好像只有这个方法,没有提供隐式子流程调用,也就说现在执行多个路由只能在不同的流程内,策略集流程执行后如果要执行规则流程的话,只能另行执行路由,两个流程独立开了,这样对我来讲其实是不对的,因为它们是公用上下文的,在同一流程内很有必要。

这个只能暂时期待住了,好像确实没有好的办法,有个方法是上下文复制传下去,但这又和LiteFlow组件化,上下文的思想违背了,和普通的瀑布流程好像又是一样的了,而且将两个流程割裂了,不太好。

flowExecutor.executeRouteChain("n1", requestData, YourContext.class);

上下文参数注入

上下文是LiteFlow中一个非常重要的概念,详细请查看官网🍄说明 | LiteFlow。

上下文参数注入之适用于声明式组件,声明式组件请看官网🥭什么叫声明式组件 | LiteFlow。

哈哈哈,全是看官网。。。

示例

在过去,没有上下文参数注入时,通过声明式组件获取上下文是这样的。

@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "accessIn", nodeType = NodeTypeEnum.COMMON)
public void accessIn(NodeComponent bindCmp) {
    DecisionRequest decisionRequest = bindCmp.getContextBean(DecisionRequest.class);
    // 处理入参
    Map<String, String> params = decisionRequest.getParams();
    log.info("入参:{}", params);

    ...

}

而有了上下文参数注入特性后就可简化,如下。

@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS, nodeId = "accessIn", nodeType = NodeTypeEnum.COMMON)
public void accessIn(NodeComponent bindCmp, @LiteflowFact("params") Map<String, String> params) {
    log.info("入参:{}", params);

}

@LiteflowFact中写的表达式,会自动的从上下文中搜索相应的参数。即使你有多个上下文,也无需去指定上下文。

但是有一种情况,在使用时要注意:假设你有两个上下文,TestContext1TestContext2,在这两个上下文里都有user这个对象,并且两个user里的信息是不一样的。这时你通过@LiteflowFact("user") User user这样去拿,拿到的是第一个user,在不同环境上可能还不一样。

所以使用上下文参数注入特性时,如果有多个上下文,请确保注入的对象,在多个上下文中只有一份,否则会有错乱情况。

其实它的意义不仅仅是“简化”,对我来讲它其实是解放了声明式组件,原来在我们编写了声明式组件后,他就只是个LiteFlow组件了,甚至不能做其他事情了。

如上例子public void accessIn(NodeComponent bindCmp),方法体中使用到了bindCmp获取上下文,并使用这个上下文执行某些流程。这样的话这个方法就困死在LiteFlow组件中了,因为我们并没有这个bindCmp传进方法内。而加入了上下文参数注入后,此方法就变为public void accessIn(NodeComponent bindCmp, @LiteflowFact("params") Map<String, String> params),看似好像只是加了一个参数,其实也是加了个参数😂但是因为这个参数,间接的解放了此方法,这时我们再调用此方法不用关心bindCmp了(前提是方法体中没用到这个),关注@LiteflowFact修饰的参数即可。

写在最后

拙作艰辛,字句心血,望诸君垂青,多予支持,不胜感激。


个人博客:无奈何杨(wnhyang)

个人语雀:wnhyang

共享语雀:在线知识共享

Github:wnhyang - Overview

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1795706.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python数据文件处理库-pandas

内容目录 一、pandas介绍二、数据加载和写出三、数据清洗四、数据转换五、数据查询和筛选六、数据统计七、数据可视化 pandas 是一个 Python提供的快速、灵活的数据结构处理包&#xff0c;让“关系型”或“标记型”数据的交互既简单又直观。 官网地址: https://pandas.pydata.o…

树形表/树形数据接口的开发

数据表格式 需要返回的json格式 点击查看json数据 [{"childrenTreeNodes" : [{"childrenTreeNodes" : null,"id" : "1-1-1","isLeaf" : null,"isShow" : null,"label" : "HTML/CSS","na…

14.pinia初始与安装

pinia初始与安装 pinia官网 https://pinia.vuejs.org/ https://pinia.vuejs.org/introduction.html pinia安装 npm install pinia main.ts引入pinia import { createApp } from vue // import ./style.css import App from ./App.vue import router from ./router/index // …

LangChain :构建个人AI代理从这里开始

LangChain&#xff0c;一个强大的工具&#xff0c;允许根据用户输入创建对语言模型和其他工具的复杂调用链。就像拥有一个私人助理&#xff0c;可以根据手头的任务做出决定。本文来分享一下在 LangChain 中使用 Agents 的心路历程。 LangChain中代理的概念 在 LangChain 中&a…

网络高频攻击手段与基本防护措施总结

主要攻击手段 一、云平台攻击 云平台攻击是指针对云服务器的恶意行为&#xff0c;旨在获取非法访问权限、窃取敏感数据或者破坏服务器的正常运行。云平台攻击的形式多样&#xff0c;以下是对云平台攻击的一些主要类型和特点的详细分析&#xff1a; 攻击类型&#xff1a; 凭据…

苹果手机数据不见了怎么恢复?3个方法,搞定苹果手机数据恢复!

在许多错误的情况下&#xff0c;当你更新到最新的 iOS 版本或使用越狱来获得更多功能和权限、误删重要的手机文件时&#xff0c;苹果手机中的数据可能会丢失或被意外删除。一旦发现数据丢失&#xff0c;你就会查看 iTunes 备份或 iCloud 备份&#xff0c;并希望在其中恢复丢失的…

Rust 性能分析

都说Rust性能好,但是也得代码写得好,猜猜下面两个代码哪个快 . - 力扣&#xff08;LeetCode&#xff09; use std::collections::HashMap; use lazy_static::lazy_static;lazy_static! {static ref DIGIT: HashMap<char, usize> {let mut m HashMap::new();for c in …

electron打包时资源下载失败cannot resolve xxx/30.0.9/electron-v30.0.9-win32-ia32.zip

同学们可以私信我加入学习群&#xff01; 正文开始 问题描述解决方案总结 问题描述 最近electron更新频繁&#xff0c;而我在用electron做个人项目&#xff0c;对稳定性没有太高要求&#xff0c;希望保持着electron的最新版本&#xff0c;所以就没有固定版本。 单位网络不太好…

Jmeter性能分析及调优详解(入门)

一、系统性能理解 如果说需求、开发、DB、运维、测试是单一一门学科&#xff0c;那么性能就是综合学科&#xff0c;它包含了需求分析、DB、开发、测试、运维的所有学科。其实一般来说在实际性能分析和调优中&#xff0c;测试担任的角色就是写压测脚本并执行脚本查看结果&#…

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测

区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测 目录 区间预测 | Matlab实现QRCNN-GRU-Attention分位数回归卷积门控循环单元注意力机制时序区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现QRCNN-GRU-…

在Linux上的Java项目导出PDF乱码问题

在Linux上的Java项目导出PDF乱码问题 场景&#xff1a;一个Java项目导出PDF&#xff0c;在我本地导出是没有问题&#xff0c;但是部署上Linux上后&#xff0c;导出就出现了乱码了。 处理方案 我这里使用的处理方案是在Linux服务器上安装一些PDF需要使用的字体 1.把字体上传到…

中国出海企业“奔赴”俄罗斯蓝海 有哪些认知需要对齐? | TopOn变现干货

中国企业加速出海已成常态化。在出海大潮席卷下&#xff0c;中国企业的身影已遍布欧美、东南亚、拉美、中东等多个成熟市场和潜力市场&#xff0c;眼下&#xff0c;这些热门市场几成红海&#xff0c;准入门槛也相对提高。而俄罗斯市场&#xff0c;作为全球TOP10的经济体之一&am…

初学者如何对大模型进行微调?

粗略地说&#xff0c;大模型训练有四个主要阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练消耗的时间占据了整个训练pipeline的99%&#xff0c;其他三个阶段是微调阶段&#xff0c;更多地遵循少量 GPU 和数小时或数天的路线。预训练对于算力和数据的要求非…

了解Kubernetes-RKE2的PKI以及证书存放位置

一、什么是PKI&#xff1f; 简称&#xff1a;证书基础设施。 可以方便理解为当你的集群有Server,Client架构&#xff0c;那么为了安全加密之间的通信&#xff0c;则需要使用证书进行交互&#xff0c;那么利用PKI架构可以安全加密组件之间的通信。 二、Kubernetes的PKI架构什…

短剧源码系统深层次解析:技术架构与实现

短剧源码系统作为短视频内容生产与分发的核心技术&#xff0c;其技术实现对于开发者和运营者至关重要。本文将深入探讨短剧源码系统的关键技术架构&#xff0c;特别是前端框架uni-app和Vue&#xff0c;以及后端框架ThinkPHP5和Workerman的应用。 前端框架&#xff1a;uni-app与…

生信学习入门常见错误可能的原因分类总结和求助指南

文件或目录找不到 这是常见问题&#xff0c;常见提示有 No such file or directory Error in file(file, “rt”)&#xff1a;无法打开链接 Fatal error: Unable to open file for reading (seq/WT1_1.fq) Fatal error: Unable to read from file (C:Program file/Git/usea…

1.Rust安装

目录 一、安装1.1 在Windows上安装1.2 在Linux下安装 二、包管理工具三、Hello World3.1 安装IDE3.2 输出Hello World 一、安装 1.1 在Windows上安装 点击页面 安装 Rust - Rust 程序设计语言 (rust-lang.org)&#xff0c;选择"下载RUSTUP-INIT.EXE(64位&#xff09;&qu…

PolygonalSurfaceContourLineInterpolator 多边形交互器

1. 效果&#xff1a; 2.简介&#xff1a; 可以实现在多边形上进行交互&#xff0c;选择&#xff1b;在多边形曲面上实现轮廓点的交互绘制。 该类的使用需要结合 vtkPolygonalSurfacePointPlacer 类&#xff0c;定位点的功能也就是拾取器。 前提&#xff1a;输入的多边形曲面…

剧本杀市场仍在快速发展,剧本杀小程序成为了新的机遇

近年来&#xff0c;剧本杀一直是年轻人的娱乐游戏方式之一&#xff0c;剧本杀行业呈现出了井喷式发展的形势&#xff0c;成为了当下爆火的娱乐方式。目前&#xff0c;剧本杀行业拥有了完善的剧本资源和呈现方式&#xff0c;发展前景非常大。 根据当下的数据显示&#xff0c;剧…

C语言小例程6/100

题目&#xff1a;输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 程序分析&#xff1a;我们想办法把最小的数放到x上&#xff0c;先将x与y进行比较&#xff0c;如果x>y则将x与y的值进行交换&#xff0c;然后再用x与z进行比较&#xff0c;如果x>z则将x与z的值…