Web 應用程式的架構體系變遷

2021-12-25 21CTO

在過去的幾年裡,Web應用程式開發環境,包括客戶端(前端)以及伺服器端(後端)在不斷地發生變化。在客戶端側,我們已經有了很多優秀且新的JavaScript(或其它腳本語言)框架;而在伺服器端,我們有新的架構類型,如單頁應用程式、微服務、以及無伺服器體系架構。

此文是面向全棧開發者的系列文章,特別是來自伺服器端的內容,關於Web應用程式設計和開發的趨勢和最佳實踐。

我們一起來看伺服器端架構已經發生的變化。

剛剛的過去:傳統的N層架構

在過去的十年裡,網際網路已經成為提供內容和服務的首要平臺。因此,每個企業都需要走到線上,提供在線服務。這種需求的激增,使得開發人員採用N層架構方法來構建和部署應用程式。

N 層體系結構由多個獨立的層組成;每一層都代表著系統的不同關注點。從層次順序來看,大多數系統通常分為三個主要層:客戶端,伺服器和持久存儲層。

客戶端層是最終用戶看到並與之交互的內容,通常指的是瘦客戶端(如Web瀏覽器)或胖客戶端(比如完整的基於Java Swing / .NET的應用程式) 。

即使電源關閉, 持久存儲層也會保留重要數據,並且通常是基本的關係資料庫系統(如MySQL,Oracle或SQLServer)。

伺服器層位於客戶端和存儲層之間,是應用程式所有實際操作發生的地方。 由於在這個層中發生了這麼多事情,所以伺服器層通常被進一步分成多個子層:網絡,可用性和持久性。

伺服器Web層是應用程式在伺服器端的入口,負責處理用戶交互,將請求轉換為模型,渲染為動態用戶界面,會話管理和其它任務。 許多Java開發人員依靠諸如Spring MVC或Struts之類的框架來實現這一層。

伺服器業務層是業務邏輯作為組合和定義良好的API(應用程式編程接口 - 函數調用集合)實現的地方。 像EJB,.NET和Spring等技術用來實現這一層。

伺服器持久層負責通過對象關係映射(ORM)工具(如Hibernate,EclipseLink,Spring JDBC模板或其他ORM工具)抽取應用程式與存儲層特定關係資料庫的交互。

下圖描述了傳統的N層架構體系。

架構轉變#1:單頁應用的興起(SPA)

隨著Gmail和Facebook等產品的成功應用,開發者開啟了Ajax的新時代,整個網頁刷新的時代已經成為過去。

應用程式現在只需要根據需要請求必要的內容和信息片段(部分響應),以便用瘦客戶機創建高度交互式的用戶體驗。

以前只有使用胖客戶機才能實現這種體驗。 在客戶端執行此操作所需的額外邏輯並不是什麼新鮮事 - 它幾乎與以前在伺服器Web層中使用的相同。 我們基本上將Web層從伺服器移到客戶端(Web瀏覽器)。

然而,這種額外的客戶端邏輯帶來了新的挑戰和複雜性,例如必須處理大量的XML Http請求,並在比以往更深入的層次上理解Web瀏覽器的DOM對象(文檔對象模型)。 

為了處理這個額外的複雜性,許多新的基於JavaScript的框架出現以處理低級細節和例行操作。 有些框架有View層,有些則沒有; 有些提供了簡單的功能,有些是端到端的解決方案。 雖然看起來每隔一天都會有一個新框架出現,但好的框架都利用了以前在伺服器Web層成功使用的最佳實踐和模式,包括組件,MVC(模型,視圖和控制器),注釋,依賴注入,服務和通過接口的協議等。

由於Web層已從伺服器端移至客戶端層,因此在伺服器層中引入了新的精簡層,以便將現有的伺服器業務層直接公開給新的客戶端Web層。 這通常是使用自定義SOAP或REST API完成的。這些API的創建以及Web層布局的體系結構轉變為支持脫機支持等功能鋪平了道路。

但更重要的是,支持多種客戶端類型的能力,比如為iOS和Android應用程式以及桌面和移動Web界面提供支持的單一後端接口。

下圖描述了體系結構轉換:Web層從伺服器遷移到客戶端。

架構轉變#2:微服務的流行

將應用程式構建和部署為單個壓縮包的傳統方法是如何創建單個應用。而微服務是一種微型應用程式,只實現完整應用程式功能的一小部分。 微服務的目標是做一件事並做好這件事,並且可以使用幾乎任何技術棧來實現,不一定與其它服務棧相同。

有許多微服務增加了分布式管理,微服務間通信,身份驗證和授權,分布式日誌記錄和跟蹤,服務註冊和發現,反向代理和網關等方面的複雜性。有像Spring和Lagom這樣的框架可以通過大部分抽象為分布式。

雖然微服務是構建現代應用程式的新趨勢,但選擇設計和構建單一應用程式並不存在太大問題。 只要軟體可擴展性需求和需求仍在大規模變化,使用單一應用程式可以輕鬆地從單個代碼庫進行部署,管理與開發。

