基於事件驅動的組件架構

来源:https://www.cnblogs.com/javashop-docs/archive/2019/09/06/11476994.html
-Advertisement-
Play Games

本架構主要目的是改進軟體開發中松耦合、增加模塊的重用性、提高開發效率。 在常規的模塊間方法直接調用式開發中,新增的功能對原有模塊代碼的穩定性、重用性破壞大,不利於軟體的後期維護,且開發效率低。 另外,在傳統的軟體開發方法中,如果新增的功能的邏輯在其它模塊需要重覆使用,則只能通過copy代碼或方法調用 ...


本架構主要目的是改進軟體開發中松耦合、增加模塊的重用性、提高開發效率。

在常規的模塊間方法直接調用式開發中,新增的功能對原有模塊代碼的穩定性、重用性破壞大,不利於軟體的後期維護,且開發效率低。

另外,在傳統的軟體開發方法中,如果新增的功能的邏輯在其它模塊需要重覆使用,則只能通過copy代碼或方法調用的方式來重用,還是需要改動原代碼。
通過本技術方案,可以將一些功能抽像為組件,這些組件可以被動態的插入的現有模塊中,不需要改動原有模塊代碼,從而增加了重用性,提高了開發效率。

技術解決方案

A. 相關概念抽像及定義

首先在軟體的業務模塊中抽像出核心業務邏輯(Core Service)及核心業務數據(Core Data Model),同時抽像出核心業務邏輯相對應的事件介面(Event Interface)。
在核心業務之外的業務被稱之為組件(Component),組件是由一組業務插件(Plugin)組成的,這些插件是一個或多個核心業務的事件的實現體,核心業務和事件的關聯,

是通過插件樁(Plugin Bundle)收集起來的,具體的關聯關係是在一個名為Component.xml(組件描述文件)中定義的。

 

B. 組件的開發


當需要在核心業務邏輯中插入新的邏輯時,需要定義出相應的插件,使插件實現相應的業務事件介面,在插件中實現具體業務邏輯代碼,其需要的核心業務數據會通過事件介面做為參數傳遞過來,這樣插件就可以無入侵式的操作核心業務數據了。

 

 

C. 組件的載入和啟動


首先組件有以下狀態:安裝狀態和啟動狀態,分別為已安裝和未安裝,已啟動和未啟動。
當系統啟動時,組件載入模塊查找所有的Component.xml,並解析出插件和核心業務的關聯關係,並將這種關係通過組件視圖(Component View)記錄在記憶體中。
在載入過程中,檢測數據中是否有此組件的記錄,如果沒有則在數據中記錄,此時組件的狀態被標記為未安裝、未啟動。如果資料庫中已經存在則檢測其狀態,如果是已啟動狀態,則將此組件啟動,並標記為已啟動狀態。
在系統的控制臺中展示組件的列表,並提供操作按鈕,可以執行以下操作:安裝/卸載、啟動/停用。
綜上所述,組件被啟動可能通過兩種途徑:系統載入時或在控制臺中手動啟動。組件被啟動後,根據組件視圖中記錄的關係將插件和插件樁進行關係綁定,即將插件動態插入到插件樁中,即完成業務邏輯動態地、無侵入式地插入到核心業務邏輯中。

D. 插件調用邏輯說明


在軟體運行中,當核心業務邏輯被調用的同時調用事件介面,同時向介面傳遞核心業務數據,這個過程被稱為事件激發。
當事件激時,插件樁里已經收集了相應的插件集合(事件的實現體),進而在插件樁中一個個的調用插件,傳遞核心數據,這樣插件被執行。

 

方案的效果


通過上述組件的技術方案,可以實現對原系統無侵入式的、松耦合式的開發,開發人員無需關係核心代碼細節,只要瞭解事件介面就可以完成對核心業務的擴展,開發效率高、重用性高。
效果舉例:以電子商務系統為例,在一個電商業務中創建訂單是核心的業務邏輯,在訂單創建成功後,可能需要發送一條手機簡訊給顧客, 基於此種組件方案,開發人員需要開發一款基於某個電信網關的簡訊發送組件。開發人員不必瞭解訂單創建的具體代碼,只需關心如何跟電信網關對接即可,組件機制會將訂單信息、顧客手機號等核心數據通過訂單的創建事件傳遞給插件,插件拿到上述數據, 根據具體接入的電信網關參數,將核心數據(訂單信息、顧客手機號)組織好文字,傳遞給電信網關就完成了通過此簡訊網關發送訂單簡訊的功能。
一旦業務發生變更,比如要更換其它簡訊網關發送簡訊,此時再根據具體的網關參數開發另一款簡訊組件,然後停用之前的簡訊組件,安裝上新的組件即可。
可以看出,從功能開發,到後期的變更維護,訂單創建的核心業務代碼從未暴露給組件開發人員,他們也不需要去改動核心代碼,保持了原有系統的穩定性,降低了新功能開發的難度,而且基於同樣規則的系統都可以安裝此簡訊組件,直接使用,極大的降低了開發成本。

 

 

實際應用

 

 我們以本架構在javashop電商系統中的應用案例說明:

一、訂單的創建和簡訊發送

A. 訂單核心業務

 

 

 

 


1.訂單核心業務(OrderService)
負責訂單的創建,這屬於電商業務的核心,通過createOrder()方法創建訂單。

2.訂單插件樁(OrderPluginBundle)
在其pluginList屬性中存儲了所有響應訂單業務事件的插件。

3.訂單創建介面
訂在訂單創建成功後,會激發此事件,而實際調用的是上述pluginList中的插件。
B. 組件的組成

 

 

 

 

如上圖所示,訂單簡訊組件由以下內容:
1. 訂單簡訊組件(OrderSmsComponent)
訂單組件類,在組件被安裝時會調用其install方法,完成一些安裝必要的操作。

