規則引擎 Drools 全套代碼及資料全部完整提供,點此處下載 1. 問題引出 現有一個線上申請信用卡的業務場景,用戶需要錄入個人信息,如下圖所示: 通過上圖可以看到,用戶錄入的個人信息包括姓名、性別、年齡、學歷、電話、所在公司、職位、月收入、是否有房、是否有車、是否有信用卡等。錄入完成後點擊申請按 ...
目錄
規則引擎 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開發步驟如下: