Spring Boot + URule 规则引擎,可视化配置太爽了!(1)

简介: Spring Boot + URule 规则引擎,可视化配置太爽了!

一、背景

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


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


二、介绍

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


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


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


特性 PRO版 开源版

向导式决策集 有 有

脚本式决策集 有 有

决策树 有 有

决策流 有 有

决策表 有 有

交叉决策表 有 无

复杂评分卡 有 无

文件名、项目名重构 有 无

参数名、变量常量名重构 有 无

Excel决策表导入 有 无

规则集模版保存与加载 有 无

中文项目名和文件名支持 有 无

服务器推送知识包到客户端功能的支持 有 无

知识包优化与压缩的支持 有 无

客户端服务器模式下大知识包的推拉支持 有 无

规则集中执行组的支持 有 无

规则流中所有节点向导式条件与动作配置的支持 有 无

循环规则多循环单元支持 有 无

循环规则中无条件执行的支持 有 无

导入项目自动重命名功能 有 无

规则树构建优化 有 无

对象查找索引支持 有 无

规则树中短路计算的支持 有 无

规则条件冗余计算缓存支持 有 无

基于方案的批量场景测试功能 有 无

知识包调用监控 有 无

更为完善的文件读写权限控制 有 无

知识包版本控制 有 无

SpringBean及Java类的热部署 有 无

技术支持 有 无

三、安装使用

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


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


大致的项目模块如下:


1e6a95d5419f67c7c86ba8c91c9726cc_3b4e56e0398845e0b7d0ca5f5198bcf2.png


Spring Boot 基础就不介绍了,推荐看这个实战项目:


https://github.com/javastacks/spring-boot-best-practice


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


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,看到这个界面,就说明启动成功了。


a9e0ad1371a14d417d406fdd092846b0_578320f644964ebfb4a0e9b57b24481d.png


四、基础概念

3.1整体介绍

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


65f13d2b568bad428b9c5321b5bd0092_b09d655626da47fc9d91adf6d22b197f.png


3.2库文件

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


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


3.2.1变量库文件

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


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


d24062ced5e611ba4a9aafc1e0ade213_3f6e602bf5ce46a8a1b28fa5005afc61.png


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


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


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

916c8c4634a71651511a89cca1b98a01_6f6228a456204c43ba3a30113569dae3.png

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


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


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写好,然后对应规则的变量库就不需要重新写,可以直接生成。反正就有这个功能,这里就直接一笔带过了。


3.2.2常量库文件

说到常量库,这个就可以认为是我们Java系统中的常量,枚举。比如性别,要定义枚举吧;比如对接的机构,也可以定义一个枚举吧。


当然,类似于变量库,常量库也可以实现和系统中的枚举相互映射,这样做的好处可以避免我们手动输入,防止输入错误。创建常量库也比较简单,直接在“库”这个菜单下右键,“添加常量库”。


创建好常量库文件后,也会出现如下页面:

ca5c35817cacf38d85cc20e527639c9d_fd415c87b4b84665805d7c2b49802012.png



3.2.3参数库文件

参数库,就是URule规则中的临时变量,变量的类型和数量不固定。可以认为类似于Map,实际上存储参数库的也就是个Map。


同样的套路,直接在“库”这个菜单下右键,“添加参数库”。


可以看到,参数库已经少了左边分类这一项,直接添加参数,选择类型就是干,相对简单了很多。“名称”这列我这里用了英文,就是Map中的key,而“标题”这列就是在配置规则时候显示用的,中文看着比较直观。


当然还需要注意的点是,定义的名称要保证唯一,因为Map中的key是唯一的,不然就会存在覆盖的情况。


3.2.4动作库文件

动作库可以对配置在spring中的bean方法进行映射,然后可以在规则中直接调用这批方法。惯用套路,还是在“库”菜单下右键,点击“添加动作库”。

