SpringBoot + 规则引擎 URule,真的太强悍了!

news2024/11/17 22:24:45

一、背景

前段时间,在做项目重构的时候,遇到很多地方需要做很多的条件判断。当然可以用很多的if-else判断去解决,但是当时也不清楚怎么回事,就想玩点别的。于是乎,就去调研了规则引擎。

当然,市面上有很多成熟的规则引擎,功能很多,性能很好。但是,就是想玩点不一样的(大家做技术选型别这样,这个是反面教材)。最终一款URule的规则引擎吸引了我,主要还是采用浏览器可直接配置,不需要过多安装,可视化规则也做的不错。经过一系列调研,后面就把它接入了项目中,顺便记录下调研的结果。

二、介绍

规则引擎其实是一种组件,它可以嵌入到程序当中。将程序复杂的判断规则从业务代码中剥离出来,使得程序只需要关心自己的业务,而不需要去进行复杂的逻辑判断;简单的理解是规则接受一组输入的数据,通过预定好的规则配置,再输出一组结果。

当然,市面上有很多成熟的规则引擎,如:Drools、Aviator、EasyRules等等。但是URule,它可以运行在Windows、Linux、Unix等各种类型的操作系统之上,采用纯浏览器的编辑模式,不需要安装工具,直接在浏览器上编辑规则和测试规则。

当然这款规则引擎有开源和pro版本的区别,至于pro版是啥,懂的都懂,下面放个表格,了解下具体的区别

特性PRO版开源版
向导式决策集
脚本式决策集
决策树
决策流
决策表
交叉决策表
复杂评分卡
文件名、项目名重构
参数名、变量常量名重构
Excel决策表导入
规则集模版保存与加载
中文项目名和文件名支持
服务器推送知识包到客户端功能的支持
知识包优化与压缩的支持
客户端服务器模式下大知识包的推拉支持
规则集中执行组的支持
规则流中所有节点向导式条件与动作配置的支持
循环规则多循环单元支持
循环规则中无条件执行的支持
导入项目自动重命名功能
规则树构建优化
对象查找索引支持
规则树中短路计算的支持
规则条件冗余计算缓存支持
基于方案的批量场景测试功能
知识包调用监控
更为完善的文件读写权限控制
知识包版本控制
SpringBean及Java类的热部署
技术支持

三、安装使用

实际使用时,有四种使用URule Pro的方式,分别是嵌入式模式、本地模式、分布式计算模式以及独立服务模式。

但是我们这里不考虑URule Pro,咱自己整个开源版,在开源版集成springboot的基础上做一个二次开发,搜了一圈,其实就有解决方案。大致的项目模块如下:

自己创建个空数据库,只需要在edas-rule-server服务中修改下数据库的配置,然后启动服务即可。第一次启动完成,数据库中会创建表。

properties
复制代码spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/urule-data?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false
spring.datasource.username=root
spring.datasource.password=mysql

上面说过,它是纯用浏览器进行编辑,配置规则的,只需要打开浏览器,输入地址:http://localhost:8090/urule/frame,看到这个界面,就说明启动成功了。

四、基础概念

3.1整体介绍

先说下URule它的构成部分,主要是两部分:1、设计器部分 2、规则执行引擎。设计器部分主要是库文件和规则文件构成。下面看下整体的结构图

3.2库文件

如上图介绍的,库文件有4种,包括变量库,参数库,常量库和动作库。其实类似于Java开发的系统中的实体对象,枚举,常量以及方法。

上面说过,规则都是可视化配置的。在配置规则的过程中,就需要引入各种已经定义好的库文件,再结合业务需求,从而配置出符合业务场景的业务规则,所以哪里都有库文件的身影。

3.2.1变量库文件

在业务开发中,我们会创建很多Getter和Setter的Java类,比如PO、VO、BO、DTO、POJO等等,其实这些类new对象后主要起到的作用就是数据的载体,用来传输数据。

在URule中,变量库就是用来映射这些对象,然后可以在规则中使用,最终完成业务和规则的互动。最后上一张图,用来创建变量库

对了,上面废话了这么多可视化配置,这才是第一次展示配置界面,惭愧惭愧。

上图一目了然,在“库”这个菜单底下右键,然后点击添加变量库即可,最后定义自己喜欢的变量库名,当然名字只支持中文或者英文,其他字符不可用。

