开发者社区> 邴越> 正文

规则引擎选型及应用

简介: 规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程。 使用规则引擎可以把复杂、冗余的业务规则同整个支撑系统分离开,做到架构的可复用移植。
+关注继续查看

规则引擎由推理引擎发展而来,是一种嵌入在应用程序中的组件,实现了将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策。
规则引擎具体执行可以分为接受数据输入,解释业务规则,根据业务规则做出业务决策几个过程。
使用规则引擎可以把复杂、冗余的业务规则同整个支撑系统分离开,做到架构的可复用移植。

规则引擎的应用

相对于业务系统,规则引擎可以认为是一个独立于业务系统的模块,负责一些规则的计算等。
一般来说,规则引擎主要应用在下面的场景中:

  • 风控模型配置,风控是规则引擎
  • 用户积分等配置,如日常操作引起积分变化等
  • 简单的离线计算,各类数据量比较小的统计等

常用规则引擎的选型

目前的规则引擎系统中,使用较多的开源规则引擎是Drools,另外还有商用的规则管理系统BRMS是ILOG JRules。

Drools

Drools是一个基于Java的开源规则引擎,可以将复杂多变的规则从硬编码中解放出来,以规则脚本的形式存放在文件中,使得规则的变更不需要修正代码重启机器就可以立即在线上环境生效。

目前版本是5.0.1,Drools从5.0后分为四个模块:

  • Drools Guvnor (BRMS/BPMS)
  • Drools Expert (rule engine)
  • Drools Flow (process/workflow)
  • Drools Fusion (cep/temporal reasoning)

drools代码地址

[drools应用文档](https://github.com/kiegroup/droolsjbpm-build-bootstrap/blob/master/README.md
)

Ilog JRules

Ilog Jrules是完整的业务规则管理系统(BRMS),它提供了对整个企业业务规则进行建模、编写、测试、部署和维护所必需的所有工具。

Ilog Jrules主要包括以下4个组件:

  • Rule Studio(RS) 面向开发人员使用的开发环境,用于规则的建模和编写
  • Rule Scenario Manager 规则测试工具
  • Rule Team Server(RTS) 基于Web的管理环境,面向业务人员使用,用于规则发布、管理、存储
  • Rule Execution Server(RES) 面向运维人员使用,用于规则执行、监控

[Ilog Jrules主页](https://www-01.ibm.com/software/integration/business-rule-management/jrules-family/
)

这两款规则引擎设计和实现都比较复杂,学习成本高,适用于大型应用系统。

Easy Rules

Easy Rules是我偶然间看到的一个规则引擎实现,相比Drools等企业级规则引擎,Easy Rules的应用非常简单,学习成本低,容易上手。
下面重点介绍这款轻量级的规则引擎 Easy Rules。

轻量级规则引擎Easy Rules

Easy Rules官方主页:http://www.easyrules.org/

Easy Rules提供以下功能:

  • 轻量级框架和易于学习的API
  • 基于POJO的开发
  • 通过高效的抽象来定义业务规则并轻松应用它们
  • 支持创建复合规则

Easy Rules的应用

Easy rules的工程可以从Github下载,构建需要Maven支持。

$ git clone https://github.com/EasyRules/easyrules.git
$ cd easyrules
$ mvn install

Easy Rules打包后是一个单独的jar,使用时需要添加相关文件到工程中,或者添加Maven依赖:

<dependency>
    <groupId>org.easyrules</groupId>
    <artifactId>easyrules-core</artifactId>
    <version>2.4.0</version>
</dependency>

配置你的业务规则

大多数业务规则可以表示为以下定义:

  • 名称:一种唯一的规则名称
  • 描述:对规则的简要描述
  • 优先级:相对于其他规则的优先级
  • 条件:设置规则执行时需要满足的条件
  • 操作:设置的条件满足时执行的操作

我们可以通过扩展Easy Rules提供的Rule interface来定义规则,或者通过注解,定义自己的规则类。

下面是内置的Rule接口:

package org.easyrules.api;

public interface Rule {

    /**
    * 这个方法定义了规则执行的条件
    * @return true if the rule should be applied, false else
    */
    boolean evaluate();

    /**
    * 这个方法定义了规则执行的具体动作
    * @throws Exception if an error occurs
    */
    void execute() throws Exception;

    //Getters and setters for rule name,
    //description and priority omitted.

}

创建规则引擎

Easy Rules的引擎实例会维护一个不同规则的注册空间,每个Engine可以被视为一个单独的名称空间。
多条规则将会按照他们的自然顺序去执行,也就是默认的优先级。

