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

相关文章
|
2天前
|
Java 开发者 微服务
手写模拟Spring Boot自动配置功能
【11月更文挑战第19天】随着微服务架构的兴起,Spring Boot作为一种快速开发框架,因其简化了Spring应用的初始搭建和开发过程,受到了广大开发者的青睐。自动配置作为Spring Boot的核心特性之一,大大减少了手动配置的工作量,提高了开发效率。
13 0
|
30天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
40 4
|
26天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
34 0
|
19天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
12天前
|
Java Spring
[Spring]aop的配置与使用
本文介绍了AOP(面向切面编程)的基本概念和核心思想。AOP是Spring框架的核心功能之一,通过动态代理在不修改原代码的情况下注入新功能。文章详细解释了连接点、切入点、通知、切面等关键概念,并列举了前置通知、后置通知、最终通知、异常通知和环绕通知五种通知类型。
24 1
|
28天前
|
Java BI 调度
Java Spring的定时任务的配置和使用
遵循上述步骤,你就可以在Spring应用中轻松地配置和使用定时任务,满足各种定时处理需求。
117 1
|
2月前
|
前端开发 Java Spring
关于spring mvc 的 addPathPatterns 拦截配置常见问题
关于spring mvc 的 addPathPatterns 拦截配置常见问题
213 1
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于注解配置的程序--源码解析
手动开发-简单的Spring基于注解配置的程序--源码解析
45 0
|
1月前
|
XML Java 数据格式
手动开发-简单的Spring基于XML配置的程序--源码解析
手动开发-简单的Spring基于XML配置的程序--源码解析
79 0
|
1月前
|
监控 数据可视化 Java
springBoot:actuator&admin 图形可视化&spring 打包 (七)
本文介绍了Spring Boot Actuator及其图形化管理界面Spring Boot Admin的使用方法,包括依赖导入、服务端与客户端配置、以及如何打包为JAR和WAR文件并部署。通过这些步骤,可以实现应用的监控和管理功能。