架构风格:万金油CS与分层
計算機科學家David Wheele曾說過這么一句話:
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來說:
- 遠程有一個FTP文件服務器
- 我們需要使用FTP客戶端去連接那個文件服務器
- 如果用戶名密碼錯誤,服務器會拒絕連接
- 連接上以后,客戶端可以下載或上傳文件到服務端
最常用的CS架構風格的實現應該是3-tier!三層架構一般分為:
- Presentation tier 表現層
- Logic tier 業務邏輯層
- Data access tier 數據訪問層
CS架構風格使得客戶端與服務端能夠獨立進化,提高了架構的「伸縮性」;架構層面代碼隔離,提高了「可維護性」。
由于系統被拆分成了Client和Server,Client與Server端的通信可能會稍微影響「性能」!
分層架構的約束
- 按照層次來進行組織,每個層都有特定的責任
- 每一層為在其之上的層提供服務,并且使用在其之下的層所提供的服務
- 較低層不可使用較高層中的服務
- 一般不跨層調用
分層架構一般分為四層,和CS架構風格非常類似,:
- 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架構風格+分層架構風格!
上面所提到的對架構屬性的影響,也是加成的!即會提高「伸縮性」,「組件復用」,「可移植性」,「可維護性」,但是會更加的影響「性能」!
參考資料
- 維基百科
- Azure文檔
- 《Architectural Styles and the Design of Network-based Software Architectures》Roy Thomas Fielding
- 《恰如其分的軟件架構》
總結
以上是生活随笔為你收集整理的架构风格:万金油CS与分层的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Elasticsearch索引定时清理
- 下一篇: 01 决策树 - 数学理论概述 - 熵