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