规则引擎

计算机软件开发 2024-9-15 19:50:46 15 0 来自 中国
1、规则引擎是什么

在许多企业的 IT 业务体系中,会有大量的业务规则配置,而且随着企业管理者的决议厘革,这些业务规则也会随之发生更改。
为了顺应如许的需求,我们的 IT 业务体系应该能快速且低本钱的更新。一样平常的作法是将业务规则的配置单独拿出来,使之与业务体系保持低耦合。
3.png 4.png 共同规则引擎提供的精良的业务规则计划器,不消编码就可以快速实现复杂的业务规则,同样,即使是完全不懂编程的业务职员,也可以轻松上手利用规则引擎来界说复杂的业务规则。
规则引擎是让业务人士驱动整个企业过程的最佳实践
5.png
规则引擎推理引擎发展而来,是一种嵌入在应用步伐中的组件,可以将业务决议从应用步伐中分离出来,并利用预界说的语义规范编写业务规则。
规则引擎通过担当输入的数据,举行业务规则的评估,并做出业务决议
利用规则引擎可以给体系带来如下上风:

  • 高机动性:在规则生存在知识库中,可以在不重新启动体系的情况下发布规则,以淘汰测试和发布的本钱。
  • 轻易掌控:规则比过程代码更易于明白,因此可以有效地来补充业务分析师和开辟职员之间的沟通标题。
  • 低沉复杂度:在步伐中编写大量的判断条件,很大概是会造成一场噩梦。利用规则引擎却可以大概通过同等的体现情势,更好的处置处罚日益复杂的业务逻辑。
  • 可重用性:规则会合管理,可进步业务的规则的可重用性。决议结果的积累和回溯,可以反向推动规则的迭代优化,资助构造形成一个不绝演进的商业智能分析知识库。
常见的规则引擎大要上分为两种:

  • 重量级:组件齐备,提供整套办理方案,以Drools为代表。
  • 轻量级:本质上是一种基于JVM的脚本语言,只负责脚本的编译、实行,规则的界说、运维等要联合详细的业务自己开辟,以Groovy、AviatorScript、QLExpress、MVEL等代表
2、重量级规则引擎

Drools 是用 Java 语言编写的开源规则引擎,是KIE(Knowledge Is Everything)项目的一部分。
Drools 具有以下长处:

  • 非常活泼的社区
  • 生态不绝的完满中
  • JSR 94 兼容(JSR 94 是 Java Rule Engine API)
  • 免费
2.1 Rete算法

Drools基于Rete算法实现。
Rete算法是一种前向规则快速匹配算法,是一个用于产生式体系的高效模式匹配算法,其匹配速率与规则数目无关
Rete是拉丁文,对应英文是net,也就是网络。
产生式规则是一种常用的知识体现方法,它以"IF-THEN"的情势体现了因果关系。比方:
R1: IF 某动物是有蹄类动物 AND 有长脖子 AND 有长腿 AND 身上有暗斑点 THEN 该动物是长颈鹿(标题办理) R2:IF 某动物是有蹄类动物 AND 身上有玄色条纹 THEN 该动物是斑马(标题办理) …… R8:IF 动物是哺乳动物 AND 反刍动物 THEN 该动物是有蹄类动物 …… R10:IF 某动物有奶 THEN该动物是哺乳动物……以上一些产生式规则,给出"有奶"、“反刍”、“长脖子”、“长腿”、"身上有暗斑点"条件(也称为究竟 facts),就可以求解出标题的答案是“长颈鹿”。
其焦颔首脑是用分离的匹配项构造匹配网络,同时缓存中心结果,以空间换时间。有三个焦点要素:

  • 究竟(fact):对象之间及对象属性之间的多元关系,可以简单明白为对象的属性和属性值。
  • 规则(rule):是由条件和结论构成的推理语句,一样平常体现为if...then...。一个规则的if部分称为LHS(left-hand-side),then部分称为RHS(right hand side)。
  • 模式(patten):就是指IF语句的条件。这里IF条件大概是有几个更小的条件构成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。
2.2 Drools的利用

