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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

铭铭erom 2018-05-08 11:27:20 浏览3984
展开阅读全文

项目里或多或少的都会有一些基于规则判断的代码,而往往这部分逻辑判断代码都写在项目里,改规则就得改代码,所以就很不方便,而且随着规则越多,代码越繁杂。
最近有时间,设计了一套基于Aviator的规则引擎系统。
参考文档:https://code.google.com/archive/p/aviator/wikis/User_Guide_zh.wiki

规则引擎需求:

1、每个规则有一个大的通用规则设置,对应的可以单独设置按省、市、人维度的特殊规则设置

2、全局统一的规则校验服务,修改配置及时生效

3、规则可直接填写正则表达式、也可按步骤设置出一套规则。

4、所有需要进行规则校验的数据均由client提供,判断的数据标准由设置的规则信息提供。规则引擎服务只提供判断数据之间的关系

6、规则校验每项判断需要提供布尔、不等关系、包含、不包含等多种方式的判断。

7、规则校验不通过时需要返回规则不通过的理由,列出所有不通过的规则名称和当前校验的值。

系统架构图:_

规则数据结构图:
_
数据结构描述:

1、所有规则需要挂载在规则集下,规则集下有多个规则,每个规则可以设置优先级,用来控制执行顺序,每个规则可设置执行动作,可以设置跳过或者设置必须匹配

2、规则集的属性里不包含分类信息,通过单独的分类表去规则集列表

3、规则可设置规则名称、规则描述、所属规则集、初始创建人信息,每个规则默认规则为通用规则,可包含若干的特殊规则

4、特殊规则通过另一个表去绑定,需要规则id、区域类型(比如说:城市)、区域id(比如说:对应的城市id)、子规则id。这样当你特殊设置了一套专属规则的时候就可以找到是否有单独的特殊规则。

5、每个规则可以含多个条件组,每个条件组之间同是逻辑与、逻辑或的关系,每个条件组可含多个条件,每个条件之间的关系只能同是逻辑与、逻辑或。

6、每个条件由因子(属性名)、操作符(等于、大于、包含等共8种)、阀值(校验属性的阀值)组成。每个因子分类需要预先设定好,从一个数据字典里去选择,甚至后面需要对因子分类,避免每个条件设置因子的时候都需要填写一遍。

Picture2

CREATE 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 = '区域规则信息表';

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

网友评论

登录后评论
0/500
评论
铭铭erom
+ 关注