1 分層架構
分層架構是最常見的架構,也被稱為n層架構。多年以來,許多企業和公司都在他們的項目中使用這種架構,它已經幾乎成為事實標准,因此被大多數架構師、開發者和軟件設計者所熟知。
分層架構中的層次和組件是水平方向的分層,每層扮演應用程序中特定的角色。根據需求和軟件復雜度,我們可以設計N層,但大多數應用程序使用3-4層。有太多層的設計會很糟糕,將導致復雜度的上升,因為我們必須維護每一層。在傳統的分層架構中,分層包括 表現層、業務或者服務層,以及數據訪問層 。 表現層負責應用程序的用戶交互和用戶體驗(外觀和視覺)。通常我們會使用 數據傳輸對象(Data Transfer Object) 將數據帶到這一層,然后使用 視圖模型(View Model) 渲染到客戶端。業務層接收請求並執行業務規則。數據訪問層負責操作各種類型的數據庫,每個訪問數據庫的請求都要經過這一層。
分層無需知道其他層如何去做,比如業務層無需知道數據訪問層是如何查詢數據庫的,相反,業務層在調用數據層的特定方法時,只需關注需要部分數據還是全部數據。這就是我們所說的 關注點分離 。這是非常強大的功能,每層負責其所負的責任。
分層架構中的核心概念是管理依賴。如果我們使用依賴倒置原則和測試驅動開發(Test Driven Development),我們的架構會有更好的健壯性。因為,我們要保證所有可能的用例都有測試用例。
我們需要這樣的冗余,即使業務層沒有處理業務規則,也要通過業務層來調用數據層,這叫 分層隔離 。對於某些功能,如果我們從表現層直接訪問數據層,那么數據層后續的任何變動都將影響到業務層和表現層。
分層架構中的一個重要的概念就是分層的開閉原則。如果某層是關閉的,那么每個請求都要經過着一層。相反,如果該層是開放的,那么請求可以繞過這一層,直接到下一層。
分層隔離有利於降低整個應用程序的復雜度。某些功能並不需要經過每一層,這時我們需要根據開閉原則來簡化實現。
分層架構是SOLID原則的通用架構,當我們不確定哪種架構更合適的時候,分層架構將是一個很好的起點。我們需要注意防止架構陷入 污水池反模式 。這種反模式描述了請求經過分層,但沒做任何事或者只處理了很少的事。如果我們的請求經過所有分層而沒有做任何事,這就是 污水池反模式 的征兆。如果20%的請求只是經過各層,而80%的請求實際做事,這還好,如果這個比率不是這樣的,那么我們已經患上 反模式綜合征 。
此外,分層架構可以演變為 巨石應用(Monolith) ,導致代碼庫難以維護。
分層架構分析:
-
敏捷性 :總體敏捷性是指對不斷變化的環境作出反應的能力。由於其整體風格(Monolith)的性質,可能會變得難以應對通過所有層的變化,開發者需要注意依賴性和分層分離。
-
易於部署 :大型應用程序的部署會是個麻煩。一個小要求,可能需要部署整個應用程序。如果能做好持續交付,可能會有所幫助。
-
可測試性 :使用Mocking和Faking,每一層可以獨立測試,因此測試上很容易。
-
性能 :雖然分層應用程序可能表現良好,但是因為請求需要經過多個分層,可能會存在性能問題。
-
可伸縮性 :因為耦合太緊以及整體風格(Monolith)的天生特質,很難對分層應用程序進行伸縮。然而,如果分層能夠被構建為獨立的部署,還是可以具備伸縮能力的。但是,這樣做的代價可能很昂貴。
-
易於開發 :這種模式特別易於開發。許多企業采用這種模式。大多數開發者也都知道、了解,並且可以輕松學習如何使用它。
2 事件驅動架構
事件驅動架構(Event Driven Architecture)是一種流行的 分布式異步架構 模式,用於創建 可伸縮的應用程序 。這種模式是自適應的,可用於小規模或者大規模的應用程序。事件驅動架構可以與 調停者拓撲(Mediator Topology) 或者 代理者拓撲(Broker Topology) 一起使用。理解拓撲的差異,為應用程序選擇正確的拓撲是必不可少的。
調停者拓撲
調停者拓撲需要編排多種事件。比如在交易系統中,每個請求流程必須經過特定的步驟,如驗證、訂單、配送,以及通知買家等。在這些步驟中,有些可以手動完成,有些可以並行完成。
通常,架構主要包含4種組件,事件隊列(Event Queue)、調停者(Mediator)、事件通道(Event Channel)和事件處理器(Event Processor)。客戶端創建事件,並將其發送到事件隊列,調停者接收事件並將其傳遞給事件通道。事件通道將事件傳遞給事件處理器,事件最終由事件處理器處理完成。
事件調停者不會處理也不知道任何業務邏輯,它只編排事件。事件調停者知道每種事件類型的必要步驟。業務邏輯或者處理發生在事件處理器中,事件通道、消息隊列或者消息主題用於傳遞事件給事件處理器。事件處理器是自包含和獨立的,解耦於架構。理想情況下,每種事件處理器應只負責處理一種事件類型。
通常,企業服務總線、隊列或者集線器可以用作事件調停者。正確選擇技術和實現能夠降低風險。
代理者拓撲
不像調停者拓撲, 代理者拓撲 不使用任何集中的編排,而是在事件處理器之間使用簡單的隊列或者集線器,事件處理器知道處理事件的下一個事件處理器。
因其分布式和異步的性質, 事件驅動架構 的實現相對復雜。我們需要面對很多問題,比如網絡分區、調停者失敗、重新連接邏輯等。由於這是一個分布式且異步的模式,如果你需要事務,那就麻煩了,你得需要一個 事務協調器 。 分布式系統 中的事務非常難以管理,很難找到標准的工作單位模式。
另一個充滿挑戰的概念是契約。架構師聲稱服務的契約應該預先定義,而應變是非常昂貴的。
事件驅動架構分析:
-
敏捷性 :由於事件和事件處理器之間解耦,並且可獨立維護,因此這種模式的敏捷性很高。變化可以快速、輕松地完成,而不會影響整個系統。
-
易於部署 :由於架構是解耦的,因此很容易部署。組件可以獨立部署,並且可以在調停者上注冊。部署在代理者拓撲上也相當簡單。
-
可測試性 :雖然獨立測試組件很容易,但測試整個應用程序很有挑戰。因此端到端的測試是很難的。
-
性能 :事件驅動架構性能非常好,因為它是異步的。此外,事件通道和事件處理器可以並行工作,因為它們是解耦的。
-
可伸縮性 :事件驅動架構的伸縮性非常好,因為組件之間解耦,組件可以獨立擴展。
-
易於開發 :這種架構的開發不是很容易。需要明確定義契約,錯誤處理和重試機制得處理得當。
3 微內核架構
微內核架構(Microkernel architecture)模式也被稱為 插件架構(plugin architecture) 模式。這是產品型應用程序的理想模式,由兩部分組成: 核心系統 和插件模塊 。核心系統通常包含最小的業務邏輯,並確保能夠加載、卸載和運行應用所需的插件。許多操作系統使用這種模式,因此得名微內核。
插件彼此獨立,因此解偶。核心系統持有注冊器,插件將自己注冊其上,因此核心系統知道哪里可以找到它們以及如何運行它們。
這種模式非常適合桌面應用程序,但是也可以在Web應用程序中使用。事實上,許多不同的架構模式可以作為整個系統的一個插件。對於產品型應用程序來說,如果我們想將新特性和功能及時加入系統,微內核架構是一種不錯的選擇。
微內核架構分析:
-
敏捷性 :由於插件可以獨立開發並注冊到核心系統,微內核架構具有很高的敏捷性。
-
易於部署 :依賴於核心系統的實現,能做到不需要重新啟動整個系統來完成部署。
-
可測試性 :如果插件開發是獨立的,測試就可以獨立且隔離地進行。還可以Mock核心系統來測試插件。
-
性能 :這取決於我們有多少插件在運行,但性能可以調優。
-
可伸縮性 :如果整個系統被部署為單個單元,這個系統將難以擴展。
-
易於開發 :這種架構不容易開發。實現核心系統和注冊會很困難,而且插件契約和數據交換模型增加了難度。
4 微服務架構
盡管微服務的概念還相當新,但它確實已經快速地吸引了大量的眼球,以替代整體應用和面向服務架構(SOA)。其中的一個核心概念是具備高可伸縮性、易於部署和交付的獨立部署單元(Separately Deployable Units)。最重要的概念是包含業務邏輯和處理流程的服務組件(Service Component)。拿捏粒度設計服務組件是必要而具有挑戰性的工作。服務組件是解耦的、分布式的、彼此獨立的,並且可以使用已知協議來訪問。
微服務的發展是因為整體應用和面向服務應用程序的缺陷。整體應用程序通常包含緊耦合的層,難以部署和交付。比如,如果應用程序總在每次應對變化時垮掉,這是一個因耦合而產生的大問題。微服務將應用程序分解為多個部署單元,因此很容易提升開發和部署能力,以及可測性。雖然面向服務架構非常強大,具有異構連接和松耦合的特性,但是性價比不高。它很復雜、昂貴,難於理解和實現,通常對於大多數應用程序來說矯枉過正。微服務簡化了這種復雜性。
跨服務組件的代碼冗余是完全正常的。開發微服務時,為了受益於獨立的部署單元,以及更加容易的部署,我們可以違反DRY原則。其中的挑戰來自服務組件之間的契約,以及服務組件的可用性。
微服務架構分析:
-
敏捷性 :由於服務組件可以各自獨立開發,彼此沒有耦合,因此微服務架構具有很高的敏捷性。獨立部署單元能夠對變化作出迅速的反應。
-
易於部署 :相比其他的架構模式,微服務的優勢是服務組件即是單獨部署單元。
-
可測試性 :服務組件的測試可以獨自完成。微服務的可測試性很高。
-
性能 :依賴於服務組件和這種特定模式的分布式性質。
-
可伸縮性 :獨立部署單元天然具備很好的伸縮性。
-
易於開發 :每個服務組件可以各自獨立實現。
https://mp.weixin.qq.com/s?__biz=MzU0OTE4MzYzMw==&mid=2247484493&idx=1&sn=1f4433d08a42e8ea53a1c99545a57489&chksm=fbb28db3ccc504a5cb1d68f320865c62c0159574d65004e32912e80c61d2319d25d78fb07564&mpshare=1&scene=1&srcid=0224Maz4s6stgNgFihBAgFAW&key=819d0d70e718cb3683600c532ab633542d457009ef5350bbada96c2ec3fa5c28ff5707291f23d503a6dd69137ae867bea6d40099dc093b292bed02292a3106e64056ea4c6bdd2c9fcb2a5b18128cd272&ascene=0&uin=OTIwNjc0MTU%3D&devicetype=iMac+MacBookPro11%2C4+OSX+OSX+10.12.4+build(16E195)&version=12010110&nettype=WIFI&lang=zh_CN&fontScale=100&pass_ticket=tr9ThSjWvhTKVvoxS06JQ7ltNk%2BtCz60yYV5xG08%2F%2Bk%3D