Drools规则引擎基于以下抽象组件实现:

  • 规则(Rules):业务规则或DMN决议。全部规则必须至少包罗触发该规则的条件以及对应的利用。
  • 究竟(Facts):输入到规则引擎的数据,用于规则的条件的匹配。
  • 生产内存(Production memory):规则引擎中规则存储的地方
  • 工作内存(Working memory):规则引擎中Fact对象存储的地方。
  • 议程(Agenda):用于存储被激活的规则的分类和排序的地方。
Drools的脚本须要以特定的语法编写成drl文件。比方:
package rulesimport com.clf.Orderlock-on-active true//规则一:订单总价在100元以下时,没有优惠rule order_discount_1    when        $order:Order(originalPrice < 100)    then        $order.setRealPrice($order.getOriginalPrice());        System.out.println("订单扣头规则匹配,乐成匹配到规则order_discount_1:订单总价在100元以下时,没有优惠");        System.out.println("订单原价:" + $order.getOriginalPrice() + "\t扣头价:" + $order.getRealPrice());end//规则二:订单总价在 [100,500) 区间时,享受满100减30rule order_discount_2    when        $order:Order(originalPrice >= 100 && originalPrice < 500)    then        $order.setRealPrice($order.getOriginalPrice() - 30);        System.out.println("订单扣头规则匹配,乐成匹配到规则order_discount_2:订单总价在 [100,500) 区间时,享受满100减30");        System.out.println("订单原价:" + $order.getOriginalPrice() + "\t扣头价:" + $order.getRealPrice());end规则以脚本的情势存储在一个文件中,使规则的厘革不须要修改代码,重新启动呆板即可在线上情况中收效。
假如只利用规则的实行,引入Business Rules Engine (BRE)就够了,编写Java代码和规则文件即可。假如要编排很复杂的工程,乃至整个业务都重度依靠,须要产物、运营同砚一起来指定规则,则须要用到BRMS整套办理方案了,包罗BRE、Drools Workbench、DMN等。
我们说Drools太重了,告急是在说:

  • Drools相干组件比力多,须要逐个研究才知道是否须要
  • Drools逻辑复杂,不了解原理,一旦出现标题排查难度高
  • Drools须要编写规则文件,学习本钱高
3、轻量级规则引擎

3.1 Groovy

3.1.1 简介

Groovy是Apache 旗下的一种基于JVM的面向对象编程语言,既可以用于面向对象编程,也可以用作纯粹的脚本语言。在语言的计划上它吸纳了Python、Ruby 等脚本语言的精良特性,好比动态范例转换、闭包和元编程支持。
Groovy 为 Java 开辟者提供了今世最盛行的编程语言特性,而且学习本钱很低(险些为零)。Groovy和Java代码的最大区别在于Groovy更机动,语法要求更少,因此吸引了许多Java利用者。比起Java,Groovy语法更加的机动和简便,可以用更少的代码来实现Java实现的同样功能。
在某种程度上,Groovy可以被视为Java的一种脚本化改良版。Groovy可以无缝集成全部已经存在的 Java 对象和类库,直接编译成 JVM 字节码,如许可以在任何利用 Java 的地方利用 Groovy 。
Groovy之于Java,雷同狂草之于行楷。认识Groovy的人开辟起来如偕行云流水,但不认识的感觉照旧在写Java。
3.1.2 原理

Groovy 与Java 最终都是以字节码的方式在JVM 上面实行,两者的编译和加载步调是一样的,差异是Groovy显式支持运行时编译动态加载
Groovy支持将.groovy源代码编译成.class字节码文件(预编译模式),同时又支持在运行时加载并编译.groovy源文件(直接调用模式).
Groovy 却是一门动态语言,可以在运行时扩展步伐,好比动态调用(拦截、注入、合成)方法,那么 Groovy 是怎样实现这齐备的呢?
实在这齐备都要归功于 Groovy 编译器,Groovy 编译器在编译 Groovy 代码的时间,并不是像 Java 一样,直接编译成字节码,而是编译成 “动态调用的字节码”。
比方下面这一段 Groovy 代码:
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-19 00:21, Processed in 0.186281 second(s), 35 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表