可配置化代碼快速響應客戶需求
1. 項目背景
快速響應客戶需7求是企業成功的關鍵之一。在現代競爭激烈的市場中,客戶需求不斷變化,企業需要快速響應這些需求以保持競爭優勢。常見的快速響應并滿足客戶通常有如下方案:
采用敏捷開發方法:敏捷開發方法強調迭代、快速響應和持續改進,可以幫助開發團隊更快速地開發和交付軟件。
自動化測試和部署:自動化測試和部署可以幫助開發團隊更快速地檢測和解決問題,并將軟件快速部署到生產環境中。
使用現代化的開發工具和技術:使用現代化的開發工具和技術,如云計算、容器化、微服務等,可以幫助開發團隊更快速地開發和部署軟件。
靈活的軟件架構:采用靈活的軟件架構,可以幫助開發團隊更快速地進行功能擴展和改進。
以上方法是工程、基礎建設和架構設計等方面的最佳實踐,但是即便如此,開發的工作量也是以人/日計算,而且需要重新部署上線。有沒有一種不需要部署,只需要配置即可實現的設計和方法呢。
2. 預期目標
快速響應滿足客戶需求,快速開發上線,設計一個系統,使頻繁變更的需求,更改上線按小時級計算。一般一個需求,需要設計開發、測試、發布上線等流程,整個過程至少需要1-2天,而且頻繁上線,且發布上線一般要選擇在晚上,等用戶使用低峰期,因此我們希望能達到以下目標:預期實現從需求提出,到發布上線,按小時計算,可快速完成需求開發、上線、交付。
3. 技術選型
為了實現預期目標,筆者做了深入的技術調研,動態語言可以實現這一目標。動態語言可以實現熱加載,從而免去了部署的麻煩。熱加載是指在應用程序運行過程中,可以動態地加載新的代碼或修改已有代碼,而無需停止或重新啟動應用程序。
熱加載還可以帶來如下好處:
- 快速迭代:開發人員可以在運行時修改代碼,無需停止應用程序,從而快速迭代和測試新功能。
- 減少停機時間:熱加載可以減少停機時間,從而提高應用程序的可用性。
- 簡化部署:熱加載可以免去部署的麻煩,從而簡化部署和維護工作。
總的來說,熱加載可以提高開發效率、減少停機時間和簡化部署工作。
熱加載主要有如下實現方式:
1)使用JEXL動態執行表達式:
? 優點:可以動態執行Java代碼,調用Java Function(Function需先傳入JexlContext)
◆缺點:只能執行一個“表達式”,而不是Function,所以有很多語法局限,不是真正執行一個Function
2) 使用Java動態編譯:
? 優點:功能強大,能夠真正實現完整的動態執行功能,能夠動態調用全部系統功能和IO操作。
◆ 缺點:雖然功能強大,可以編譯.java文件,但是還是很難在運行時替換框架級的類文件。此外,因為能動態調用全部系統功能和IO操作,但與一般代碼環境沒有隔離,這可能會成為項目中非常嚴重的安全隱患。
3)使用Java ScriptEngine:
? 優點:可以執行完整的JS方法,并且獲取返回值;在虛擬的Context中執行,無法調用系統操作和IO操作,非常安全;可以有多種優化方式,可以預編譯,編譯后可以復用,效率接近原生Java;所有實現ScriptEngine接口的語言都可以使用,并不僅限于JS,如Groovy,Ruby等語言都可以動態執行。
◆ 缺點:無法調用系統和IO操作 ,也不能使用相關js庫,只能使用js的標準語法。
?在如何快速響應客戶需求,快速變化的技術選型時,我們先后對以上幾種技術進行了需求和技術調研分析得出如下:
1)JEXL動態執行表達式,功能簡單,支持有限,不滿足日常需求。
2)動態編碼需要熱部署與熱加載,這個在之前的單機時代還可以,現在是微服務,云服務的時代,大量機器熱部署和熱加載成本高昂且代價巨大。
3)ScriptEngine,可以動態的執行腳本語言,同時無法調用系統操作和IO操作,非常安全,這個給我們帶來了巨大的便利,我們選擇了 JavaScript 作為可以動態執行的腳本語言,主要還有以下原因:
JavaScript 足夠簡單和強大,可以滿足我們的需求。
JavaScript 作為互聯網時代的主流語言,為廣大技術人員必備技能,易于使用。
開發使用環境簡單,一個文本編輯器就可以寫代碼,一個瀏覽器就可以調試,非常方便。
以下是一個簡單的 Java ScriptEngine 示例:
在這個示例中,我們使用 ScriptEngineManager 創建了一個 JavaScript 的 ScriptEngine,并執行了一段簡單的 JavaScript 代碼,輸出了變量 z 的值。
除了執行 JavaScript 代碼,ScriptEngine 還可以將 Java 對象傳遞給 JavaScript 代碼,從而實現 Java 和 JavaScript 之間的數據交互。以下是一個示例:
例中,我們將 Java 對象 name 和 age 傳遞給了 JavaScript 代碼,并在 JavaScript 中輸出了一個字符串。
從以上示例可以看出,ScriptEngine功能強大,不僅支持簡單的計算,而且可以支持復雜的業務計算,完全可以滿足我們日常的需求開發。
4. 設計優勢
選定ScriptEngine后下一步是如何實現快速響應,實現日常需求。是否能實現片段代碼的可配置化,配置完后可以直接運行,免發布上線。是否有必要實現代碼的可配置化,可配置化主要有如下優勢:
可配置化代碼可以靈活、快速地響應客戶的需求。通過將軟件系統的各個模塊進行拆分,將其變成可配置的組件,然后根據客戶的需求,選擇合適的組件進行組合,就可以快速地定制出符合客戶需求的軟件系統。
可配置化代碼的優點在于它可以大大提高軟件開發的靈活性和效率。比如,當客戶提出新的需求時,只需要在已有的組件庫中選擇相應的組件進行組合,就可以快速地完成新功能的開發。這種方式大大縮短了軟件開發的周期,同時也降低了開發成本。
可配置化代碼還可以提高軟件系統的可維護性和可擴展性。由于各個模塊都是獨立的可配置組件,因此可以很容易地進行單獨的維護和升級。同時,由于組件是可配置的,因此可以很容易地進行擴展和替換,以適應不同的需求。
總之,可配置化代碼是一種非常靈活,高效的技術手段,可以幫助我們快速響應客戶需求,提高軟件開發效率和質量。
下面,筆者從汽車之家的幾個項目,實踐了代碼可配置化:
對接二手車經銷商車源數據,二手車經銷商車源數據格式各不相同,要求快速接入,快速上線展示。
導出車源信息到第三方網站展示,做推廣。第三方網站要求的格式也各異,而且導出格式也經常變化,如何快速響應變化,滿足客戶需求上線。
5. 系統設計
系統設計要考慮基于變和不變,變化頻度比較大的計算模塊通過JS腳本運行,不變的部分,即整體部分通過Java設計編寫,JS腳本可通過數據庫存儲,以方便進行更新。 每次將待運算的數據通過接口傳給程序,程序通過調用JS代碼計算,得出計算結果,存入數據庫,具體設計如下。
圖1 利用ScriptEngine 動態計算過程
6. 系統設計以及腳本的編寫
6.1腳本設計準則以及適用場景
當需要針對一個場景需求頻繁變化,規則隨時調整,上線要求時間短,有明顯的根據輸入參數,返回結果時,比較適合動態腳本的引入。
以筆者第一個項目庫存導入為例,其場景如下:
A. 經銷商會定期上傳庫存文件,各個經銷商的庫存文件格式各不相同。
B. 經銷商會不定時調整自己庫存的格式,比如增加一個字段、減少一個字段、字段格式變化等。
C. 整體汽車參數基本不變,能覆蓋所有經銷商提供庫存文件的格式。
7. 具體場景實施
此場景比較適合動態腳本解析庫存,以下是項目引用JS代碼片段截圖:
JS腳本保存數據庫,可以隨時動態靈活的新增,更新,避免上線。數據庫配置如下:
庫存導出的JS代碼片段:
庫存導出配置示例:
初始化ScriptEngine 引擎代碼如下:
調用JS代碼解析庫存示例代碼如下:
根據以上代碼截圖,以及流程圖,可以總結得出,整體流程如下:
1)建立經銷商賬號。
2)根據經銷商庫存文件編寫 JS 解析腳本,保存入數據庫。
3)根據經銷商的賬號,找經銷商配置的導入Rule (javascript 代碼)。
4)把經銷商傳入的庫存文件數據傳入 ScriptEngine 執行 JS 解析腳本,獲得標準庫存數據。
8. 實現效果和收益
1)庫存導入JS動態腳本上線后,庫存導入需求效率提高400%,由原來的 2人/日, 提高至 0.5人/日。
2)庫存導出JS動態腳本上線后,庫存導入需求效率提高600%,由原來的 3人/日, 提高至 0.5人/日。
3)在線評分系統JS動態腳本上線后,庫存導入需求效率提高600%,由原來的 3人/日, 提高至 0.5人/日。
4. 極大的提高了經銷商庫存接入,導出效率,和庫存導出效率,給客戶帶來了非常好的體驗。
9. 總結
以上是我們實踐中根據業務的實際需求,經過深入的調研和分析后做出的技術方案和實踐,并取得了很不錯的效果。這樣的場景以后還有很多,本文給快速響應客戶需求,高效完成實際工作提供一種思路和方法。相信隨著技術的發展也許會有更好的方案和技術,我們不斷探索,不斷追求進步,歡迎有興趣的同學一起探討和學習。
作者簡介
陳培鋒
■ 經銷商事業部-經銷商技術部-新產品技術團隊。
■ 2019年加入汽車之家,負責智慧診斷產品研發,熱衷于以客戶價值為本,解決客戶痛點,做給客戶帶來價值產品。