架構模式之分層架構總結

背景

一個問題,我們要把它搞清楚。需要深入的思考,從演進出發,從核心出發,探索它的本質。這樣才能在工作中舉一反三。探索本質的思想,對於架構者來說尤其重要。本文想探討架構模式之分層設計的本質和核心。以便於更好的將正確的方式應用到項目中。

爲什麼分層

三層架構,多層架構我們聽到的很多,那有沒有考慮過爲什麼需要分層呢?不分不是更簡單更方便嗎,何必大費周折搞出一個分層架構?

舉一個例子,如果我們開一個飯店,一個人把採購,炒菜,上菜全部做了,一個月也有不錯的收入。只是會比較忙,很辛苦。因爲自己的能力畢竟有限,有時候也會把事情搞錯,再比如哪天生病了,生意就沒法做了。當人多了的時候就忙不過來了,大批的顧客就會跑到別人的飯店。這時候,我們就會考慮僱人,人多了就會考慮分工的問題,有的負責採購,有的負責炒菜,有的負責上菜,這樣實際分層就產生了。

分層本質是解耦和分類,解決職責不清的耦合問題,解決職責過大不利於發展的問題,在分層的基礎上爲團隊分工和協作提供了依據。

分層的好處

1、  隔離業務複雜度和技術複雜度,可獨立變化發展

2、  職責清晰,減少耦合,提高複用性,可維護性,擴展性(部分)

3、  有利於團隊分工協作

分層的不足

1、  代碼理解的複雜度高了

2、  性能低了,原本一次完成的事情,需要調多層實現

3、  管理成本高了,需要考慮每層的邊界,代碼結構和團隊情況

如何分層

         分層設計也是一種抽象的思想,每層代表一個關注點,多層之間的協作實現了整個調用鏈路。

1、  基於職責(關注點)不同進行分層

2、  基於變化的程度進行分層

3、  同一抽象層次的組件放在同一層

分層中的設計思想

如果用一句話描述的話,個人理解的就是高內聚,松耦合。展開講的話有以下幾點

1、  單一職責原則,分離關注點,每個層的職責是單一的,只做一類事情;

2、  開閉原則:隔離變化,對擴展開放,對修改關閉;

3、  依賴倒置原則:基於接口(抽象)編程,層與層之間的調用都應該依賴抽象而不是具體。

分層的方式

         一般講的都是邏輯分層,實際也存在物理層面進行分層。

物理分層(Tier**)**

主要從物理元素切入,個人理解從物理層面有兩類,一類從部署的角度考慮,一類從項目結構角度。

從部署角度考慮,典型的 J2EE N Tire 架構,如下圖:

大型分佈式系統的分層(簡化版),如下:

從項目結構考慮(很少有人這麼講)1、項目的分包結構;2、maven 中的父子項目。

邏輯分層(Layer**)**

         大家常見的分層方式,典型的有三層,四層,七層,如下。

其中三層和四層從結構上看相差不大,主要是在三層數據訪問層的基礎上,擴展瞭如服務,設備等的調用。但是從架構層面,已經有比較大的改進。

一個架構設計到這個程度就可以了嗎?遠遠不夠,下一步需要對分層架構進行細化。

分層詳解

在做設計的時候,需要將每一個組件,每一個角色落地,讓各個參與者都能清楚,明白。以四層架構爲例,詳細介紹每層的關注點和設計。

1、  明確各層的關注點和職責。

(1)       表現層

關注點:用戶交互和頁面渲染

職責:接收用戶輸入,調用業務邏輯層,接收業務邏輯返回實現頁面渲染。

(2)       業務邏輯層

關注點:領域模型和業務邏輯

職責:系統的核心部分,實現業務邏輯和業務規則,實現事務控制,調用資源訪問層;

(3)       資源整合層:

關注點:各類資源的調用和隔離

職責:整合數據訪問(讀寫),整合外部接口,整合設備交互。

2、  明確各層的設計(代碼級)

    上圖已經把代碼層面的組件畫出來了,按照這個方案就可以進行開發了。

(1)VO,BO,Entity 可以使用同一套實體類也可以分開,比較推薦的做法是 VO 和 BO 使用一套,Entity 使用一套。

(2)業務邏輯層:抽象了 Logic 接口,用於定義每個服務方法的步驟,該部分會有一些通用的 Logic 用於多個服務方法複用。Service 會調用具體的 Logic 實現邏輯邏輯,達到了最大程度的解耦和複用。

(3)業務邏輯層:對於 Logic 內複用的,可以下沉到 Manager 中。

(4)業務邏輯層:還可以在 Servide 的基礎上封裝一層 Façade,用於聚合多個 Servie 方法的調用。

(5)資源整合層:包含傳統的數據庫訪問層結構和,調用接口的實現。調用接口使用代理模式實現,隔離了外部差異。複雜的話,可以考慮使用策略 + 適配器的方式。

3、  層之間的調用關係

    標準的調用是嚴格按照上次調用下層的順序,實際也可以跨層調用(根據團隊規範,約定好)。但是,應避免循環調用。

物理分層與邏輯分層的關係

邏輯架構會以不同的方式,表現到物理架構中。拿分層來講,常見的方式有全部邏輯分層一起部署,邏輯分層部分分開部署和邏輯分層完全分開部署。分開部署後會涉及到 RPC 調用和服務高可用等問題。

文章總結

         分層架構是項目中用到的最多的架構模式之一,核心思想是歸類和解耦,實現有多種方式,不應侷限於三層,四層,也可能是兩層,五層,六層,具體以實際的項目爲準。

          本文希望由淺入深的介紹分層相關的知識,使大家不僅知道分層,還知道爲什麼分,怎麼分。從概念到落地是架構師必須跨過的一道坎。通過了這個坎就可以將架構知識靈活的運用到項目中,實現能力的昇華,成爲真正的架構師。

           實際每一層還會有一些變化,不同的設計模式和架構模式實現的分層和代碼的組織方式也是不同的,沒有完全一樣的架構,合適的就是最好的。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/btvV_xqBUNfRWMoflKYjuA