快速入门规则引擎

news2024/10/2 6:40:46

文章首发于微信公众号:职谷智享

一、什么是规则引擎

当我们在对复杂的业务进行开发时,程序本身逻辑代码和业务代码互相嵌套、错综复杂,同时维护成本高,可拓展性差。

可降低复杂业务逻辑组件复杂性、降低应用程序的维护和可扩展性成本的组件!

如下图:

图片

规则引擎实际上就是一个推理引擎,用于匹配facts(事实,我们可以理解为输入数据)和rules(规则),以推出结论。

二、为什么使用规则引擎

背景:业务规则经常变化,系统需依据业务的变化,实现快速、低成本的迭代更新。因此,为了快速、低成本的更新,我们需将逻辑代码和业务代码进行解耦:

  • 研发人员(不需懂业务)开发维护程序部分,同时测试通过后,后续不会经常变化改动;

  • 业务人员可直接管理这些业务规则,同时不需要研发人员的参与。

三、主流规则引擎对比

名称

开源情况

运行模式

备注

drools开源 github 3.2k 嵌入式、分离式支持可视化等整个配套,是一个完整的BMRS系统(业务规则管理系统),同时其生态很活跃。
esayRule开源 github 2.6k嵌入式简单易上手,支持yml、json、java、注解方式配置规则,但是后两者无法实现动态加载。

四、drools规则引擎运行模式

1.嵌入式

单个业务引入规则引擎核心后,规则、事实数据、规则引擎的产生与运行都在一个工程中,规则引擎无法对其他服务使用

  • 优点:简单、便于调试

  • 缺点:只取核心,轻量的同时,也失去了分离式的业务逻辑完全隔离、以及分离式的高可用、设计器等优势。

1.1 drools规则引擎代码示例

// 定义一个Facts类型,期望 creditScore>8时风控通过 || monthlySalary>10000时风控通过

@Data

@AllArgsConstructor

public class User {



  /**

   * 姓名

   */

  private String name;



  /**

   * 芝麻信用分

   */

  private Double creditScore;



  /**

   * 月收入

   */

  private BigDecimal monthlySalary;

}

//  resources/rules目录下创建 RiskRule.drl后缀文件,编写规则作为Rules

package riskRule

import  com.example.ruleengine.drools.User





rule "risk_rule_creditScore"

 when

 $u:User(creditScore > 8)

 then

 System.out.println($u.getName() + " 芝麻分大于8,风控通过.");

 drools.halt();

 end



rule "risk_rule_monthlySalary"

 when

  $u:User(monthlySalary > 10000)

 then

  System.out.println($u.getName() + " 月薪>10000,风控通过.");

  drools.halt();

 end

// 测试类及输出结果​​​​​​​


@Test

void testRisk() {



  User user_1 = new User("USER_01", 6.25, new BigDecimal(100000));

  User user_2 = new User("USER_02", 8.35, new BigDecimal(100000));



  kieSession.insert(user_1);

  kieSession.fireAllRules();

  //输出: USER_01 月薪>10000,风控通过.



  kieSession.insert(user_2);

  kieSession.fireAllRules();

  //输出: USER_02 芝麻分大于8,风控通过.



  kieSession.dispose();

}

2.分离式 drools

如果我们期望将规则引擎执行系统与业务服务分离,为各个服务提供规则决策的能力使决策层与业务层分离,drools全家桶中是具备这样的组件去支撑的.

解决了什么问题:

  1. 稳定层和变化层分离,业务侧与规则引擎分离;

  2. 变化层支持可视化或配置化的方式,快速进行业务规则的增删改操作,甚至支持热插拔和热更新。以减少冗长的开发和测试周期;

  3. drools带有规则设计器,还可解决我们 “简式建模” 的需求。

  4. 能够将复杂Facts实体与规则单独打jar包进行业务决策区分.

包含哪些组件以及作用:

       

图片

WorkBench(规则设计器+规则存储管理+git+maven)

图片

  • 可快速创建规则项目,该项目即托管在WB内置的GIT仓库中;

  • 可看到规则项目的目录结构,以及修改任意文件夹中的一个文件;

  • 可看到每个规则项目的提交者有哪些,以及最近提交统计图;

  • 可看到每个规则项目的GIT远程克隆地址(支持GIT、SSH和HTTP方式将项目拉到本地);

  • 可设置规则项目的远程Maven仓库和本地仓库(类似操纵pom.xml的<repository>);

  • 可点击build或build&install,将规则项目打包/安装到本地maven仓库(看作gitlab集成了Jenkins);

  • 可点击depoy将打好的包,扔到Kie-Server上面生成规则服务;