2. 訂單簡訊插件
此類實現了訂單創建事件,響應了訂單完成事件(onOrderCreate)方法,當訂單創建完成時,會調用此方法。

3. 組件的描述文件Component.xml
此描述文件定義了訂單插件(OrderSmsPlugin)要註入到訂單插件樁中,即定義了插件要對應的核心業務


C. 組件載入、啟動過程

 

 

組件的載入、啟動過程細節如下:
當系統啟動時,組件載入模塊查找所有的,並解析出插件和核心業務的關聯關係,並將這種關係通過組件視圖記錄在記憶體中。
在載入過程中,檢測數據中是否有此組件的記錄,如果沒有則在數據中記錄,此時組件的狀態被標記為未安裝、未啟動。如果資料庫中已經存在則檢測其狀態,如果是已啟動狀態,則將此組件啟動。
組件啟動首先將插件註入到相應的插件樁中,此時當事件被激發時,通過插件樁就可以調用到實現了此事件的所有插件了。組織好插件的關係後,將此組件在資料庫中標記為已啟動。

D. 事件激發及插件調用

 

 


如上圖所示,描述了事件激發和插件調用的過程,具體技術實施細節如下:
在這裡迴圈所有的訂單創建事件調用之(激發事件介面),這些事件實際是被註入進來的、具體的插件實現體,比如訂單簡訊插件,此時訂單簡訊插件被動態調用,在此插件中完成發送簡訊的邏輯。

通過上述架構的實施,可以達到如下效果: 

現在簡訊的廠商眾多,我們分別為其實現“簡訊發送插件”,這對於“訂單核心邏輯”代碼是不需要改動的,

一方面提升了核心代碼的穩定,一方面增加可對“新簡訊廠商”的擴展性。

 

後記

通過這種組件架構,其實在電商架構領域中還有很多模塊可以採用組件式的架構,以javashop電商系統中的應用為例:

支付組件

訂單的支付為核心邏輯,他來處理狀態改變,記錄日誌等。

通過調用支付插件來完成具體的支付操作,傳遞的是支付金額,訂單號核心標準數據。

而支付插件可以多種實現:支付寶、微信、銀聯等等。

這樣增強了訂單核心的穩定,提高了支付方式的擴展性

 

物流查詢

查詢動作和展示是核心,傳遞給插件“物流公司”,“物流單號”核心標準數據

物流查詢有多種插件實現:kuaidi100,showapi,菜鳥等等。

同樣增強了訂單核心的穩定,提高了物流查詢廠商的擴展性

 

圖片存儲

圖片都上傳和顯示是核心,傳遞給插件圖片流是核心標準數據

圖片的存儲有多種插件實現:如阿裡oss,七牛、又拍等等。

同樣增強了系統核心的穩定,提高了圖片存儲廠商的擴展性

 

其實還有很多邏輯可以採用這種思路,提高穩定性,提高擴展性,在這裡就不一一列舉

這需要對自己的系統功能進行分析抽象,抽象出核心邏輯、插件介面標準、標準數據。

易族智匯(javashop)原創文章

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • (馬蜂窩技術原創內容,公眾號 ID:mfwtech) 一份來自 Akamai 的研究報告顯示,在對 1048 名網購戶進行採訪後發現: 約 47% 的用戶期望他們的頁面在兩秒之內載入完成。 如果頁面載入時間超過 3s,約 40% 的用戶會選擇離開或關閉頁面。 約 47% 的用戶期望他們的頁面在兩秒之 ...
  • Vuex 是一個專為 Vue.js 應用程式開發的狀態管理模式,它採用集中式存儲管理應用的所有組件的狀態,註意:使用前需要先載入vue文件才可以使用(在node.js下需要使用Vue.use(Vuex)來安裝vuex插件,在瀏覽器環境下直接載入即可,vuex會自行安裝) vuex的使用方法很簡單,首 ...
  • 在項目中常常需要用級聯地址,為了實現這個功能,大家肯定會瘋狂得找插件快速實現,但是博主就喜歡使用純js來實現。 首先建立一個二維數組,第一列存省,第二列存城市並用分隔符分隔 建立兩個一維數組,一個存省,一個存城市 創建兩個初始變數,一個存當前選中得省,一個存當前選中得城市 給省的select選擇框添 ...
  • 先貼一張圖片做個例子 看不清圖片的朋友可以右鍵圖片,在<新標簽頁中打開圖片>; 可以看到,由於內容過長,導致後面操作的增刪改要拉到最後才能操作. 在我們的FastAdmin中,目前我還沒找到可以調整列表大小的文檔,如果有,歡迎大家告知.下麵是我用來解決這個問題的方法 我們可以在生成的頁面好添加兩段代 ...
  • 1 2 3 4 5 Document 6 13 21 22 23 24 25 ...
  • 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Document</title> 6 <style type="text/css"> 7 #div1{ 8 width: 200px; 9 ... ...
  • 上一篇我們主要講解了函數的執行過程和原理,本篇我們將介紹函數的另外兩個特殊表現:閉包和立即執行函數。 一 閉包 1, 閉包的形成 之前我們提到,函數執行完畢,馬上就會銷毀自己的AO對象。但是如果遇到下麵這種情況:有子函數的定義,並將子函數返回。它真的就完全銷毀了自己的AO對象嗎? 這將列印什麼呢?表 ...
  • extend是jQuery中一個比較核心的代碼,如果有查看jQuery的源碼的話,就會發現jQuery在多處調用了extend方法。 作用 1. 對任意對象進行擴展 2. 擴展某個實例對象 3. 對jquery本身的實例方法進行擴展 實現 基礎版本, 對簡單對象進行擴展 jQuery.prototy ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...