1.産品簡介
規則引擎是一種嵌入在應用程序中的組件,它可(kě)以将業務規則從業務代碼中剝離出來(lái),使用預先定義好的語義規範來(lái)實現這些(xiē)剝離出來(lái)的業務規則;規則引擎通(tōng)過接受輸入的數(shù)據,進行(xíng)業務規則的評估,并做(zuò)出業務決策。
因為(wèi)規則引擎将複雜的業務邏輯從業務代碼中剝離出來(lái),所以可(kě)以顯著降低(dī)業務邏輯實現難度;同時(shí),剝離的業務規則使用規則引擎實現,這樣可(kě)以使多(duō)變的業務規則變的可(kě)維護,配合規則引擎提供的良好的業務規則設計(jì)器(qì),不用編碼就可(kě)以快速實現複雜的業務規則,同樣,即使是完全不懂編程的業務人(rén)員,也可(kě)以輕松上(shàng)手使用規則引擎來(lái)定義複雜的業務規則。
業務系統運行(xíng)過程中難免會(huì)發生(shēng)業務規則變化的情形,有(yǒu)了規則引擎,業務規則部分采用的是規則引擎實現,這樣在系統正常運行(xíng)的情況就可(kě)以利用規則引擎對業務規則進行(xíng)修改,從而實現業務規則的随需應便。
URule Pro是一款由上海銳鈞信息技術有限公司自主研發的一款純Java規則引擎,它可(kě)以運行(xíng)在Windows、Linux、Unix等各種類型的操作(zuò)系統之上(shàng); URule Pro的規則設計(jì)器(qì)采用業內(nèi)首創的純浏覽器(qì)編輯模式,無須安裝任何工具,打開(kāi)浏覽器(qì)即可(kě)完成複雜規則的設計(jì)與測試。
URule Pro技(jì)術(shù)交流QQ群:566257889(加群時(shí)請(qǐng)注明(míng)來(lái)意,否則将不會(huì)通(tōng)過)
URule Pro标準視(shì)頻教程:https://www.bilibili.com/video/av57111513
保險業務示例視(shì)頻教程:https://www.bilibili.com/video/av73008171
電(diàn)費計(jì)算(suàn)示例視(shì)頻教程:https://www.bilibili.com/video/BV16e411x77u/
飛機機位分配示例視(shì)頻教程:https://www.bilibili.com/video/BV1pC4y1s7XP/
貸款還(hái)款計(jì)劃計(jì)算(suàn)視(shì)頻教程:https://www.bilibili.com/video/BV1FT4y1G7ZL/
個(gè)稅計(jì)算(suàn)視(shì)頻教程:https://www.bilibili.com/video/BV1Jp4y1S7CC/
我們可(kě)以從以下幾個(gè)方面來(lái)了解URule Pro。
強大(dà)的功能
在URule Pro當中,提供規則集、決策表、交叉決策表(決策矩陣)、決策樹(shù)、評分卡、複雜評分卡、規則流等八種類型的業務規則設計(jì)工具,從各個(gè)角度滿足複雜業務規則設計(jì)的需要。
如果您需要在業務規則當中進行(xíng)科學計(jì)算(suàn),同時(shí)要求計(jì)算(suàn)時(shí)采用标準的數(shù)學符号,那(nà)麽URule Pro可(kě)能是最佳選擇。
在URule Pro當中提供了15大(dà)類,近40個(gè)小(xiǎo)類的常用數(shù)學符号,可(kě)進行(xíng)幾乎所有(yǒu)類型的可(kě)視(shì)化的科學計(jì)算(suàn),URule Pro應該是目前市面上(shàng)唯一一款能進行(xíng)可(kě)視(shì)化科學計(jì)算(suàn)的規則引擎。
如果我們的業務給出的是零散的邏輯規則,那(nà)麽可(kě)以使用規則集來(lái)實現;如果給出的是表格形式的業務規則,那(nà)麽可(kě)以直接使用對應的決策表或交叉決策表(決策矩陣)來(lái)實現;如果需要對實體(tǐ)進行(xíng)綜合評分,則可(kě)以使用評分卡或複雜評分卡來(lái)實現;最後還(hái)可(kě)以通(tōng)過規則流對一系列複雜的規則個(gè)體(tǐ)進行(xíng)編排,将這個(gè)規則流作(zuò)為(wèi)實際業務規則調用入口,從而實現任意複雜的業務規則。
無論是規則文件的部署,還(hái)是規則中要調用的Spring Bean以及相關的Java類的加載,URule Pro全部采用熱部署功能實現(參見Spring Bean及Java類的熱部署),系統不重啓即可(kě)實現所有(yǒu)與規則相關的業務需求變更。
簡單的使用方式
URule Pro中提供的所有(yǒu)的規則設計(jì)器(qì)及打包測試工具,全部基于浏覽器(qì)實現,所有(yǒu)的規則設計(jì)器(qì)皆為(wèi)可(kě)視(shì)化、圖形化設計(jì)器(qì),通(tōng)過鼠标點擊即可(kě)實現複雜的業務規則定義,URule Pro中規則的多(duō)條件組合也是以圖形方式展現,這樣即使沒有(yǒu)任何編程經驗的普通(tōng)業務人(rén)員,也可(kě)以輕松上(shàng)手,完成複雜業務規則的定義。
因為(wèi)所有(yǒu)的業務規則設計(jì)器(qì)都是基于網頁的,且規則的定義都是通(tōng)過鼠标點擊的方式完成,所以對于一個(gè)普通(tōng)的使用者來(lái)說,配合教學視(shì)頻兩到三天即可(kě)完全掌握URule Pro中各種設計(jì)器(qì)的使用,結合業務需要定義出想要的業務規則。
優秀的性能
URule Pro後台采用純Java實現,運行(xíng)時(shí)借鑒Rete了算(suàn)法的優勢,再結合中式規則引擎的特點,獨創了一套自己的規則模式匹配算(suàn)法,這套算(suàn)法可(kě)以從根本上(shàng)保證規則運行(xíng)的效率,實現大(dà)量複雜業務規則計(jì)算(suàn)時(shí)的毫秒(miǎo)級響應。
完善的版本控制(zhì)機制(zhì)
在URule Pro當中,無論是單個(gè)規則文件、或是用戶調用的規則包,都提供了完善的版本控制(zhì)機制(zhì)。對于規則文件來(lái)說隻要有(yǒu)需要,可(kě)以回退到任何一個(gè)曆史版本; 對于給用戶調用的規則包,可(kě)以在不同的曆史版本之間(jiān)靈活切換。
架構
系統架構圖
從上(shàng)圖中可(kě)以看到,使用者通(tōng)過浏覽器(qì)打開(kāi)URule Pro規則設計(jì)器(qì)來(lái)定義業務規則,完成後的業務規則文件會(huì)被存儲在規則存儲倉庫中(在URule Pro當中規則存儲倉庫既可(kě)以是文件系統中的某個(gè)目錄,也可(kě)以存儲于數(shù)據庫當中)。規則文件調用時(shí)引擎會(huì)從規則存儲倉庫裏把指定的規則文件取出,再通(tōng)過規則構建引擎對規則進行(xíng)解析、編譯,最後由規則執行(xíng)引擎執行(xíng)并返回結果。
技(jì)術(shù)架構圖
運行(xíng)模式
實際使用時(shí),有(yǒu)四種使用URule Pro的方式,分别是嵌入式模式、本地模式、分布式計(jì)算(suàn)模式以及獨立服務模式。
嵌入式模式
所謂的嵌入式,是指将URule Pro直接嵌入到我們的Java Web應用當中,作(zuò)為(wèi)應用的一部分運行(xíng)。這種模式的好處是配置起來(lái)比較簡單;而不好的地方在于因為(wèi)将URule Pro直接嵌入到我們的應用當中,如果我們有(yǒu)多(duō)個(gè)涉及到規則引擎的應用, 那(nà)麽每個(gè)應用都需要嵌入一個(gè)URule Pro模塊,所以更多(duō)的時(shí)候我們使用的是獨立服務模式。
本地模式
本地模式類似于嵌入式模式,所不同的是嵌入到我們客戶端應用中的URule Pro模塊僅僅為(wèi)其規則計(jì)算(suàn)部分(core部分),不含設計(jì)器(qì)部分(console部分); 之後将測試好的知識包導出為(wèi)一個(gè).data格式文件,然後把文件放在客戶端應用的一個(gè)指定目錄下或數(shù)據庫中,這樣客戶端應用在調用知識包時(shí)就直接到這個(gè)指定目錄下或數(shù)據庫中查找目标.data文件并加載。
這種模式非常适用于規則運行(xíng)環境封閉,且需要對外部屏蔽規則設計(jì)細節的應用需要,其部署模式簡單、快捷,一旦有(yǒu)新的知識包放入指定目錄中,客戶端應用會(huì)自動檢測并加載新的版本。
分布式計(jì)算(suàn)模式
分布式計(jì)算(suàn)模式是指将URule Pro部署為(wèi)一個(gè)獨立的Java Web應用,在這個(gè)應用裏定義各個(gè)業務系統所需要業務規則,定義好後統一存儲到一個(gè)規則存儲倉庫當中。 業務系統要使用規則時(shí)隻需要指定URule Pro Server的地址即可(kě)通(tōng)過HTTP協議取到目标規則包,然後解析并運行(xíng),其運行(xíng)模式圖如下所示:在分布式計(jì)算(suàn)模式下, 一個(gè)URule Pro Server可(kě)以下挂多(duō)個(gè)需要用到規則引擎的業務系統,但(dàn)實際的業務規則在運行(xíng)時(shí)還(hái)是發生(shēng)在各個(gè)業務系統中,而不是URule Pro Server上(shàng),所以稱之為(wèi)分布式計(jì)算(suàn)模式。
各個(gè)業務系統在運行(xíng)業務規則時(shí),會(huì)首先檢查要運行(xíng)規則對應的規則包在本地緩存中是否存在,如果存在則直接使用,不存在則通(tōng)過配置的URule Pro Server地址向Server發出使用對應規則包的請(qǐng)求, URule Pro Server收到請(qǐng)求後會(huì)将指定的規則包序列化成JSON,通(tōng)過HTTP協議傳遞給請(qǐng)求的業務系統。業務系統收到傳遞過來(lái)的規則包後,會(huì)首先對其進行(xíng)反序列化,将JSON格式的規則包反序列化為(wèi)Java對象并在本地緩存下來(lái),然後再使用這個(gè)規則包進行(xíng)業務規則的計(jì)算(suàn)。
可(kě)以看到,在這個(gè)過程當中,URule Pro Server隻負責業務規則的定義、編譯與發布,不負責具體(tǐ)的業務規則執行(xíng),具體(tǐ)的規則執行(xíng)還(hái)是發生(shēng)在各個(gè)業務系統當中,可(kě)以大(dà)大(dà)減輕URule Server的壓力,使得(de)規則的計(jì)算(suàn)可(kě)以分布到各個(gè)業務系統所在的服務器(qì)上(shàng), 從而可(kě)以根據需要對計(jì)算(suàn)規則的服務器(qì)進行(xíng)靈活的擴充。
獨立服務模式
獨立服務模式也是規則引擎的傳統運行(xíng)模式,那(nà)就是把規則的調用以一個(gè)Restful服務的形式對外提供,客戶端可(kě)以是Java、C#、C++或Javascript,客戶端隻需要把标準的JSON格式的輸入數(shù)據提交給規則服務器(qì),服務器(qì)調用規則計(jì)算(suàn)完成後會(huì)以JSON格式作(zuò)為(wèi)響應返回。Restful服務支持安全驗證, 提供完善的調用測試頁面,同時(shí)對于輸入數(shù)據,還(hái)支持複雜的JSON數(shù)據嵌套,以最大(dà)限度滿足複雜業務需求;對于大(dà)批量并發調用,URule Pro提供完整的集群支持。
分布式計(jì)算(suàn)模式下的規則包更新
在分布式計(jì)算(suàn)模式下規則包的更新有(yǒu)兩種方式:一種是主動推送方式;一種為(wèi)定時(shí)更新的方式。
主動推送方式是指URule Pro Server在規則包更新後,會(huì)主動将更新後的規則包通(tōng)過HTTP協議推送到配置好的各種業務系統應用的緩存當中,這樣各個(gè)業務系統中的規則包就可(kě)以與Server中的規則包時(shí)刻保持一緻, 但(dàn)這種推送方式要求對應的各個(gè)業務系統應用必須是一個(gè)标準Java Web應用,否則這種推送無法實現,如果您的業務系統應用是一個(gè)Java應用,而非一個(gè)标準的Java Web應用,那(nà)麽要更新規則包就不能采用這種推送方式,而需要使用定時(shí)更新的方式。
定時(shí)更新方式是指具體(tǐ)調用規則的業務系統,可(kě)以通(tōng)過相應的參數(shù)配置,周期性的檢查URule Pro Server上(shàng)當前業務系統用到的規則包是否有(yǒu)更新,如果有(yǒu)則主動從Server上(shàng)取下來(lái)并序列化成Java對應緩存到當前業務系統中備用,如果沒有(yǒu)更新則不做(zuò)任何操作(zuò)。
所以如果您的業務系統是一個(gè)非Java Web應用,那(nà)麽更新規則包可(kě)以采用定時(shí)更新的方式實現;相反如果您的業務系統是一個(gè)标準的Java Web應用,那(nà)麽主動推送和(hé)定時(shí)更新兩種方式都可(kě)以,當然主動推送的方式更為(wèi)合适。
對科學計(jì)算(suàn)的支持
在URule Pro當中提供了平方根、方根、乘方、分數(shù)、指數(shù)、對數(shù)、自然對數(shù)、絕對值、圓周率、向上(shàng)取整、向下取整、極值、三角函數(shù)、反三角函數(shù)等15大(dà)類, 近40個(gè)小(xiǎo)類的常用數(shù)學符号,這些(xiē)數(shù)學符号可(kě)以在規則的動作(zuò)定義部分當中, 可(kě)進行(xíng)幾乎所有(yǒu)類型的可(kě)視(shì)化的科學計(jì)算(suàn), URule Pro應該是目前市面上(shàng)唯一一款能進行(xíng)可(kě)視(shì)化科學計(jì)算(suàn)的規則引擎。
這些(xiē)數(shù)學符号在規則動作(zuò)中使用效果如下圖所示:
規則設計(jì)器(qì)
URule Pro當中提供了向導式規則集、腳本式規則集、決策表、交叉決策表(決策矩陣)、決策樹(shù)、評分卡、複雜評分卡、規則流八種類型的業務規則設計(jì)工具,我們來(lái)看看這些(xiē)設計(jì)器(qì)以及它們設計(jì)出來(lái)的規則的樣子。
向導式規則集
規則集也叫決策集,是由一系列單個(gè)普通(tōng)規則以及循環規則構成的,規則集設計(jì)器(qì)采用全向導方式,通(tōng)過鼠标點擊就可(kě)以完成規則配置。
定義好的普通(tōng)規則如下圖:
定義好的循環規則如下圖:
腳本式規則集
如果使用URule Pro的是一名程序員,那(nà)麽在編寫規則的時(shí)候,可(kě)能會(huì)更傾向于使用腳本方式業定義業務規則。在URule Pro當中向導式規則集能實現的功能腳本式規則集全部可(kě)以實現,反之亦然。
腳本式規則集編輯器(qì)是一個(gè)基于浏覽器(qì)技(jì)術(shù)的腳本編輯器(qì)、提供了完善的關鍵字及BOM信息提示、腳本合法性的實時(shí)檢測、語法錯誤提示、适合業務人(rén)員使用的中文關鍵字等功能。
在腳本式規則編輯器(qì)裏,既可(kě)以定義英文關鍵字腳本式規則,也可(kě)以定義中文關鍵字的腳本式規則,還(hái)可(kě)以定義中英文混合關鍵字的腳本式規則。
決策表
與普通(tōng)的規則集(決策集)相比,決策表是通(tōng)過一個(gè)二維表的方式來(lái)定義一批規則,在URule Pro當中,一張決策表分為(wèi)左右兩部分,左邊部分是條件部分,右邊部分為(wèi)條件滿足後的動作(zuò)部分,如下圖所示:
同樣,決策表設計(jì)器(qì)也是基于浏覽器(qì)支持構建,通(tōng)過鼠标點擊就可(kě)以完成整個(gè)決策表的定義。
交叉決策表(決策矩陣)
普通(tōng)決策表是通(tōng)過縱向一個(gè)維度的條件來(lái)實現規則的約束,而交叉決策表(決策矩陣)則是通(tōng)過橫向和(hé)縱向兩個(gè)維度進行(xíng)條件約束,兩個(gè)維度交叉生(shēng)的單元格就是實際業務規則生(shēng)效的條件,因為(wèi)這種樣式有(yǒu)些(xiē)類似于我們報表中的交叉表,所以稱之為(wèi)交叉決策表,也叫決策矩陣。
可(kě)以看到,交叉決策表的特點使得(de)其可(kě)以定義更為(wèi)複雜的交叉類型的業務規則。
決策樹(shù)
之所以稱之為(wèi)決策樹(shù),是因為(wèi)業務規則以樹(shù)形方式展現。在URule Pro當中的決策樹(shù),是一棵平躺的樹(shù),設計(jì)成平躺的目的是為(wèi)了可(kě)以展現樹(shù)的更多(duō)內(nèi)容,更好的利用顯示空(kōng)間(jiān)。
普通(tōng)評分卡
普通(tōng)評分卡是URule Pro當中專門(mén)為(wèi)簡單評分系統而設計(jì)的一種業務規則工具,它可(kě)以針對某個(gè)實體(tǐ)對象的屬性條件進行(xíng)評分,每個(gè)屬性在條件滿足後還(hái)可(kě)以添加權重支持,同時(shí)對于得(de)分的計(jì)算(suàn)方式提供求和(hé)、加權求和(hé)以及用戶自定義方式,以最大(dà)限度滿足業務系統評分規則的需要。
複雜評分卡
在URule Pro提供的普通(tōng)評分卡當中,隻能針對某一個(gè)對象的一些(xiē)屬性進行(xíng)評分,這種評分方式可(kě)以滿足大(dà)部分評分系統的需求,但(dàn)在某些(xiē)複雜的評分需求中,需要對多(duō)個(gè)對象的不同屬性進行(xíng)疊加組合評分,針對此類需求,URule Pro提供了複雜評分卡功能。複雜評分卡的配置方式與決策表有(yǒu)些(xiē)類似,隻是對于條件列頭隻能選擇具體(tǐ)的對象,而每個(gè)條件單元格在配置條件時(shí)都需要選擇與當前列頭選擇的對象對應的具體(tǐ)屬性,這樣就可(kě)以滿足任意複雜的評分需求。
規則流
無論是普通(tōng)的規則集,還(hái)是決策表或評分卡,這些(xiē)規則工具都隻能完成一個(gè)複雜業務規則需求的一個(gè)點,所以對于完成的業務需求實現來(lái)說,還(hái)需要有(yǒu)工具把這些(xiē)點串起來(lái),這個(gè)工具就是規則流,也叫決策流。
URule Pro當中提供的規則流可(kě)以把前面介紹的這些(xiē)普通(tōng)的規則集,決策表或評分卡串起來(lái),實現對已有(yǒu)規則的可(kě)視(shì)化編排功能。
在實際的業務系統中往往都是以規則流作(zuò)為(wèi)業務規則的調用入口,通(tōng)過規則流将所有(yǒu)的以點形式存在的規則編排起來(lái)執行(xíng),從而可(kě)以實現任意複雜的業務規則需求。
規則的打包與調用
按照業務需求将規則文件定義好後,就可(kě)以将涉及到的所有(yǒu)規則文件打包備用。打包方式是點擊URule Pro規則項目導航上(shàng)的“知識包”節點,在出現的頁面當中,就可(kě)以将規則文件打包成一個(gè)個(gè)待調用的知識包,如下圖所示:
一個(gè)知識裏面可(kě)以包含若幹個(gè)具體(tǐ)的規則文件,這些(xiē)文件可(kě)以是若幹個(gè)規則集(決策集)、決策表、交叉決策表(決策矩陣)、評分卡、複雜評分卡以及決策流。需要注意的是,規則文件裏引入的庫文件(變量庫、參數(shù)庫、常量庫以及動作(zuò)庫文件)是不需要導入的,引擎會(huì)自動處理(lǐ)規則中包含的庫文件。
知識包配置完成後,可(kě)以對當前知識包進行(xíng)測試。URule Pro提供了三種類型的針對知識包的測試,一種為(wèi)用戶選擇輸入測試值的快速測試,一種為(wèi)輸入複雜JSON的快速測試,另一種為(wèi)支持基于Excel批量數(shù)據的“仿真測試”。
這其中用戶選擇輸入測試值的快速測試在配置好測試項,點擊并成功測試後,引擎會(huì)将測試配置及輸入內(nèi)容保存下來(lái),這樣下次就可(kě)以直接使用上(shàng)次配置的快速測試內(nèi)容。
點擊知識包項菜單列菜單按鈕,在彈出的菜單中選擇的“快速測試”按鈕就可(kě)以對當前知識進行(xíng)測試,在測試頁面當中選擇添加并輸入相關測試數(shù)據即可(kě)進行(xíng)快速測試, 然後再點擊工具欄上(shàng)的“測試決策包”按鈕就可(kě)以對當前知識包裏除規則流以外所有(yǒu)類型的規則進行(xíng)測試,如果當前知識包裏有(yǒu)規則流文件,那(nà)麽就需要點擊工具欄上(shàng)的“測試決策流”按鈕來(lái)對目标決策流進行(xíng)測試,如下圖所示:
如的果我們測試時(shí)輸入項較多(duō),那(nà)麽用默認快速測試功能一個(gè)個(gè)添加就比較麻煩,為(wèi)此URule Pro專門(mén)提供了一種基于JSON數(shù)據的快速測試功能,點擊菜單項中的“基于JSON的快速測試”,在彈出的窗口中 可(kě)以在輸入項中把要輸入的JSON數(shù)據直接粘貼進去,同時(shí)選擇好相關的輸出對象即可(kě),如下圖所示:
點擊知識包菜單項中的“仿真測試”就可(kě)以對當前知識包進行(xíng)基于方案的複雜場(chǎng)景仿真測試,仿真測試有(yǒu)專門(mén)的章節介紹,這裏不再贅述,具體(tǐ)見知識包測試。
知識包測試完成後,就可(kě)以對其進行(xíng)發布,發布方式是通(tōng)過點擊工具欄上(shàng)的“發布知識包”按鈕完成,每次發布的知識包,都會(huì)以版本形式保存下來(lái),運行(xíng)時(shí)可(kě)以在已發布的知識包版本間(jiān)靈活切換。
綜合來(lái)看,在URule Pro當中調用規則的示意圖如下所示:
通(tōng)過URule Pro中的知識包,就可(kě)以将定義在XML中的業務規則編譯成具體(tǐ)的由Java對象構成的可(kě)執行(xíng)的對象,在實際的業務代碼當中,我們就可(kě)以通(tōng)過相關API獲取到這個(gè)知識包對象,插入相關業務數(shù)據并執行(xíng),從而獲取業務規則執行(xíng)結果。