淺析Tier和Layer的區(qū)別
有關(guān)Tier和Layer的區(qū)別,這里詳細(xì)論述一下,大家共同探討。
1. 橫向與縱向
有一種說法是“Layer是水平方向的,tier是垂直方向的”。這種說法首先容易給人造成下面這樣的誤解:
|||| <-- Layer
--
-- <-- tier
--
其實(shí)兩者表示起來恰恰相反:
|||| <-- Tier
--
-- <-- Layer
--
這種說法的確切含義是“Layer是水平方向<切割>的,tier是垂直方向<切割>的”。但是水平與垂直不過是個觀察角度的問題,所以這種說法并沒有揭示本質(zhì)。
2. 物理與邏輯
另外一種說法是“Tier表示物理分布,layer表示邏輯分布”。
可是在很多書籍里卻把3-tier的層分別叫做“表示layer”,“業(yè)務(wù)邏輯layer”和“數(shù)據(jù)存儲layer”。卻又分明在暗示tier和layer是沒有區(qū)別的。
的確,簡單來說Tier表示物理上的層次劃分,Layer表示邏輯上的層次劃分,這一點(diǎn)是很多人都同意的。但是邏輯上的東西終有一天需要映射到物理分布上,當(dāng)一個Layer恰好占據(jù)了一個Tier時,應(yīng)該叫它什么呢?
這就是混亂的來源。N-tier就是這種混亂的典型代表。
從邏輯上來講,你永遠(yuǎn)可以把一個應(yīng)用系統(tǒng)劃分為“表示layer”,“業(yè)務(wù)邏輯layer”和“數(shù)據(jù)存儲layer”。但是在映射到物理分布的時候,最早的方案只能把三者放到一臺機(jī)器上,比如用sql直接查詢數(shù)據(jù)庫。
再后來,可以把“表示layer”和“業(yè)務(wù)邏輯layer”放到一臺機(jī)器上,數(shù)據(jù)庫單獨(dú)放,這就是所謂的c/s結(jié)構(gòu)。
到了應(yīng)用服務(wù)器的年代,終于可以把三者分別放到三臺機(jī)器上了。客戶端機(jī)器放表示layer,應(yīng)用服務(wù)器放業(yè)務(wù)邏輯layer,數(shù)據(jù)庫機(jī)器放數(shù)據(jù)存儲layer。這樣從物理上看,我們就有了3個tier,只不過恰好每個tier都host了一個layer。更加有意思的是,每個物理上的tier可以不是1臺機(jī)器,而是一組完成同樣功能的機(jī)器,從這個角度來說,tier也是一個邏輯上的概念。
更加有趣的問題是,“可以放到3個tier上”和“一定要放到3個tier上”還不是一回事,如果把我們的三個邏輯層次都放到1臺(組)機(jī)器上時,這是個幾tier的架構(gòu)呢?當(dāng)然還是3tier,因?yàn)槟阌心芰﹄S時把3者分布出去,而不會被一定限制在一臺(組)機(jī)器上。這樣看來,對3tier架構(gòu)里的層使用layer的稱呼總是很保險的。因?yàn)樗粫凳痉植夹浴?/P>
除了物理與邏輯上的區(qū)別外,layer一般還暗示了“下面的layer一般要為上面的layer提供服務(wù)”,而tier這種暗示的意味很弱??梢钥匆幌耲ava的體系結(jié)構(gòu)圖來理解這一點(diǎn)。
3. c/s與b/s
經(jīng)??吹竭@樣的說法“c/s結(jié)構(gòu)是2-tier的,b/s結(jié)構(gòu)是3-tier或者N-tier的”。我覺得這里面存在著一個對c/s重大的誤解。
首先c/s的出現(xiàn)是對直接操作數(shù)據(jù)庫的一次顛覆,客戶端與服務(wù)器終于可以分開了,它僅僅是做了一個最大范圍的劃分,把機(jī)器的世界分為了客戶端與服務(wù)器,并沒有暗示客戶端與服務(wù)器只能各自是一個tier,只不過在這個名詞出現(xiàn)的年代,還不可能分出更多的層。
b/s結(jié)構(gòu)突出的特點(diǎn)是客戶端使用了瀏覽器,從大范圍上來講,也是客戶端與服務(wù)器兩個層次,只不過由于瀏覽器這個客戶端的功能實(shí)在是太弱了,不可能直接操作數(shù)據(jù)庫,直接導(dǎo)致了b/s結(jié)構(gòu)至少是3-tier的。
因此,說c/s結(jié)構(gòu)是2-tier的,至少是不準(zhǔn)確的,一個swing的客戶端調(diào)用EJB,EJB訪問數(shù)據(jù)庫,這樣的結(jié)構(gòu)當(dāng)然是3-Tier的,偏偏它怎么講都是一個c/s結(jié)構(gòu)。
因此,b/s結(jié)構(gòu)不過是c/s結(jié)構(gòu)的一個特例而已,與tier無關(guān)。
4. N-tier與N-layer
我們也經(jīng)常看到N-tier這樣的說法,但是實(shí)際鉆研下去卻發(fā)現(xiàn),分的不是tier而是layer。
前面說過,嚴(yán)格tier的定義是一個tier是完成同樣功能的一組機(jī)器,按照這樣的定義,實(shí)際上我們能做到物理分布的tier實(shí)在是不多??蛻魴C(jī)->web服務(wù)器->應(yīng)用服務(wù)器->數(shù)據(jù)庫,如此而已,如果想要更多的tier,只能自己寫服務(wù)了,或者把應(yīng)用服務(wù)器這個層次分為若干的tier。
更多的時候,也是更有意義的是做好layer的劃分,這樣在必要的時候才有可能把layer分布到tier上去。除了1個tier可以host多個layer外,某些layer也可能會分布到很多個tier上,比如提供基礎(chǔ)公共服務(wù)的layer。對于rich client的應(yīng)用來說,JDK這個layer需要同時分布在客戶端與服務(wù)器上。