1. 常見的使用場(chǎng)景
在日常的Java項(xiàng)目中,我們免不了會(huì)遇到這樣的需求:
- 動(dòng)態(tài)地獲取并運(yùn)行自定義腳本文件,以實(shí)現(xiàn)特定的功能
- 對(duì)數(shù)據(jù)流執(zhí)行用戶自定義的數(shù)據(jù)有效性、公式計(jì)算、數(shù)據(jù)處理ETL(如數(shù)據(jù)截取、拼接)等不同業(yè)務(wù)邏輯
- 對(duì)用戶輸入的代碼或腳本文件進(jìn)行測(cè)試、運(yùn)行,確保其語法正確、功能正常
- 處理需要靈活配置且不斷變更的動(dòng)態(tài)業(yè)務(wù)規(guī)則
- 代碼的熱更新、熱修復(fù)
諸如此類的需求若采用硬編碼實(shí)現(xiàn),則迭代成本相當(dāng)高,每次改動(dòng)都需要進(jìn)行開發(fā)、測(cè)試、部署。同時(shí)業(yè)務(wù)規(guī)則的頻繁變更會(huì)導(dǎo)致代碼的開發(fā)和維護(hù)成本大大提高。
2. Java動(dòng)態(tài)腳本常見的實(shí)現(xiàn)方式
2.1 動(dòng)態(tài)編譯執(zhí)行Java代碼
2.2 通過Java腳本引擎執(zhí)行不同類型的腳本
-
JavaScript
-
Groovy
-
Python
-
Lua
-
Ruby
-
Scala
以上腳本語言可根據(jù)項(xiàng)目實(shí)際需求、對(duì)不同腳本語言的掌握情況出發(fā)進(jìn)行選擇。
一般的需求可使用上述動(dòng)態(tài)腳本實(shí)現(xiàn),如果遇到業(yè)務(wù)規(guī)則更為復(fù)雜、規(guī)模更大、對(duì)功能和性能有更高要求的需求時(shí),可考慮更為專業(yè)的規(guī)則引擎和計(jì)算/表達(dá)式引擎。
3 進(jìn)階:規(guī)則引擎&計(jì)算/表達(dá)式引擎
3.1 規(guī)則引擎
規(guī)則引擎由推理引擎發(fā)展而來,是一種嵌入在應(yīng)用程序中的組件,實(shí)現(xiàn)了將業(yè)務(wù)決策從應(yīng)用程序代碼中分離出來,并使用預(yù)定義的語義模塊編寫業(yè)務(wù)決策。接受數(shù)據(jù)輸入,解釋業(yè)務(wù)規(guī)則,并根據(jù)業(yè)務(wù)規(guī)則做出業(yè)務(wù)決策。
分離商業(yè)決策者的商業(yè)決策邏輯和應(yīng)用開發(fā)者的技術(shù)決策
- Drools (推薦)
- OpenRules
- EasyRules
- OpenL Tablets
- RuleBook
- Esper
3.2 計(jì)算/表達(dá)式引擎
表達(dá)式(布爾組合)、特殊數(shù)學(xué)公式計(jì)算(高精度)、語法分析、腳本二次定制文章來源:http://www.zghlxwxcb.cn/news/detail-426530.html
- Fel
- OGNL
- Mvel
- SpEL
- JEXL
- JSEL
- Aviator
- Expression4j
- QLExpress
4. 使用動(dòng)態(tài)腳本及上述引擎的優(yōu)點(diǎn)
- 邏輯和數(shù)據(jù)隔離
- 可擴(kuò)展性高
- 可維護(hù)性高
- 知識(shí)集中化
- 提高業(yè)務(wù)靈活性
- 業(yè)務(wù)透明度增強(qiáng)
- 減少系統(tǒng)頻繁迭代升級(jí)風(fēng)險(xiǎn)
- 簡(jiǎn)化系統(tǒng)架構(gòu)
5. 使用動(dòng)態(tài)腳本常見的問題及解決方案
5.1. 安全問題
- 提供常見的腳本文件供用戶選擇(系統(tǒng)提供的腳本文件更規(guī)范、更安全、性能更好)
- 設(shè)置腳本編寫規(guī)范及模板
- 對(duì)用戶提交的腳本做健康檢查(如對(duì)
Thread
、reflect
、truncate
等關(guān)鍵詞進(jìn)行檢查,做提示確認(rèn)或拒絕通過) - 對(duì)腳本進(jìn)行版本管理,可對(duì)腳本做回滾處理
- 對(duì)腳本設(shè)置審核機(jī)制
- 可根據(jù)實(shí)際情況考慮是否對(duì)用戶的腳本執(zhí)行進(jìn)行進(jìn)程或線程隔離
5.2 OOM問題
Java執(zhí)行動(dòng)態(tài)腳本的過程往往會(huì)產(chǎn)生很多對(duì)象,而同一個(gè)腳本沒必要每次執(zhí)行時(shí)都去獲取、編譯、執(zhí)行??稍O(shè)計(jì)緩存策略,對(duì)編譯后的腳本引擎進(jìn)行緩存,既可避免頻繁創(chuàng)建對(duì)象引起的內(nèi)存溢出問題,又可提高性能文章來源地址http://www.zghlxwxcb.cn/news/detail-426530.html
- 如果這篇文章對(duì)你有用的話,點(diǎn)個(gè)贊再走唄!
- 如有問題,歡迎留言評(píng)論!
- 歡迎轉(zhuǎn)載,煩請(qǐng)注明出處!
到了這里,關(guān)于Java動(dòng)態(tài)腳本&規(guī)則引擎、計(jì)算/表達(dá)式引擎的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!