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