架构风格:万金油CS与分层
計(jì)算機(jī)科學(xué)家David Wheele曾說(shuō)過(guò)這么一句話:
All problems in computer science can be solved by another level of indirection
意思是:「 計(jì)算機(jī)科學(xué)領(lǐng)域的任何問(wèn)題都可以通過(guò)增加一個(gè)間接的中間層來(lái)解決」。
這也是CS架構(gòu)和分層架構(gòu)的核心思想!
將CS架構(gòu)和分層架構(gòu)放在一起討論除了上面的原因之外,還有如下幾個(gè)原因:
- CS架構(gòu)和分層架構(gòu)是使用很頻繁的兩種架構(gòu)風(fēng)格
- CS架構(gòu)和分層架構(gòu)一般都會(huì)結(jié)合使用
- CS架構(gòu)中的2-tier,3-tier,N-tier與分層架構(gòu)容易混淆,畢竟Tier和Layer都翻譯為「層」
本文將探討如下幾個(gè)問(wèn)題:
- CS架構(gòu)風(fēng)格的約束
- CS架構(gòu)風(fēng)格對(duì)架構(gòu)屬性的影響
- 2-tier,3-tier,N-tier架構(gòu)模式
- 分層架構(gòu)風(fēng)格的約束
- 分層架構(gòu)風(fēng)格對(duì)架構(gòu)屬性的影響
- Tier和Layer的區(qū)別「為什么兩層架構(gòu)(2-tier)、三層架構(gòu)(3-tier)、N層架構(gòu)(N-tier)是CS架構(gòu)風(fēng)格的具體體現(xiàn),而不是分層(Layer)架構(gòu)風(fēng)格的具體體現(xiàn)?!」
- CS架構(gòu)風(fēng)格和分層架構(gòu)風(fēng)格適用哪些場(chǎng)景
CS架構(gòu)風(fēng)格的約束
- Server組件提供了一組服務(wù),并監(jiān)聽(tīng)對(duì)這些服務(wù)的請(qǐng)求,
- Client組件通過(guò)一個(gè)連接器將請(qǐng)求發(fā)送到Server,希望執(zhí)行一個(gè)服務(wù),
- Server可以拒絕這個(gè)請(qǐng)求,也可以執(zhí)行這個(gè)請(qǐng)求并將響應(yīng)發(fā)送回Client。
CS架構(gòu)風(fēng)格最簡(jiǎn)單的實(shí)現(xiàn)就是2-tier!即兩層架構(gòu)模式。比如SSH,FTP就是兩層架構(gòu)。以FTP來(lái)說(shuō):
- 遠(yuǎn)程有一個(gè)FTP文件服務(wù)器
- 我們需要使用FTP客戶端去連接那個(gè)文件服務(wù)器
- 如果用戶名密碼錯(cuò)誤,服務(wù)器會(huì)拒絕連接
- 連接上以后,客戶端可以下載或上傳文件到服務(wù)端
最常用的CS架構(gòu)風(fēng)格的實(shí)現(xiàn)應(yīng)該是3-tier!三層架構(gòu)一般分為:
- Presentation tier 表現(xiàn)層
- Logic tier 業(yè)務(wù)邏輯層
- Data access tier 數(shù)據(jù)訪問(wèn)層
CS架構(gòu)風(fēng)格使得客戶端與服務(wù)端能夠獨(dú)立進(jìn)化,提高了架構(gòu)的「伸縮性」;架構(gòu)層面代碼隔離,提高了「可維護(hù)性」。
由于系統(tǒng)被拆分成了Client和Server,Client與Server端的通信可能會(huì)稍微影響「性能」!
分層架構(gòu)的約束
- 按照層次來(lái)進(jìn)行組織,每個(gè)層都有特定的責(zé)任
- 每一層為在其之上的層提供服務(wù),并且使用在其之下的層所提供的服務(wù)
- 較低層不可使用較高層中的服務(wù)
- 一般不跨層調(diào)用
分層架構(gòu)一般分為四層,和CS架構(gòu)風(fēng)格非常類(lèi)似,:
- Presentation layer 表現(xiàn)層 (Controller層可以屬于這一層)
- Application layer 應(yīng)用層 (常說(shuō)的Service層就屬于這一層)
- Business layer 業(yè)務(wù)邏輯層(領(lǐng)域?qū)ο髮訉儆谶@一層)
- Data access layer 數(shù)據(jù)訪問(wèn)層(持久層,日志,網(wǎng)絡(luò)層等)
分層架構(gòu)風(fēng)格使得組件高內(nèi)聚、低耦合,每個(gè)組件能獨(dú)立進(jìn)化,提高了架構(gòu)的「伸縮性」;組件層面代碼隔離,提高了「可維護(hù)性」;層與層之間調(diào)用限制,可方便的替換對(duì)應(yīng)的層,方便了「組件復(fù)用」以及「可移植性」!
由于一個(gè)請(qǐng)求可能需要經(jīng)過(guò)多層來(lái)處理,層與層之間的通信會(huì)影響到「性能」!
Tier與Layer
不知道你有沒(méi)有疑問(wèn)?2-tier、3-tier、N-tier架構(gòu)模式為什么是CS架構(gòu)風(fēng)格的實(shí)現(xiàn)?而不是分層架構(gòu)風(fēng)格的實(shí)現(xiàn)?畢竟Tier與Layer都翻譯為「層」!
這里先說(shuō)下Tier和Layer的區(qū)別!
網(wǎng)絡(luò)上有兩種解釋:
- 一種解釋是,Tier是縱切,Layer是橫切
- 另一種解釋是,Tier是物理層,Layer是邏輯層
先說(shuō)第一種解釋,縱切和橫切是什么意思呢?看上面三層架構(gòu)圖,表現(xiàn)層、邏輯層、數(shù)據(jù)層由上至下排列,看起來(lái)好像是被刀橫向切過(guò)一樣,這就是橫切。縱切就是表現(xiàn)層、邏輯層、數(shù)據(jù)層由左至右排列,看起來(lái)好像是被刀縱向切過(guò)一樣。
很明顯,這個(gè)解釋說(shuō)不通,架構(gòu)圖只是示意而已,組件如何擺放可能和個(gè)人習(xí)慣有關(guān)。上面的三層架構(gòu)圖來(lái)自wiki,它是一個(gè)橫切圖,但是它是3-tier!
相對(duì)的,第二種解釋就比較合理。Tier是物理層,Layer是邏輯層。上面的例子中,三層架構(gòu)的表現(xiàn)層、邏輯層、數(shù)據(jù)層都是可獨(dú)立部署的,也就是物理層。而Controller層,Service層,Model層等,是在一個(gè)應(yīng)用中的,是邏輯劃分的,不能獨(dú)立部署。
維基百科在「多層架構(gòu)」里也間接支持了這個(gè)觀點(diǎn):
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
在面向?qū)ο笤O(shè)計(jì)的「邏輯分層架構(gòu)」中,系統(tǒng)一般被分為:表現(xiàn)層,應(yīng)用層,業(yè)務(wù)層和數(shù)據(jù)訪問(wèn)層
那我們?nèi)绾谓忉尅?-tier、3-tier、N-tier架構(gòu)模式是CS架構(gòu)風(fēng)格的實(shí)現(xiàn)這個(gè)問(wèn)題呢?」!
其實(shí)很簡(jiǎn)單,2-tier是一個(gè)Client和Server進(jìn)行通信!那么你可以這么看3-tier架構(gòu)模式:
- 數(shù)據(jù)層相對(duì)于邏輯層來(lái)說(shuō),就是個(gè)Server,為邏輯層提供數(shù)據(jù)服務(wù);邏輯層相對(duì)于數(shù)據(jù)層來(lái)說(shuō),就是個(gè)Client,請(qǐng)求數(shù)據(jù)層獲取數(shù)據(jù)
- 邏輯層相對(duì)于表現(xiàn)層來(lái)說(shuō),就是個(gè)Server,為表現(xiàn)層提供服務(wù);表現(xiàn)層相對(duì)于邏輯層來(lái)說(shuō),就是個(gè)Client,請(qǐng)求邏輯層處理相應(yīng)邏輯
N-tier架構(gòu)模式類(lèi)似,就不贅述了!
微妙關(guān)系
CS架構(gòu)風(fēng)格和分層架構(gòu)風(fēng)格其實(shí)關(guān)系比較微妙!
舉個(gè)簡(jiǎn)單的例子,一般架構(gòu)設(shè)計(jì)時(shí),會(huì)先設(shè)計(jì)邏輯視圖!比如Controller層,Service層和Model層。如果我新增了一個(gè)緩存層用來(lái)緩存Model數(shù)據(jù),那么請(qǐng)問(wèn)這個(gè)緩存層是個(gè)Layer還是Tier?答案是不一定。如果你使用了redis來(lái)緩存數(shù)據(jù),那么緩存層就是個(gè)Tier。而如果你直接在系統(tǒng)里寫(xiě)代碼實(shí)現(xiàn),那么就是Layer!
使用場(chǎng)景
CS架構(gòu)風(fēng)格+分層架構(gòu)風(fēng)格可以說(shuō)是個(gè)萬(wàn)金油組合!如果你無(wú)法確定該使用哪種架構(gòu)風(fēng)格的時(shí)候,那么可以先使用CS架構(gòu)風(fēng)格+分層架構(gòu)風(fēng)格!
上面所提到的對(duì)架構(gòu)屬性的影響,也是加成的!即會(huì)提高「伸縮性」,「組件復(fù)用」,「可移植性」,「可維護(hù)性」,但是會(huì)更加的影響「性能」!
參考資料
- 維基百科
- Azure文檔
- 《Architectural Styles and the Design of Network-based Software Architectures》Roy Thomas Fielding
- 《恰如其分的軟件架構(gòu)》
總結(jié)
以上是生活随笔為你收集整理的架构风格:万金油CS与分层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Elasticsearch索引定时清理
- 下一篇: 01 决策树 - 数学理论概述 - 熵