計算機科學家David Wheele曾說過這麼一句話:redis
All problems in computer science can be solved by another level of indirection 意思是:「 計算機科學領域的任何問題均可以經過增長一個間接的中間層來解決」。緩存
這也是CS架構和分層架構的核心思想!服務器
將CS架構和分層架構放在一塊兒討論除了上面的緣由以外,還有以下幾個緣由:網絡
- CS架構和分層架構是使用很頻繁的兩種架構風格
- CS架構和分層架構通常都會結合使用
- CS架構中的2-tier,3-tier,N-tier與分層架構容易混淆,畢竟Tier和Layer都翻譯爲「層」
本文將探討以下幾個問題:架構
- CS架構風格的約束
- CS架構風格對架構屬性的影響
- 2-tier,3-tier,N-tier架構模式
- 分層架構風格的約束
- 分層架構風格對架構屬性的影響
- Tier和Layer的區別「爲何兩層架構(2-tier)、三層架構(3-tier)、N層架構(N-tier)是CS架構風格的具體體現,而不是分層(Layer)架構風格的具體體現?!」
- CS架構風格和分層架構風格適用哪些場景
CS架構風格的約束
- Server組件提供了一組服務,並監聽對這些服務的請求,
- Client組件經過一個鏈接器將請求發送到Server,但願執行一個服務,
- Server能夠拒絕這個請求,也能夠執行這個請求並將響應發送回Client。
CS架構風格最簡單的實現就是2-tier!即兩層架構模式。好比SSH,FTP就是兩層架構。以FTP來講:ide
- 遠程有一個FTP文件服務器
- 咱們須要使用FTP客戶端去鏈接那個文件服務器
- 若是用戶名密碼錯誤,服務器會拒絕鏈接
- 鏈接上之後,客戶端能夠下載或上傳文件到服務端
最經常使用的CS架構風格的實現應該是3-tier!三層架構通常分爲:性能
- Presentation tier 表現層
- Logic tier 業務邏輯層
- Data access tier 數據訪問層
CS架構風格使得客戶端與服務端可以獨立進化,提升了架構的「伸縮性」;架構層面代碼隔離,提升了「可維護性」。 因爲系統被拆分紅了Client和Server,Client與Server端的通訊可能會稍微影響「性能」!ui
分層架構的約束
- 按照層次來進行組織,每一個層都有特定的責任
- 每一層爲在其之上的層提供服務,而且使用在其之下的層所提供的服務
- 較低層不可以使用較高層中的服務
- 通常不跨層調用
分層架構通常分爲四層,和CS架構風格很是相似,:spa
- Presentation layer 表現層 (Controller層能夠屬於這一層)
- Application layer 應用層 (常說的Service層就屬於這一層)
- Business layer 業務邏輯層(領域對象層屬於這一層)
- Data access layer 數據訪問層(持久層,日誌,網絡層等)
分層架構風格使得組件高內聚、低耦合,每一個組件能獨立進化,提升了架構的「伸縮性」;組件層面代碼隔離,提升了「可維護性」;層與層之間調用限制,可方便的替換對應的層,方便了「組件複用」以及「可移植性」! 因爲一個請求可能須要通過多層來處理,層與層之間的通訊會影響到「性能」!架構設計
Tier與Layer
不知道你有沒有疑問?2-tier、3-tier、N-tier架構模式爲何是CS架構風格的實現?而不是分層架構風格的實現?畢竟Tier與Layer都翻譯爲「層」!
這裏先說下Tier和Layer的區別!
網絡上有兩種解釋:
- 一種解釋是,Tier是縱切,Layer是橫切
- 另外一種解釋是,Tier是物理層,Layer是邏輯層
先說第一種解釋,縱切和橫切是什麼意思呢?看上面三層架構圖,表現層、邏輯層、數據層由上至下排列,看起來好像是被刀橫向切過同樣,這就是橫切。縱切就是表現層、邏輯層、數據層由左至右排列,看起來好像是被刀縱向切過同樣。
很明顯,這個解釋說不通,架構圖只是示意而已,組件如何擺放可能和我的習慣有關。上面的三層架構圖來自wiki,它是一個橫切圖,可是它是3-tier!
相對的,第二種解釋就比較合理。Tier是物理層,Layer是邏輯層。上面的例子中,三層架構的表現層、邏輯層、數據層都是可獨立部署的,也就是物理層。而Controller層,Service層,Model層等,是在一個應用中的,是邏輯劃分的,不能獨立部署。
維基百科在「多層架構」裏也間接支持了這個觀點:
In a 「logical multilayered architecture」 for an information system with an object-oriented design, the following four are the most common:Presentation layer,Application layer,Business layer,Data access layer 在面向對象設計的「邏輯分層架構」中,系統通常被分爲:表現層,應用層,業務層和數據訪問層
那咱們如何解釋「2-tier、3-tier、N-tier架構模式是CS架構風格的實現這個問題呢?」!
其實很簡單,2-tier是一個Client和Server進行通訊!那麼你能夠這麼看3-tier架構模式:
- 數據層相對於邏輯層來講,就是個Server,爲邏輯層提供數據服務;邏輯層相對於數據層來講,就是個Client,請求數據層獲取數據
- 邏輯層相對於表現層來講,就是個Server,爲表現層提供服務;表現層相對於邏輯層來講,就是個Client,請求邏輯層處理相應邏輯
N-tier架構模式相似,就不贅述了!
微妙關係
CS架構風格和分層架構風格其實關係比較微妙!
舉個簡單的例子,通常架構設計時,會先設計邏輯視圖!好比Controller層,Service層和Model層。若是我新增了一個緩存層用來緩存Model數據,那麼請問這個緩存層是個Layer仍是Tier?答案是不必定。若是你使用了redis來緩存數據,那麼緩存層就是個Tier。而若是你直接在系統裏寫代碼實現,那麼就是Layer!
使用場景
CS架構風格+分層架構風格能夠說是個萬金油組合!若是你沒法肯定該使用哪一種架構風格的時候,那麼能夠先使用CS架構風格+分層架構風格!
上面所提到的對架構屬性的影響,也是加成的!即會提升「伸縮性」,「組件複用」,「可移植性」,「可維護性」,可是會更加的影響「性能」!