aviator java,基于Aviator的规则引擎系统设计

article/2025/10/23 23:57:04

项目里或多或少的都会有一些基于规则判断的代码,而往往这部分逻辑判断代码都写在项目里,改规则就得改代码,所以就很不方便,而且随着规则越多,代码越繁杂。

最近有时间,设计了一套基于Aviator的规则引擎系统。

参考文档:https://code.google.com/archive/p/aviator/wikis/User_Guide_zh.wiki

规则引擎需求:1、每个规则有一个大的通用规则设置,对应的可以单独设置按省、市、人维度的特殊规则设置2、全局统一的规则校验服务,修改配置及时生效3、规则可直接填写正则表达式、也可按步骤设置出一套规则。4、所有需要进行规则校验的数据均由client提供,判断的数据标准由设置的规则信息提供。规则引擎服务只提供判断数据之间的关系6、规则校验每项判断需要提供布尔、不等关系、包含、不包含等多种方式的判断。7、规则校验不通过时需要返回规则不通过的理由,列出所有不通过的规则名称和当前校验的值。

系统架构图:

91bed1084706a43042a9b145c9320d7c.png

规则数据结构图:

8ee488036aab5648a947b807e186906a.png

数据结构描述:1、所有规则需要挂载在规则集下,规则集下有多个规则,每个规则可以设置优先级,用来控制执行顺序,每个规则可设置执行动作,可以设置跳过或者设置必须匹配2、规则集的属性里不包含分类信息,通过单独的分类表去规则集列表3、规则可设置规则名称、规则描述、所属规则集、初始创建人信息,每个规则默认规则为通用规则,可包含若干的特殊规则4、特殊规则通过另一个表去绑定,需要规则id、区域类型(比如说:城市)、区域id(比如说:对应的城市id)、子规则id。这样当你特殊设置了一套专属规则的时候就可以找到是否有单独的特殊规则。5、每个规则可以含多个条件组,每个条件组之间同是逻辑与、逻辑或的关系,每个条件组可含多个条件,每个条件之间的关系只能同是逻辑与、逻辑或。6、每个条件由因子(属性名)、操作符(等于、大于、包含等共8种)、阀值(校验属性的阀值)组成。每个因子分类需要预先设定好,从一个数据字典里去选择,甚至后面需要对因子分类,避免每个条件设置因子的时候都需要填写一遍。

