Java動態(tài)腳本&規(guī)則引擎、計算/表達(dá)式引擎

1. 常見的使用場景

在日常的Java項目中,我們免不了會遇到這樣的需求:

  1. 動態(tài)地獲取并運行自定義腳本文件,以實現(xiàn)特定的功能
  2. 對數(shù)據(jù)流執(zhí)行用戶自定義的數(shù)據(jù)有效性、公式計算、數(shù)據(jù)處理ETL(如數(shù)據(jù)截取、拼接)等不同業(yè)務(wù)邏輯
  3. 對用戶輸入的代碼或腳本文件進(jìn)行測試、運行,確保其語法正確、功能正常
  4. 處理需要靈活配置且不斷變更的動態(tài)業(yè)務(wù)規(guī)則
  5. 代碼的熱更新、熱修復(fù)

諸如此類的需求若采用硬編碼實現(xiàn),則迭代成本相當(dāng)高,每次改動都需要進(jìn)行開發(fā)、測試、部署。同時業(yè)務(wù)規(guī)則的頻繁變更會導(dǎo)致代碼的開發(fā)和維護(hù)成本大大提高。

2. Java動態(tài)腳本常見的實現(xiàn)方式

2.1 動態(tài)編譯執(zhí)行Java代碼

2.2 通過Java腳本引擎執(zhí)行不同類型的腳本

  • JavaScript

  • Groovy

  • Python

  • Lua

  • Ruby

  • Scala

以上腳本語言可根據(jù)項目實際需求、對不同腳本語言的掌握情況出發(fā)進(jìn)行選擇。

一般的需求可使用上述動態(tài)腳本實現(xiàn),如果遇到業(yè)務(wù)規(guī)則更為復(fù)雜、規(guī)模更大、對功能和性能有更高要求的需求時,可考慮更為專業(yè)的規(guī)則引擎和計算/表達(dá)式引擎。

3 進(jìn)階:規(guī)則引擎&計算/表達(dá)式引擎

3.1 規(guī)則引擎

規(guī)則引擎由推理引擎發(fā)展而來,是一種嵌入在應(yīng)用程序中的組件,實現(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 計算/表達(dá)式引擎

表達(dá)式(布爾組合)、特殊數(shù)學(xué)公式計算(高精度)、語法分析、腳本二次定制

  • Fel
  • OGNL
  • Mvel
  • SpEL
  • JEXL
  • JSEL
  • Aviator
  • Expression4j
  • QLExpress

4. 使用動態(tài)腳本及上述引擎的優(yōu)點

  • 邏輯和數(shù)據(jù)隔離
  • 可擴展性高
  • 可維護(hù)性高
  • 知識集中化
  • 提高業(yè)務(wù)靈活性
  • 業(yè)務(wù)透明度增強
  • 減少系統(tǒng)頻繁迭代升級風(fēng)險
  • 簡化系統(tǒng)架構(gòu)

5. 使用動態(tài)腳本常見的問題及解決方案

5.1. 安全問題

  • 提供常見的腳本文件供用戶選擇(系統(tǒng)提供的腳本文件更規(guī)范、更安全、性能更好)
  • 設(shè)置腳本編寫規(guī)范及模板
  • 對用戶提交的腳本做健康檢查(如對Thread、reflect、truncate等關(guān)鍵詞進(jìn)行檢查,做提示確認(rèn)或拒絕通過)
  • 對腳本進(jìn)行版本管理,可對腳本做回滾處理
  • 對腳本設(shè)置審核機制
  • 可根據(jù)實際情況考慮是否對用戶的腳本執(zhí)行進(jìn)行進(jìn)程或線程隔離

5.2 OOM問題

Java執(zhí)行動態(tài)腳本的過程往往會產(chǎn)生很多對象,而同一個腳本沒必要每次執(zhí)行時都去獲取、編譯、執(zhí)行。可設(shè)計緩存策略,對編譯后的腳本引擎進(jìn)行緩存,既可避免頻繁創(chuàng)建對象引起的內(nèi)存溢出問題,又可提高性能


  • 如果這篇文章對你有用的話,點個再走唄!
  • 如有問題,歡迎留言評論!
  • 歡迎轉(zhuǎn)載,煩請注明出處!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容