SOA 與 MVC - 何時使用
我已經閱讀了這個主題,但仍然沒有完整的圖片,我非常感謝您對下一個問題的回答:
- 對於什麼類型的應用程序應該使用SOA 方法(從伺服器端獲取 JSON 並使用 javascript 框架在客戶端生成 html,如 Knockout js、angular js 等),以及伺服器端的ASP.net MVC - 類似替代方案架構方法(完全在伺服器端生成頁面並返回視圖作為結果)。
例如,對於最後一個具有豐富客戶端邏輯的 SPA,wcf 服務 + 淘汰 js(客戶端 MVVM)提供了很好的結果。但是哪種方法更適合 CRUD 應用程序(例如,用於添加、更新具有不同使用者角色的數據的多個表)。
SOA 不僅僅是將 JSON 發送到 Web 客戶端。
想像一下,您的企業擁有一個數據庫驅動的軟體系統,用於銷售、庫存、報告等。大多數係統開始時都很小,只有一個客戶端或 Web 應用程序直接與數據庫對話……這沒關係。
但是,隨著系統的增長,您會發現有些東西不適合此模型:鎖定應用程序或網頁的長時間執行的批處理,不僅涉及數據庫伺服器的計劃作業,涉及生活在外部來源中的數據的過程,或在執行時使您的數據庫陷入困境的複雜報告。
此時,您需要考慮添加一個應用程序伺服器來處理其中一些任務。應用程序伺服器可以減輕您的客戶端的部分工作負載。它還可以減輕此時可能是過度工作的數據庫的某些負載,例如應用程序伺服器請求或將原始數據移入和移出數據庫,以及面向使用者的客戶端請求/送出轉換後的數據到和從應用伺服器。
隨著系統的進一步發展,您還會發現系統的不同部分在您維護事物時會在其他地方產生意想不到的副作用。即使是簡單的增強功能也變得越來越難以完成。開發速度放緩,錯誤數量增加。應用程序伺服器現在成為一個很好的地方,可以集中設計工作,以確保一個領域的變化在其他地方產生預期的後果(並且只有預期的後果)。
起初,SOA 的真正含義是採用該應用程序伺服器(它可能碰巧使用 json over http,但也可能提供完全不同的介面,甚至在幾種數據傳輸技術之間自動轉換)並強制執行all,而不是只是一些,數據庫訪問通過這個應用伺服器:服務層。
一旦強制執行此訪問,並且不再與數據庫直接對話(至少,沒有特別說明的),該層也成為開始執行業務規則和系統邏輯的好地方。它允許您在這裡編寫傳統的應用程序風格的程式碼,這些程式碼比 sql 更易於使用原始碼控制,並且將自動在使用系統的任何應用程序之間共享。程式碼都在同一個地方,因此更容易通過系統對更改及其影響進行建模。
作為獎勵,這一層通常很容易擴展到多個冗餘伺服器,尤其是與傳統的關係數據庫伺服器相比。結果是擴展應用程序伺服器可以成為改進和管理大型應用程序的性能和可靠性的一種方式。在後端,它還可以通過簡化和集中使用 Redis 等數據庫記憶體工具的工作來提高性能,使專門的 DBA 更容易參與性能調整,並幫助您集中訪問位於多個位置的數據。
此時,您的 MVC 網站只是一個連接到 SOA 系統中的應用程序伺服器的應用程序。您可能還在某些桌面上安裝了舊的客戶端-伺服器應用程序,或者您的 MVC 應用程序可能面向公成本售,而實際銷售和支持代表使用完全不同的東西,計費使用不同的應用程序,訂單履行或採購有另一個界面…但它們都與同一個服務層通信。這裡的另一個優勢是該服務層可以更輕鬆地從多個來源提取數據,因此如果您的製造系統需要來自外部系統的材料可用性資訊,則服務層可以知道如何找到它而前端程式碼不需要不必知道這些數據來自任何特殊的地方。
所有這一切的重點是它不是非此即彼的情況。如果您有 SOA,您可以在系統的某一層使用 MVC,SOA 的服務層提供的介面將決定您的 MVC 模型的一些外觀以及控制器的行為方式。如果您沒有 SOA,MVC 恰好可以很好地建構從數據庫到表示的整個堆棧,並且實際上可以使模型成為更大服務層的縮影。
那麼,何時使用 JSON 與何時使用 ASP.Net MVC 的問題呈現出一種新的形式。ASP.Net MVC 可以是 SOA 架構的一部分,提供 JSON 數據的服務框架通常使用客戶端 MVC 庫來實現。*你真的想知道什麼時候在客戶端做更多的事情比在伺服器端做更多的事情更合適。*老實說,我認為這主要是個人喜好,但是您應該注意一些權衡。
在客戶端做更多的工作可以極大地提高性能和可擴展性,因為它將應用程序的一些工作負載分散到使用者的電腦系統中,並且可以減少由於往返 Web 伺服器或應用程序伺服器而引入的延遲。
另一方面,在伺服器端做更多的工作有利於避免通過較慢的公共網際網路連結傳輸更大的數據集時的延遲,可以更容易滿足美國殘疾人法案可訪問性要求等合規性要求,其中過多的 javascript 可能會導致可訪問的瀏覽器或將數據推送到客戶端系統的問題可能會構成隱私或安全風險,並且當更多的處理髮生在同一層內時,可以更容易地開發、部署和維護新程式碼。