363c1a801cf3b25287ca61c0a678c871.pngCREATE TABLE `rule_group_info` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规则集id', `name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '规则集名称', `desc` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '规则集描述', `status` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '规则集状态(1:有效 0:无效)', PRIMARY KEY (`id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '规则集信息表';CREATE TABLE `rule_info` ( `id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规则id', `rule_group_id` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属规则集id', `name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '规则名称', `desc` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '规则描述', `type` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '模式(1:规则详细设置 2:表达式设置)', `has_special_rule` TINYINT(4) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否含有特殊规则(1:有 0:无)', `status` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:有效 0:无效)', `rule_value` VARCHAR(1024) NOT NULL DEFAULT '' COMMENT '规则表达式', `level` SMALLINT(15) UNSIGNED NOT NULL DEFAULT 1 COMMENT '规则优先级(值越大优先级越高)', `action` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '规则执行动作(1:必须满足 2:满足跳过后面的验证 3:不满足跳过,只要后面有规则满足)', PRIMARY KEY (`id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '规则信息表';CREATE TABLE `rule_detail_info` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规则详情id', `rule_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属规则id', `name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '规则详情名称', `desc` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '规则详情描述', `type` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否为默认规则(1:默认规则 2:特殊规则)', `status` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:有效 0:无效)', `condition_group_relation` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '条件组逻辑运算符(1:逻辑与 2:逻辑或)', PRIMARY KEY (`id`), KEY `ix_rule_id` (`rule_id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '规则详情信息表';CREATE TABLE `rule_condition_group_info` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规则条件组id', `rule_detail_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属规则详情id', `name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '规则条件组名称', `desc` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '规则条件组描述', `status` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:有效 0:无效)', `condition_relation` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '条件逻辑运算符(1:逻辑与 2:逻辑或)', PRIMARY KEY (`id`), KEY `ix_rule_id` (`rule_detail_id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '规则条件组信息表';CREATE TABLE `rule_condition_info` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '规则条件id', `rule_condition_group_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属规则条件组id', `name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '规则条件名称', `desc` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '规则条件描述', `status` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:有效 0:无效)', `factor_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '因子id', `factor` varchar(32) NOT NULL default '' COMMENT '因子', `operator` varchar(16) NOT NULL DEFAULT '' COMMENT '操作符', `threshold_value` varchar(256) NOT NULL DEFAULT '' COMMENT '阈值', PRIMARY KEY (`id`), KEY `ix_rule_condition_group_id` (`rule_condition_group_id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '规则条件信息表';CREATE TABLE `factor_info` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '因子id', `name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '因子名称', `desc` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '因子描述', `status` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:有效 0:无效)', `data_type` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '因子的数据类型(因子的阀值的正则表达式写死在数据类型上)', `value` varchar(32) NOT NULL DEFAULT '' COMMENT '因子值', PRIMARY KEY (`id`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '因子信息表';CREATE TABLE `rule_area_info` ( `id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '区域配置id', `rule_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配置区域特性的的规则id', `area_type` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '区域类型(1:城市 2:省 3:操作人id)', `area_value` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '区域id', `rule_detail_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '配置区域特性的的特殊规则id', `name` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '区域配置名称', `desc` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '区域配置描述', `status` TINYINT(4) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:有效 0:无效)' PRIMARY KEY (`id`), KEY `ix_rule_id_area_type_area_value` (`rule_id`,`area_type`,`area_value`)) ENGINE = InnoDB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8mb4 COMMENT = '区域规则信息表';

每个因子的在设置的时候由设置的因子的数据类型去决定可以进行的操作符,也由于操作符去决定阀值的的正则表达式。


http://chatgpt.dhexx.cn/article/5oqCmFaB.shtml

相关文章

Aviator源码:Aviator表达式引擎执行过程源码分析

目录 1.if执行脚本示例 2.源码分析 2.1 compile执行过程 2.1.1 CodeGenerator 2.1.2 ExpressionParser 2.1.3 if脚本ASM反编译结果 2.2 compiledExpression.execute执行过程 3.总结概述 由于Aviator支持的脚本语法较多,下面通过项目中使用较多的if语句来对a…

Aviator使用

“初步了解和使用Aviator” 1.Aviator简介 Aviator 是一个高性能,轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。 官方文档 github地址 支持数字、字符串、正则表达式、布尔值、正则表达式等基本类型,完整支持所有…

java aviator_Aviator 表达式求值引擎开源框架

简介 Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator的设计目标是轻量级和高性能,相比于Groovy、JRuby…

java aviator_Aviator——让表达式飞起来

《飞行大亨》是我很喜欢的一部电影,不过这里我想介绍的是一个叫Aviator的开源的Java表达式求值器。 一、轮子的必要性 表达式的求值上,java的选择非常多,强大的如Groovy、JRuby,N年没维护的beanshell,包括javaeye上朋友…

Aviator

Aviator 简介 Aviator是一个高性能、轻量级的java语言实现的表达式求值引擎,主要用于各种表达式的动态求值。现在已经有很多开源可用的java表达式求值引擎,为什么还需要Avaitor呢? Aviator的设计目标是轻量级和高性能 ,相比于Groo…

Aviator介绍

Aviator简介 Aviator是一个高性能、轻量级的 java 语言实现的表达式求值引擎, 主要用于各种表达式的动态求值。现在已经有很多开源可用的 java 表达式求值引擎,为什么还需要 Avaitor 呢? Aviator的设计目标是轻量级和高性能,相比于Groovy、JRuby的笨重, Aviator非常小, 加上…

西电计算机学院名誉院长,杨孟飞院士受聘为西电计科院名誉院长及讲席教授

西电新闻网讯(通讯员 陈龙)12月21日上午,西安电子科技大学计算机科学与技术学院名誉院长杨孟飞院士“华山学者”讲席教授及战略咨询委员会委员聘任仪式在北校区主楼Ⅱ区319会议室举行,校长杨宗凯、副校长王泉参加仪式。仪式由计科院执行院长崔江涛主持。…

北航计算机学院新闻,澳门理工学院代表团访问我校计算机学院

北航新闻网1月21日电(通讯员 盛浩)2019年1月16日,澳门理工学院副院长李雁莲教授、孙毓奇教授等一行三人到北航计算机学院就双方合作等事项进行交流。 座谈会由先进计算机应用技术教育部工程研究中心熊璋教授主持,计算机学院副院长胡春明副教授、中心李超…

【华人学者风采】陈晓峰 西安电子科技大学

【华人学者风采】陈晓峰,西安电子科技大学网络与信息安全学院副院长。研究方向包括公钥密码学、金融密码学、云计算安全、数据安全、区块链技术及应用、人工智能安全。曾获荣誉: 国家万人计划科技创新领军人才,教育部“青年长江学者” &#…

港科资讯 | 倪明选校长等出席江门“双碳”实验室揭牌暨项目签约仪式

12月7日,由香港科技大学(广州)(筹)和江门市政府发起共建的江门“双碳”实验室举行了揭牌暨项目签约仪式,江门双碳实验室正式启动成立。香港科技大学(广州)(筹&#xff09…

莫队算法(普通莫队、带修莫队、树上莫队、不删除莫队)学习笔记【理解+套路/核心代码+例题及题解】

一、理解 我的理解就是巧妙的暴力,利用双指针以及分块思想,巧妙的移动双指针,时间复杂度可以达到O(NlogN)。 强推博客:写的又好又全。链接 二、套路 1、普通莫队 【1】核心代码 bool cmp(node a,node b){return belong[a.l]…

香港理工大学计算机系石杰明老师组招收全奖博士生、博士后

来源:AI求职 香港理工大学 香港理工大学位于中国香港特别行政区,QS 最新排名世界 66 位。计算机系(Department of Computing)USNews CS 排名 36,泰晤士 CS 排名 79。 石杰明博士课题组成员包括有 985/211 顶尖高校背景…

【调剂】华侨大学计算机学院计算机视觉与模式识别实验室钟必能课题组研究生招生...

点击文末的阅读原文或者公众号界面左下角的调剂信息或者公众号回复“调剂”是计算机/软件等专业的所有调剂信息集合,会一直更新的。 课题组主页:https://cst.hqu.edu.cn/info/1109/2001.htmLinkedin: https://www.linkedin.com/in/bineng-zhong-71a36674…

莫队算法思想

目录 莫队算法普通莫队方法:主要代码结构:例题:小B的询问例题:小Z的袜子奇偶化排序 带修改的莫队小结: 莫队算法 莫队算法是由前国家队莫涛提出的一种算法,主要应用在一类离线区间查询的问题中&#xff0c…

【华人学者风采】冯佳时 新加坡国立大学

【华人学者风采】冯佳时,新加坡国立大学ECE系助理教授。本科毕业于中国科学技术大学,硕士毕业于中国科学院自动化研究所,博士毕业于新加坡国立大学。研究兴趣包括大污染数据分析,在线和分布式鲁棒性学习及其在对象识别中的应用。 …

港科夜闻|央视网专访香港科大(广州)(筹)校长倪明选教授,谈香港科技大学在科研及知识转移方面成就...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、央视网专访香港科大(广州)(筹)校长倪明选教授,谈香港科技大学在科研及知识转移方面成就。香港科技大学(广州)(筹)校长倪明选教授接受央视网专访,谈香港科技大学在科研及知识转移方面取得的成就&am…

独家对话许诗军:数字化转型,最基本的是不去拒绝 |数字价值观察室(下)...

关注ITValue,看企业级最新鲜、最价值报道! ▎本文摘自《云栖战略参考》,这本刊物由阿里云与钛媒体联合策划。目的是为了把各个行业先行者的技术探索、业务实践呈现出来,与思考同样问题的“数字先行者”共同探讨、碰撞,…

港科夜闻|香港科技大学(广州)(筹)校长倪明选教授在北京拜访国家教育部党组书记、部长怀进鹏...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、香港科技大学(广州)(筹)校长倪明选教授在北京拜访国家教育部党组书记、部长怀进鹏。2021年11月1日,香港科技大学(广州)(筹)校长倪明选教授等一行在北京拜访国家教育部党组书记、部长怀进鹏。 2、深圳先进院与…

特么的. 最终把 amobbs 的站长阿莫(莫进明)给回骂了一顿.

起因: 假设你居住的地方,要上马PX等高污染的项目,你会怎么做. 鼓动别人上街暴力示威与军警对抗. 自己待在家里支持怂恿. 这样的人真心猥琐! 鉴于他常常私自改动帖子, 在此截图留存. 真特么没劲. 居然以封锁别人 ID 作为别人"打不还手骂不还口…

中国计算机专业创始人,无怨无悔来时路――访计算机专业创始人吴忠明校友

哈工大报讯(研究生记者团杜�/文 李贵才/图)50年前,他和他的同事创建了中国最早的计算机专业之一――哈工大计算机专业。从此,“哈工大计算机”作为哈工大的一张名片,50载享誉海内外。…