目錄
- 規則引擎 Drools
- 1. 問題引出
- 2. 規則引擎概述
- 2.1 什么是規則引擎
- 2.2 使用規則引擎的優勢
- 2.3 規則引擎應用場景
- 2.4 Drools介紹
規則引擎 Drools
全套代碼及資料全部完整提供,點此處下載
1. 問題引出
現有一個在線申請信用卡的業務場景,用戶需要錄入個人資訊,如下圖所示:

通過上圖可以看到,用戶錄入的個人資訊包括姓名、性別、年齡、學歷、電話、所在公司、職位、月收入、是否有房、是否有車、是否有信用卡等,錄入完成后點擊申請按鈕提交即可,
用戶提交申請后,需要在系統的服務端進行用戶資訊合法性檢查(是否有資格申請信用卡),只有通過合法性檢查的用戶才可以成功申請到信用卡(注意:不同用戶有可能申請到的信用卡額度不同),
檢查用戶資訊合法性的規則如下:
| 規則編號 | 名稱 | 描述 |
|---|---|---|
| 1 | 檢查學歷與薪水1 | 如果申請人既沒房也沒車,同時學歷為大專以下,并且月薪少于5000,那么不通過 |
| 2 | 檢查學歷與薪水2 | 如果申請人既沒房也沒車,同時學歷為大專或本科,并且月薪少于3000,那么不通過 |
| 3 | 檢查學歷與薪水3 | 如果申請人既沒房也沒車,同時學歷為本科以上,并且月薪少于2000,同時之前沒有信用卡的,那么不通過 |
| 4 | 檢查申請人已有的信用卡數量 | 如果申請人現有的信用卡數量大于10,那么不通過 |
用戶資訊合法性檢查通過后,還需要根據如下信用卡發放規則確定用戶所辦信用卡的額度:
| 規則編號 | 名稱 | 描述 |
|---|---|---|
| 1 | 規則1 | 如果申請人有房有車,或者月收入在20000以上,那么發放的信用卡額度為15000 |
| 2 | 規則2 | 如果申請人沒房沒車,但月收入在10000~20000之間,那么發放的信用卡額度為6000 |
| 3 | 規則3 | 如果申請人沒房沒車,月收入在10000以下,那么發放的信用卡額度為3000 |
| 4 | 規則4 | 如果申請人有房沒車或者沒房但有車,月收入在10000以下,那么發放的信用卡額度為5000 |
| 5 | 規則5 | 如果申請人有房沒車或者是沒房但有車,月收入在10000~20000之間,那么發放的信用卡額度為8000 |
思考:如何實作上面的業務邏輯呢?
我們最容易想到的就是使用分支判斷(if else)來實作,例如通過如下代碼來檢查用戶資訊合法性:
//此處為偽代碼
//檢查用戶資訊合法性,回傳true表示檢查通過,回傳false表示檢查不通過
public boolean checkUser(User user){
//如果申請人既沒房也沒車,同時學歷為大專以下,并且月薪少于5000,那么不通過
if(user.getHouse() == null
&& user.getcar() == null
&& user.getEducation().equals("大專以下")
&& user.getSalary < 5000){
return false;
}
//如果申請人既沒房也沒車,同時學歷為大專或本科,并且月薪少于3000,那么不通過
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getEducation().equals("大專或本科")
&& user.getSalary < 3000){
return false;
}
//如果申請人既沒房也沒車,同時學歷為本科以上,并且月薪少于2000,同時之前沒有信用卡的,那么不通過
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getEducation().equals("本科以上")
&& user.getSalary < 2000
&& user.getHasCreditCard() == false){
return false;
}
//如果申請人現有的信用卡數量大于10,那么不通過
else if(user.getCreditCardCount() > 10){
return false;
}
return true;
}
如果用戶資訊合法性檢查通過后,還需要通過如下代碼確定用戶所辦信用卡的額度:
//此處為偽代碼
//根據用戶輸入資訊確定信用卡額度
public Integer determineCreditCardLimit(User user){
//如果申請人有房有車,或者月收入在20000以上,那么發放的信用卡額度為15000
if((user.getHouse() != null && user.getcar() != null)
|| user.getSalary() > 20000){
return 15000;
}
//如果申請人沒房沒車,并且月收入在10000到20000之間,那么發放的信用卡額度為6000
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getSalary() > 10000
&& user.getSalary() < 20000){
return 6000;
}
//如果申請人沒房沒車,并且月收入在10000以下,那么發放的信用卡額度為3000
else if(user.getHouse() == null
&& user.getcar() == null
&& user.getSalary() < 10000){
return 3000;
}
//如果申請人有房沒車或者沒房但有車,并且月收入在10000以下,那么發放的信用卡額度為5000
else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null))
&& user.getSalary() < 10000){
return 5000;
}
//如果申請人有房沒車或者沒房但有車,并且月收入在10000到20000之間,那么發放的信用卡額度為8000
else if((((user.getHouse() != null && user.getcar() == null) || (user.getHouse() == null && user.getcar() != null))
&& (user.getSalary() > 10000 && user.getSalary() < 20000)){
return 8000;
}
}
通過上面的偽代碼我們可以看到,我們的業務規則是通過Java代碼的方式實作的,這種實作方式存在如下問題:
1、硬編碼實作業務規則難以維護
2、硬編碼實作業務規則難以應對變化
3、業務規則發生變化需要修改代碼,重啟服務后才能生效
那么面對上面的業務場景,還有什么好的實作方式嗎?
答案是規則引擎,
2. 規則引擎概述
2.1 什么是規則引擎
規則引擎,全稱為業務規則管理系統,英文名為BRMS(即Business Rule Management System),規則引擎的主要思想是將應用程式中的業務決策部分分離出來,并使用預定義的語意模塊撰寫業務決策(業務規則),由用戶或開發者在需要時進行配置、管理,
需要注意的是規則引擎并不是一個具體的技術框架,而是指的一類系統,即業務規則管理系統,目前市面上具體的規則引擎產品有:drools、VisualRules、iLog等,
規則引擎實作了將業務決策從應用程式代碼中分離出來,接收資料輸入,解釋業務規則,并根據業務規則做出業務決策,規則引擎其實就是一個輸入輸出平臺,
上面的申請信用卡業務場景使用規則引擎后效果如下:

系統中引入規則引擎后,業務規則不再以程式代碼的形式駐留在系統中,取而代之的是處理規則的規則引擎,業務規則存盤在規則庫中,完全獨立于程式,業務人員可以像管理資料一樣對業務規則進行管理,比如查詢、添加、更新、統計、提交業務規則等,業務規則被加載到規則引擎中供應用系統呼叫,
2.2 使用規則引擎的優勢
使用規則引擎的優勢如下:
1、業務規則與系統代碼分離,實作業務規則的集中管理
2、在不重啟服務的情況下可隨時對業務規則進行擴展和維護
3、可以動態修改業務規則,從而快速回應需求變更
4、規則引擎是相對獨立的,只關心業務規則,使得業務分析人員也可以參與編輯、維護系統的業務規則
5、減少了硬編碼業務規則的成本和風險
6、使用規則引擎提供的規則編輯工具,使復雜的業務規則實作變得的簡單
2.3 規則引擎應用場景
對于一些存在比較復雜的業務規則并且業務規則會頻繁變動的系統比較適合使用規則引擎,如下:
1、風險控制系統----風險貸款、風險評估
2、反欺詐專案----銀行貸款、征信驗證
3、決策平臺系統----財務計算
4、促銷平臺系統----滿減、打折、加價購
2.4 Drools介紹
drools是一款由JBoss組織提供的基于Java語言開發的開源規則引擎,可以將復雜且多變的業務規則從硬編碼中解放出來,以規則腳本的形式存放在檔案或特定的存盤介質中(例如存放在資料庫中),使得業務規則的變更不需要修改專案代碼、重啟服務器就可以在線上環境立即生效,
drools官網地址:https://drools.org/
drools原始碼下載地址:https://github.com/kiegroup/drools
在專案中使用drools時,即可以單獨使用也可以整合spring使用,如果單獨使用只需要匯入如下maven坐標即可:
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>7.6.0.Final</version>
</dependency>
如果我們使用IDEA開發drools應用,IDEA中已經集成了drools插件,如果使用eclipse開發drools應用還需要單獨安裝drools插件,
drools API開發步驟如下:

全套代碼及資料全部完整提供,點此處下載
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/537996.html
標籤:Java