但是,當應用程式的功能增長、正常運行時間要求更快、可伸縮性需求非常高時,考慮重構或將應用程式設計為一組微型服務是明智的選擇。 微服務允許應用程式水平擴展並獨立更改,但這些好處不是免費的。 眾所周知,分布式應用程式難以監視,管理和測試。

下圖描述了微服務的流行。

架構轉變#3:無伺服器體系結構

無伺服器架構是我們最近常看到的流行詞彙。 我不想將它稱為Web應用程式架構的下一個迭代。現在更多的是一個有趣的想法。

這個概念很簡單:我們已經有了一個客戶端Web層 ,為什麼不重構後端,利用第三方託管服務來解決後端問題; 通過使用Lambda(或純函數),您的應用程式可以在第三方的雲基礎架構上執行任何所需的定製邏輯。 這與微服務的概念非常相似,但主要區別在於用戶並不擁有後端服務。不需要他來開發,管理運行的服務與硬體,從而使生活變得更簡單。

這種將所有跨領域關注(包括持久性數據)融入基礎架構的想法具有許多優點:

它將簡化分布式應用程式體系結構,但是還有一些問題需要解決,無伺服器體系結構成為主流還需要一些時間。 目前,無伺服器體系結構與幾年前的雲託管主機有些類似; 企業和客戶更關注云託管對數據隱私的威脅,還沒有看到它在基礎設施簡化方面的潛力。

下圖描述了無伺服器體系結構。

作者:Amit Rathi

編譯:高明

整理:21世紀技術官社區

 