创建完变量库后,就可以对变量库进行编辑,可以认为就是给POJO添加属性

也不弯弯绕绕讲什么术语,就个人理解。图左边是创建类,其中名称是它的别名,配置规则用它代替这个类。图右边是类的属性,我这里随便写了几个,估计看了懂得都懂。

最后在业务系统中创建对应的类,注意全限定名和配置变量库的类路径一致。

package com.cicada;

import com.bstek.urule.model.Label;
import lombok.Data;

/**
 * @author 往事如风
 * @version 1.0
 * @date 2023/3/3 15:38
 * @description
 */
@Data
public class Stu {

    @Label("姓名")
    private String name;

    @Label("年龄")
    private int age;

    @Label("班级")
    private String classes;
}

最后说下这个@Label注解,这个是由URule提供的注解,主要是描述字段的属性,跟变量库的标题一栏一致就行。听官方介绍可以通过这个注解,实现POJO属性和变量库属性映射。就是POJO写好,然后对应规则的变量库就不需要重新写,可以直接生成。反正就有这个功能,这里就直接一笔带过了。

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

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

相关文章

Springboot 中RESTtemplate的使用

目录 一 概述 二 应用 1.get请求 2.post请求 一 概述 RESTtemplate提供了http请求连接的功能。spring 框架提供的 RestTemplate 类可用于在应用中调用 rest 服务,它简化了与 http 服务的通信方式,统一了 RESTful 的标准,封装了 http 链接…

行业报告 | 智能教育发展蓝皮书(下)

原创 | 文 BFT机器人 核心观点 Core point 在教育数字化转型的背景下,积极探索智能技术助力教学减负增效的实践路径,对于深化教育教学改革,促进学生全面发展、健康成长具有重要现实意义。 03 智能技术助力教学设计 教学设计以解决实际的教学…

【半监督语义分割 2023 CVPR】CCVC

【半监督语义分割 2023 CVPR】CCVC 论文题目:Conflict-Based Cross-View Consistency for Semi-Supervised Semantic Segmentation 中文题目:半监督语义分割的基于冲突的交叉视图一致性 论文链接:https://arxiv.org/abs/2303.01276 论文代码&…

Visual Basic 6 25 周年

Visual Basic 6.0 是 Visual Basic“经典”的最后一个版本(VB.NET 之前的版本)。它是迄今为止 32 位 Windows 95/NT 及更高版本最流行的版本。它非常受欢迎,并且仍在许多公司中使用。它于 1998 年中发布,与 5.0 版本相比在多个方面…

mysql-数据迁移

文章目录 1. 物理迁移1. 迁移前,配置mysql的输出目录1. 查看mysql的输出目录2. 修改mysql的输出目录 2. 文件迁移 1. 物理迁移 1. 迁移前,配置mysql的输出目录 1. 查看mysql的输出目录 在安装MySQL的会限制了导入与导出的目录权限。只允许在规定的目录…

基于.net core的微信小程序接入微信支付系列之环境搭建(1)

前言:c#语言本身是一门非常优雅的语言,但是在腾讯的api文档里面并不受到待见,所以只能靠自己看文档来逐步摸索,微信支付的逻辑看起来很复杂,其主要原因在于腾讯写文档的人可能是学体育专业的,简单的逻辑非要…

android Q /R/S/T onTopResumedActivityChanged方法解析

