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