相關焦點

  • 前端架構最全總結——GUI 應用程式架構的十年變遷:MVC、MVP、MVVM、Unidirectional、Clean
    筆者在日前總結的泛前端知識圖譜(Web/iOS/Android/RN) 一文中就對泛前端開發學習中可能會涉及到的知識點進行了總結與盤點,近日筆者打算為該知識圖譜編寫附帶的簡略說明,因此先對舊文 GUI 應用程式架構的十年變遷:MVC、MVP、MVVM、Unidirectional、Clean 進行了重製與補充,從屬於筆者的大前端開發技術相關倉庫,同樣向 Martin Fowler 及其撰寫的 GUI
  • 前端架構最全總結——GUI 應用程式架構的十年變遷:MVC、MVP、MVVM、Unidirectional、Clea
    筆者在日前總結的泛前端知識圖譜(Web/iOS/Android/RN) 一文中就對泛前端開發學習中可能會涉及到的知識點進行了總結與盤點,近日筆者打算為該知識圖譜編寫附帶的簡略說明,因此先對舊文 GUI 應用程式架構的十年變遷:MVC、MVP、MVVM、Unidirectional、Clean 進行了重製與補充,從屬於筆者的大前端開發技術相關倉庫,同樣向 Martin Fowler 及其撰寫的 GUI
  • 「無伺服器架構」無伺服器架構是應用程式的正確選擇?考慮利弊
    在無伺服器的web開發中,可以感知到的弱點在某種程度上得到彌補,這意味著它們不會拖累技術解決方案或業務案例,以達到優勢被削弱的程度?我們還將把無伺服器web開發的優缺點理論應用於示例應用程式。這將說明在何種情況下,serverless的優點和缺點的平衡使得它成為技術堆棧的最佳選擇,而在哪些情況下它可能不是最佳選擇。
  • 「Web應用架構」模式:前端的後端(BFF)
    面向用戶界面和外部方的單用途邊緣服務介紹隨著web的出現和成功,交付用戶界面的實際方式已經從厚客戶端應用程式轉變為通過web交付的界面
  • 軟體架構:分層體系架構
    分層架構與傳統的 IT 通訊和組織架構所匹配,所以它是很多業務應用開發的自然選擇。 在分層體系架構中,各組件被組織在若干個水平層內,每個層在應用程式中執行特定的角色(例如展示、業務邏輯等)。大多數分層結構由 4 層組成:展示層、業務層、持久層、資料庫。
  • JavaWeb程序架構模式的演進
    JavaWeb程序架構模式的演進老一輩的程式設計師一般都經歷了Web程序架構模式的演進,從最開始的在jsp或者jsp+Servlet上做開發,到後來的mvc、三層等。而現在有挺多人學完web,可能都沒怎麼使用過jsp或jsp+Servlet開發過項目,就直接學習使用Spring、Spring Boot或者SpringMVC等框架進行開發。
  • Java Web 應用程式解密與逆向工程實踐
    這可了不得了,而且你還不能再訪問生產機上的應用程式原始碼。 你要重新開始寫嗎?然後再考慮這些需求變更?也許可以不用。 這樣的事情真的可以發生,以下是我和團隊最近完成的逆向工程的實例。 面臨的挑戰 我們一直在用Java開發Web應用程式。
  • 架構變遷:企業正往ARM架構遷移
    架構變遷說到CPU架構,我們可能必然會提到CISC(複雜指令集,比如桌面端採用的X86系列)和RISC(精簡指令集,比如移動端廣泛採用的ARM系列)。過去,由於應用主要是跑在對功耗不敏感的X86架構CPU上,人們對該架構下的應用進行了大量的優化,ARM平臺的性能優勢並沒有充分的發揮出來。
  • 【推薦】Web API應用架構設計分析(1)
    Web API 是一種用於在 .NET Framework 上構建 RESTful 應用程式的理想平臺。本文主要以ASP.NET Web API 的框架實現來介紹整個Web API應用架構設計,但不局限於.NET的技術。
  • Google官方應用程式架構指南
    應用程式架構指南前言-移動應用用戶體驗在大多數情況下,App只有一個來自桌面或程序啟動器的入口點,然後作為單個整體進程運行。另一方面,Android應用程式具有更複雜的結構。Google推薦的應用架構在本文中,我們將演示如何使用 Android Jetpack Components 構建應用程式,方法是使用端到端的用例。注意:編寫最適合每種情況的應用程式是不可能的。話雖這麼說,這個推薦的架構是大多數情況和工作流程的良好起點。如果您已經有一種編寫遵循通用架構原則的 Android 應用程式的好方法,則無需更改它。
  • 可擴展Web架構與分布式系統
    1.1. web分布式系統的設計原則搭建和運營一個可伸縮的web站點或者應用程式意味著什麼?在原始層面上這僅僅是用戶通過網際網路連接到遠程資源-使系統變得可伸縮的部分是將資源、或者訪問的資源,分布於多個伺服器上。
  • Java Web應用程式初級知識
    原作者:Pankaj KumarWeb應用程式是用於創建動態網站。Java提供的Web應用程式通過servlets和JSP的支持。我們可以創建一個靜態HTML頁面的網站,但當我們想要的信息是動態的(和網站有交互),需要的Web應用程式。 本文的目的是提供Web應用程式的不同組件基本資料以及我們如何使用Servlet和JSP來創建我們的Java Web應用。
  • Flask Web Development —— 基本應用程式結構(上)
    同時你將編寫和運行你的第一個Flask web應用程式。1、初始化在這章,你將學到Flask應用程式的不同部分。同時,你將編寫和運行你的第一個Flask web應用程式。所有的Flask應用程式都必須創建一個 應用程式實例 。使用web伺服器網關接口協議將所有從客戶端接收的請求傳遞給這個對象處理。
  • 開篇之作:web程序開發簡介
    說到web程序開發,必須先來說說什麼是web應用程式。Web應用程式是網際網路的產物。網絡誕生以前,軟體程序只能部署在單機上。
  • 微服務架構體系
    做一些總結架構的演進這種東西有點信雅達,沒什麼絕對標準單體應用:在第一階段的單體應用很好理解。垂直應用:接著隨著業務量增大, 將應用拆成互不相干的幾個應用,Web框架(MVC) 是關鍵。分布式應用:垂直應用越來越多,應用之間交互不可避免,將核心業務抽取出來,作為獨立的服務。
  • 《ASP.NET Web程序設計》課程標準
    2.課程任務《ASP.NET Web程序設計》主要讓學生理解網絡應用程式體系結構和Http協議、學會創建ASP.NET web Forms程序,掌握ASP.NET的各種控制項的使用方法。通過學習本課程,學生具備在.NET平臺上熟練運用HTML、CSS、JavaScript、ASP.NET、ADO.NET、AJAX、三層架構等主流技術開發Web應用程式的能力。
  • 輕量型網際網路應用架構方式
    ,就繞不開微服務,當下(2019)最熱門的微服務架構體系應該還是 Spring Cloud 和 Dubbo,阿里也推出了自己的 Spring Cloud 實現 Spring Cloud Alibaba。
  • 如何手工滲透測試Web應用程式(一):入門
    世界上大多數公司都非常關注對web應用程式的手工測試,而不是運行web應用程式掃描器——因為它會限制你的知識和技能,影響在測試中尋找漏洞的視野。在整個系列文章中,我將使用下面的程序:    NOWASP Mutiliadae    BURP ProxyNOWASP MutiliadaeNOWASP Mutiliadae是一個包含了40多個漏洞的web應用程式。它包括OWASP的top 10漏洞,也有其它組織的列表中的漏洞。
  • WEB 應用程式技術基礎
    打卡二:P89-102前面的內容講了 web 應用的核心傳輸協議,協議是用戶與 web 應用的交互通道,而這幾頁的內容主要讓大家知道 web 應用是如何構成的,其中包含哪些組件,應用如何接受用戶的輸入等。
  • web架構和MVC架構
    關於B/S和C/S:管理軟體使用B/S架構,而遊戲因為要基於顯卡實現絢麗的效果所以使用C/S架構。因為B/S架構便於程序的維護、升級和修改,所以今後B/S還有很大的發展空間。但注意並不是說有瀏覽器的就一定是B/S架構,比如網頁上的小遊戲其實是C/S架構,只不過它是邊玩邊下載,B/S架構和C/S架構最本質的區別在於B/S是一種輕客戶端重伺服器的架構,它把所有的邏輯,頁面素材都放在伺服器上,瀏覽器上的所有東西都是從伺服器上下載下來的,所以說,並不是有瀏覽器的就是B/S架構,應該說滿足輕客戶端重伺服器的這種模式的就是B/S架構,再比如微信小程序雖然沒有瀏覽器,但它是一個B/S