Kie-Server(规则引擎容器) + 规则引擎core(drools核心)
  • Kie-Server就相当于tomcat、jboss等容器,负责规则加载、执行以及对外接口, 所有的kjar(规则项目)都会实例化为KieContainer对象。同时Kie-Server对外提供restful接口,接受Facts对象,并将其扔给KieContainer对象进行规则处理,然后返回给调用者。

五、drools分离式架构运行图

图片

六、其他

kie server集群部署图

图片

workBench集群架构图

图片

想要免费获得200+本程序员技术书籍,请关注公众号“职谷智享”.

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

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

相关文章

alibabacloud学习笔记07(小滴课堂)

讲解Sentinel自定义异常降级-新旧版本差异 讲解新版Sentinel自定义异常数据开发实战 如果我们都使用原生的报错&#xff0c;我们就无法得到具体的报错信息。 所以我们要自定义异常返回的数据提示&#xff1a; 实现BlockExceptionHandler并且重写handle方法&#xff1a; 使用F…

【C++】十大排序算法之 冒泡排序 选择排序

本次介绍内容参考自&#xff1a;十大经典排序算法&#xff08;C实现&#xff09; - fengMisaka - 博客园 (cnblogs.com) 排序算法是《数据结构与算法》中最基本的算法之一。 十种常见排序算法可以分为两大类&#xff1a; 比较类排序&#xff1a;通过比较来决定元素间的相对次序…

linux系统Jenkins工具流水线项目发布

流水线发布 pipline语法介绍阶段指令 创建流水线项目流水线脚本基础框架 pipline语法介绍 声明式的pipeline语法格式 1. 所有的声明都必须包含在pipeline{}中 2. 块只能有节段&#xff0c;指令&#xff0c;步骤或者赋值语句组成 3. 阶段&#xff1a;agent&#xff0c;stages&a…

tomcat部署和优化(二)----- 轻松搭建博客、状态页优化、虚拟主机配置

一、tomcat 1、自建博客 [rootzzzcentos1 ~]#systemctl stop firewalld [rootzzzcentos1 ~]#setenforce 0 [rootzzzcentos1 ~]#cd /data/ [rootzzzcentos1 data]#rz -E rz waiting to receive. [rootzzzcentos1 data]#ls apache-tomcat-9.0.16 apache-tomcat-9.0…

180基于matlab的频率切片小波变换程序(FTWT)

基于matlab的频率切片小波变换程序&#xff08;FTWT&#xff09;。从一种新的角度出发&#xff0c;通过自由选择频率切片函数、引进新尺度参数&#xff0c;在频率域实现小波变换&#xff0c;该变换能够很好地刻画信号各成分之间的相对能量关系。此外&#xff0c;频率切片小波变…

VirtualBox 桥接网卡 未指定 “未能启动虚拟电脑Ubuntu,由于下述物理网卡未找到:”

解决办法&#xff0c;安装虚拟网卡&#xff0c;win11查找方式&#xff1a;控制面板→网络和共享中心→更改适配器设置 此时出现下面情况就算安装成功 但是如果报错&#xff1a;找不到指定的模块 则按下面步骤删除干净垃圾重新上面操作 先安装CCleaner, 链接:CCleaner Makes Y…

latex报错I was expecting a `,‘ or a `}‘的解决办法

解决办法——经过检查在ref22后面缺少一个逗号 总结 当你在使用LaTeX时遇到“I was expecting a , or a }”这样的错误&#xff0c;这通常意味着LaTeX在解析你的代码时&#xff0c;预期在某个位置看到一个逗号&#xff08;,&#xff09;或一个大括号&#xff08;}&#xff09;…

关于阿里云oss的冗余存储类型问题

不得不说一个问题&#xff0c;阿里云服务方便我们的同时 &#xff0c;他们的文档写的是真的差劲。 东一块&#xff0c;西一块的。非常不好系统的阅读&#xff0c;文档结构比较散。 关于阿里云oss的冗余存储类型问题&#xff0c;这里说一下&#xff0c;简直是个坑。 首页阿里…

(面试题)数据结构:链表相交

问题&#xff1a;有两个链表&#xff0c;如何判断是否相交&#xff0c;若相交&#xff0c;找出相交的起始节点 一、介绍 链表相交&#xff1a; 若两个链表相交&#xff0c;则两个链表有共同的节点&#xff0c;那从这个节点之后&#xff0c;后面的节点都会重叠&#xff0c;知道…

一些可以访问gpt的方式

1、Coze扣子是新一代 AI 大模型智能体开发平台。整合了插件、长短期记忆、工作流、卡片等丰富能力&#xff0c;扣子能帮你低门槛、快速搭建个性化或具备商业价值的智能体&#xff0c;并发布到豆包、飞书等各个平台。https://www.coze.cn/ 2、https://poe.com/ 3、插件阿里…

Android Compose - PlainTooltipBox(已废弃)的替代方案

Android Compose - PlainTooltipBox 的替代方案 TooltipBox(positionProvider TooltipDefaults.rememberPlainTooltipPositionProvider(),tooltip {PlainTooltip {Text(/* tooltip content */)}},state rememberTooltipState(), ) {// tooltip anchorIconButton(onClick {…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 附录B 从《C++ Primer(第4版)》入手学习C++

这是作者为《C Primer&#xff08;第4版&#xff09;&#xff08;评注版&#xff09;》写的序言&#xff0c;文中“本书”指的是这本书评注版。 B.1 为什么要学习C 2009年本书作者Stanley Lippman先生应邀来华参加上海祝成科技举办的C技术大会&#xff0c;他表示人们现在还用…

手势识别应用介绍

目录 一、功能介绍 二、安装部署说明 2.1 文件目录说明 2.2 手势识别部分 一、功能介绍 这是一个通过摄像头捕获手势&#xff0c;根据不同的手势来做出不同操作的计算机程序。目前可以识别9种手势&#xff0c;可以根据识别到的手势&#xff0c;进行打开应用、增大音量、减小音量…

抖音视频批量采集软件|视频评论下载工具

在日常工作中&#xff0c;需要频繁下载抖音视频&#xff0c;但逐个复制分享链接下载效率太低&#xff1f;别担心&#xff01;我们推出了一款专业的抖音视频批量采集软件&#xff0c;基于C#开发&#xff0c;满足您的需求&#xff0c;让您通过关键词搜索视频并自动批量抓取&#…

swoole

php是单线程。php是靠多进程来处理任务&#xff0c;任何后端语言都可以采用多进程处理方式。如我们常用的php-fpm进程管理器。线程与协程,大小的关系是进程>线程>协程,而我们所说的swoole让php实现了多线程,其实在这里来说,就是好比让php创建了多个进程,每个进程执行一条…

SMBGhost漏洞技术分析与防御方案

事件分析 最近国内外各安全厂商都发布了SMBGhost(CVE-2020-0796)漏洞的预警报告和分析报告&#xff0c;笔者利用周末休息时间也研究了一下&#xff0c;就算是做一个笔记了&#xff0c;分享给大家一起学习下&#xff0c;目前外面研究的POC大部分是通过SMB压缩数据包长度整数溢出…

腾讯云幻兽帕鲁服务器操作系统选择Windows还是Linux?哪个比较好?

选择Windows和Linux作为腾讯云幻兽帕鲁服务器的操作系统&#xff0c;主要取决于用户的熟悉程度和对服务器性能的需求。 如果用户对Linux系统有较深的了解&#xff0c;并且追求服务器的性能和速度&#xff08;因为Linux通常使用命令行或面板管理&#xff0c;系统文件占用较小&a…

数据分析-Pandas数据的探查蜂窝图

数据分析-Pandas数据的探查蜂窝图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

【双指针】合并两个有序数组O(N)

合并两个有序数组 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/merge-sorted-array/ 题目 题解 采用双指针…

怎么优雅地访问ChatGPT

ChatGPT&#xff0c;这颗璀璨的智能结晶&#xff0c;在2022年岁末之际&#xff0c;由OpenAI实验室倾力铸就&#xff0c;犹如夜空中跃动的智慧星辰&#xff0c;点亮了人工智能领域的新纪元。犹如汪洋中的一座灯塔&#xff0c;ChatGPT以其独特的智慧光辉引人注目&#xff0c;然而…