疑问背景: 在Android Q高版本,发现经常通过events日志来看Activity生命周期的时候,经常看到如下打印: 06-27 12:02:07.091 4812 4812 I wm_on_top_resumed_gained_called: [227500858,com.android.launcher3.uioverrides.Quic…

【LeetCode】动态规划 刷题训练(五)

文章目录 剑指 Offer II 091. 粉刷房子题目解析状态转移方程完整代码 309. 最佳买卖股票时机含冷冻期题目解析状态转移方程持有股票保持卖出股票卖出股票冷冻期 完整代码 714. 买卖股票的最佳时机含手续费题目解析状态转移方程f[i]状态转移方程g[i]状态转移方程 完整代码 剑指 …

强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解

【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧(调参、画图等、趣味项目实现、学术应用项目实现 专栏详细介绍:【强化学习原理项目专栏】必看系列:单智能体、多智能体算法原理项目实战、相关技巧…

最大收益(搜索好题)

题目描述 给一行n个数&#xff0c;每次可以取出行首或者行末的数&#xff0c;如果数ai是第j次取出的&#xff0c;可以得到ai*j的收益&#xff0c;求最大的总收益&#xff1b; 输入描述 Line 1: 整数 N&#xff08;1<N<2000&#xff09; Lines 2…N1: 第i个数的 a(i)&…

linux文件系统(目录)层次

本文主要内容来源和修改自 FHS 3.0 和 《鸟哥的私房菜基础学习篇&#xff08;第四版&#xff09;》 虽然 Linux 系统的发行版众多&#xff0c;但他们的目录配置却看起来都差不多&#xff0c;那是因为&#xff0c;大多数 Linux 发行版都遵循了文件系统层次结构标准&#xff08;…

centos7不能识别nvme固态硬盘,无法开机

前提是在机械硬盘已经安装过centos7系统了&#xff0c; 然后新增了一块nvme固态硬盘 其实原因也很简单&#xff0c; 旧版的centos7内核没有nvme驱动&#xff0c;需要更新内核&#xff0c;以下是我用ChatGPT解决的&#xff1a; 在 CentOS 7 中&#xff0c;NVMe 固态硬盘的驱动通…

vscode环境部署

编译cpp vscode安装2个插件&#xff0c;extension pack自动包了下面3个通过命令窗口code .打开代码目录&#xff0c;或者添加cl.exe路径到path&#xff0c;以及c需要的include和lib //在Path中添加cl.exe所在文件夹路径。若未找到&#xff0c;直接VS的安装目录下搜索cl.exe即…

下载好的eclipse的SSM项目导入IDEA配置运行过程(详细)

背景&#xff1a; 在网上下载一份SSM项目源码后&#xff0c;发现原项目是通过eclipse来开发的&#xff0c;但是个人喜欢使用IDEA来进行Java的开发&#xff0c;现在需要将这个SSM项目在IDEA上配置运行起来&#xff0c;下面就是记录一下整个配置过程&#xff01; 战胜 一、下载SS…

前端传递对象参数,以及后端接受参数 @PathVariable @RequestParam @RequestBody 注解的使用

太久没写前后端传递参数了,总是格式对不上号 前端传递对象参数,以及后端接受参数 一、接收参数注解 PathVariable二、接收参数注解 RequestParam2.1 get 请求,普通类型参数2.2 post 请求,普通类型参数 三、接收参数注解 RequestBodypost 请求,对象类型参数 总结 提示&#xff1…

Java之面向对象的思想

Java之面向对象的思想 一、如何理解面向对象二、面向对象和面向过程区别1. 面向过程1.1. 打开洗衣机盖子1.2. 把脏衣服放进洗衣机1.3. 加入适量的洗衣液1.4. 关上洗衣机盖子1.5. 选择洗衣的程序和时间1.6. 开始洗衣机1.7. 总结 2. 面向对象2.1. 属性&#xff1a;2.2. 方法&…

[C++] 刷题日记

785. 快速排序 #include <iostream> using namespace std;const int N 1e610;int n; int q[N];void quick_sort(int q[],int l,int r){if (l>r)return ;int x q[(lr)>>1],il-1,jr1;while (i<j){do i;while(q[i]<x);do --j;while(q[j]>x);if (i<j)sw…

【NLP】Attention机制和RNN

一、说明 循环神经网络是深度学习的主要内容之一,它允许神经网络处理文本、音频和视频等数据序列。它们可用于将序列简化为高级理解、注释序列,甚至从头开始生成新序列! 二、引进长记忆网络 基本的 RNN 设计很难处理较长的序列,但一种特殊的变体——“长短期记忆”网络 [1]…

three.js中的点对象(Point)和点材质(PointsMaterial)

一、点对象和点材质基本介绍 1. 点材质&#xff08;PointsMaterial&#xff09;&#xff1a; 点材质用于渲染点对象&#xff0c;它决定了点的颜色、透明度等属性。 常用属性有&#xff1a; color: 点的颜色&#xff0c;默认为白色。opacity: 点的透明度&#xff0c;默认为1…

List的去重操作

List的去重操作 1.采用Set集合的方式 List listnew ArrayList();for (int i 0; i < 10; i) {list.add(i);list.add(i);}//去重之前System.out.println(list);Set setnew LinkedHashSet(list);//方法1&#xff1a;去重之后System.out.println(new ArrayList<>(set));…