b4999de55e9fb60e8a5aa92be5057447_5be0846c29bd486da904a20479657ad0.png

然后我在系统中添加了一个类Action,然后在类上标记@Component注解,将该类交给spring的bean容器管理。该类中添加一些方法,在方法上标记@ExposeAction注解,该注解是URule定义的,说明被标记的方法都会被动作库读取到。


package com.bstek.urule.cicada;


import com.bstek.urule.action.ActionId;

import com.bstek.urule.model.ExposeAction;

import org.springframework.stereotype.Component;


import java.text.SimpleDateFormat;

import java.util.Date;


/**

* @author 往事如风

* @version 1.0

* @date 2023/3/10 13:59

* @description

*/

@Component("action")

public class Action {


   @ActionId("Hello")

   public String hello(){

       return "hello";

   }


   @ExposeAction(value="方法1")

   public boolean evalTest(String username){

       if(username==null){

           return false;

       }else if(username.equals("张三")){

           return true;

       }

       return false;

   }


   @ExposeAction(value="测试Int")

   public int testInt(int a,int b){

       return a+b;

   }


   @ExposeAction(value="打印内容")

   public void printContent(String username, Date birthday){

       SimpleDateFormat sd=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

       if(birthday!=null){

           System.out.println(username+"今年已经"+sd.format(birthday)+"岁了!");

       }else{

           System.out.println("Hello "+username+"");

       }

   }


   @ExposeAction(value="打印Stu")

   public void printUser(Stu m){

       System.out.println("Hello "+m.getName()+", is age:"+m.getAge());

   }

}


最后在动作库页面上添加bean,“Bean Id”一列输入对应的spring bean的名称,这里输入action。然后点击操作列中的小手按钮,就会弹出刚在Action类中标记了ExposeAction注解的方法。选择一个指定的方法添加进来,最后看到方法对应的参数也会被自动加载进去。


adb846d27c71b546c2d88b14793f790d_2d7dece878cf482fa04bc9a567f291fd.png

6f57f9242796d431e2ca2ed5f1bd5d20_4372f2162e5f4f9eaa0839647768d276.png



最后,变量库、参数库、动作库、常量库这些库文件定义好后,各种规则文件配置的时候就可以导入他们。但是一旦这些库文件被某个规则文件使用,就不要随意修改库文件了。

————————————————

版权声明:本文为CSDN博主「Java技术栈」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/youanyyou/article/details/130890266

相关文章
|
11天前
|
SQL Java 数据库连接
(自用)Spring常用配置
(自用)Spring常用配置
15 0
|
1月前
|
SQL Java 数据库连接
挺详细的spring+springmvc+mybatis配置整合|含源代码
挺详细的spring+springmvc+mybatis配置整合|含源代码
40 1
|
4天前
|
存储 安全 Java
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(下)
13 0
|
4天前
|
安全 Java 数据库
第2章 Spring Security 的环境设置与基础配置(2024 最新版)(上)
第2章 Spring Security 的环境设置与基础配置(2024 最新版)
28 0
|
5天前
|
安全 Java Spring
Spring Security 5.7 最新配置细节(直接就能用),WebSecurityConfigurerAdapter 已废弃
Spring Security 5.7 最新配置细节(直接就能用),WebSecurityConfigurerAdapter 已废弃
18 0
|
5天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
15 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
11天前
|
JSON Java 数据库连接
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
属性注入掌握:Spring Boot配置属性的高级技巧与最佳实践
18 1
|
11天前
|
Java 数据库连接 Spring
简化配置,提高灵活性:Spring中的参数化配置技巧
简化配置,提高灵活性:Spring中的参数化配置技巧
19 0
|
11天前
|
Java Shell 测试技术
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
21 0
一次配置,多场景适用:Spring Boot多套配置文件的深度剖析
|
15天前
|
Java 容器
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
SpringBoot使用配置注解开启自动配置功能&整合spring-boot-configuration-processor
13 0