要创建一个规则引擎和注册规则,可以使用下面的静态方法:

RulesEngineBuilder.aNewEngineBuilder():
RulesEngine rulesEngine = aNewEngineBuilder().build();
rulesEngine.registerRule(myRule);

执行下面的操作启动规则执行:

rulesEngine.fireRules();

Easy Rules应用实例

下面通过一个简单的Hello World示例来展示Easy Rules的具体应用。

通过注解创建一个具体的规则类:

@Rule(name = "Hello World rule",
    description = "Say Hello to duke's friends only")
public class HelloWorldRule {

    /**
     * The user input which represents the data
     * that the rule will operate on.
     */
    private String input;

    @Condition
    public boolean checkInput() {
        //The rule should be applied only if
        //the user's response is yes (duke friend)
        return input.equalsIgnoreCase("yes");
    }

    @Action
    public void sayHelloToDukeFriend() throws Exception {
        //When rule conditions are satisfied,
        //prints 'Hello duke's friend!' to the console
        System.out.println("Hello duke's friend!");
    }

    public void setInput(String input) {
        this.input = input;
    }

}

接下来创建一个规则引擎的实例,注册并且启动这个规则:


public class Launcher {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        System.out.println("Are you a friend of duke?[yes/no]:");
        String input = scanner.nextLine();

        /**
         * Declare the rule
         */
        HelloWorldRule helloWorldRule = new HelloWorldRule();

        /**
         * Set business data to operate on
         */
        helloWorldRule.setInput(input.trim());

        /**
         * Create a rules engine and register the business rule
         */
        RulesEngine rulesEngine = aNewRulesEngine().build();
        
        rulesEngine.registerRule(helloWorldRule);

        /**
         * Fire rules
         */
        rulesEngine.fireRules();

    }
}

规则启动后会通过一个简单的条件判断(控制台输入),然后执行接下来的动作(输出规则信息)。

除了规则引擎基础的规则执行功能, Easy Rules还支持监听规则执行情况,为规则执行配置调度器,
集成Spring等功能。

关于规则引擎的选型和简单应用就介绍到这里,除了风控等大型的应用系统,一些独立的小型产品需求中,可以合理应用规则引擎实现业务与规则的分离,降低系统间耦合,上面介绍的Easy Rules就是一个不错的选择。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,大概有三种登录方式:
9739 0
银行卡号编码规则及其应用
绑卡时输入银行卡号后识别出银行和卡种是如何做到的?为什么能够在卡号输入有误时进行友好提示?本篇文章将为大家揭晓。 一、银行卡结构 XXXXXX XXXXXXXXXXXX X 发卡行标识代码 自定义位 校验码 根据ISO标准,银行卡长度一般在13-19位,国际上也有12位的。银联标准卡卡长度一般是在16-19位,双组织卡也有13-19位的。 二、发卡行标识代
2621 0
阿里云轻量应用服务器峰值带宽流量包超额收费规则
阿里云轻量应用服务器峰值带宽配备每月固定配额流量包套餐,当超过每月固定配额后流量按照价格为0.8元/GB来收取
924 0
阿里云服务网格ASM公测来袭系列之六:在ASM中为应用定义路由规则
通过管理 Istio 资源定义,可以实现 ASM 服务网格的流量治理、鉴权以及安全保护等能力。本文介绍如何定义虚拟服务和目标规则这两种 Istio 资源。
380 0
详解:Drools规则引擎探究以及在IOT的应用
目前所处为淘系技术部负责天猫奢品的业务,业务背景如下:业务包含天猫奢品频道,奢品折扣频道,天猫奢品官方直营旗舰店,魅力惠旗舰店,魅力惠APP等。基于业务场景下会员分为店铺会员,APP会员,天猫奢品行业会员等,而业务需要进行会员精细化的运营,通过不同的会员等级享受不同的权益,而相同的等级还需要做到根据偏好做到千人多权,如何根据复杂的业务需求变化更加精准的进行匹配,考虑Drools规则的逻辑数据的分离和可扩展性,接下来也会在天猫奢品的相关的会员模块中和组内成员探讨是否适合引入。下面是一些基于业务场景的总结和分享。
4098 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
13825 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
20438 0
+关注
邴越
关注分布式系统及高可用架构,探讨职业规划,实践持续学习,公众号「架构进化论」
251
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
JS零基础入门教程(上册)
立即下载
性能优化方法论
立即下载
手把手学习日志服务SLS,云启实验室实战指南
立即下载