首頁常見問題正文

單體架構(gòu)的缺點是什么?

更新時間:2023-02-09 來源:黑馬程序員 瀏覽量:

IT培訓班

隨著互聯(lián)網(wǎng)技術(shù)的發(fā)展,傳統(tǒng)的應(yīng)用架構(gòu)已滿足不了實際需求,微服務(wù)架構(gòu)就隨之產(chǎn)生。那么傳統(tǒng)應(yīng)用架構(gòu)到底出了什么問題呢?又如何解決?接下來我們將從傳統(tǒng)單體架構(gòu)的問題開始,對為什么需要微服務(wù)架構(gòu)進行詳細講解。

傳統(tǒng)單體應(yīng)用架構(gòu)的問題

通常我們所使用的傳統(tǒng)單體應(yīng)用架構(gòu)都是模塊化的設(shè)計邏輯,程序在編寫完成后會被打包并部署為一個具體的應(yīng)用,而應(yīng)用的格式則依賴于相應(yīng)的應(yīng)用語言和框架。例如,在網(wǎng)上商城系統(tǒng)中,JavaWeb工程通常會被打成WA R包部署在Web服務(wù)器上,而普通Java工程會以JAR包的形式包含在WA R包中,如圖1-1所示。

單體架構(gòu)

早期單體架構(gòu)圖

上圖中的這種應(yīng)用開發(fā)風格很常見,它易于開發(fā)和調(diào)試,并且易于部署。在用戶量不多時,此種架構(gòu)方式完全可以滿足需求,但隨著用戶人數(shù)的增加,一臺機器已經(jīng)滿足不了系統(tǒng)的負載,此時我們就會考慮系統(tǒng)的水平擴展。通常情況下,我們只需要增加服務(wù)器的數(shù)量,并將打包好的應(yīng)用拷貝到不同服務(wù)器(如Tomcat),然后通過負載均衡器(如Apache、Nginx)就可以輕松實現(xiàn)應(yīng)用的水平擴展,如圖所示。

傳統(tǒng)單體應(yīng)用架構(gòu)

在早期,單體架構(gòu)的這種擴展方式可以很好的滿足使用需求,但隨著時間的推移,這種方式就會產(chǎn)生很多問題,具體表現(xiàn)如下:

1.應(yīng)用復(fù)雜度增加,更新、維護困難

一個簡單的應(yīng)用會隨著時間的推移而逐漸變大。一旦應(yīng)用變的龐大而又復(fù)雜,那么開發(fā)團隊將會面臨很多問題,其中最主要問題就是這個應(yīng)用太復(fù)雜,以至于任何單個開發(fā)者都很難進行二次開發(fā)或維護。

2.易造成系統(tǒng)資源浪費

雖然使用負載均衡的方式可以對項目中的服務(wù)容量進行水平擴展,但由于傳統(tǒng)單體架構(gòu)的代碼中只有一個包含所有功能的WA R包,所以在對服務(wù)容量擴容時,只能選擇重復(fù)的部署這個WA R包來擴展服務(wù)能力,而不僅僅是擴展了所需的服務(wù)。這樣導(dǎo)致其他不需要擴展的服務(wù)也進行了相應(yīng)的擴展,但這種擴展是不需要的,因此這種方式會極大的浪費資源。

3.影響開發(fā)效率

當一個應(yīng)用越大時,啟動時間就會越長。開發(fā)和調(diào)試的過程中,如果有很大一部分時間都要在等待中渡過,那么必然會對開發(fā)效率有極大的影響。

4.應(yīng)用可靠性低

傳統(tǒng)單體應(yīng)用架構(gòu)在運行時的可靠性比較低,當所有模塊都運行在一個進程中時,如果任何一個模塊中出現(xiàn)了一個Bug,可能會導(dǎo)致整個進程崩潰,從而影響到整個應(yīng)用。

5.不利于技術(shù)的更新

傳統(tǒng)單體應(yīng)用架構(gòu)一旦選定使用某些技術(shù),則后期的開發(fā)和擴展將在這些技術(shù)的基礎(chǔ)上實現(xiàn)。如果需要更改某種技術(shù),則可能需要將整個應(yīng)用全部重新開發(fā),這種成本是非常大的。當然,傳統(tǒng)單體應(yīng)用架構(gòu)的問題還不只這些,但出現(xiàn)這些問題的根本原因可以說就是由于傳統(tǒng)單體架構(gòu)中一個WA R包內(nèi)包含了系統(tǒng)的所有服務(wù)功能所導(dǎo)致的。隨著業(yè)務(wù)變的越來越多,問題也就越來越多。

如何解決傳統(tǒng)應(yīng)用架構(gòu)的問題

針對傳統(tǒng)單體架構(gòu)的問題,大部分企業(yè)通過SOA(Service-Oriented Architecture,面向服務(wù)的架構(gòu))來解決上述問題。SOA的思路是把應(yīng)用中相近的功能聚合到一起,以服務(wù)的形式提供出去,因此基于SOA架構(gòu)的應(yīng)用可以理解為一批服務(wù)的組合。

同樣以網(wǎng)上商城為例,一個簡單的SOA系統(tǒng)如圖1-3所示。

soa系統(tǒng)

SOA系統(tǒng)

從上圖可以看出,SOA將原來的單體架構(gòu)按照功能細分為不同的子系統(tǒng),然后再由各個子系統(tǒng)依賴服務(wù)中間件(這里指企業(yè)服務(wù)總線Enterprise Service Bus,簡稱ESB)來調(diào)用所需服務(wù)。

使用SOA可以將系統(tǒng)切分成多個組件服務(wù),這種通過多個組件服務(wù)來完成請求的方式有很多好處,具體如下:

l把項目拆分成若干個子項目,不同的團隊可以負責不同的子項目,從而提高開發(fā)效率;

l把模塊拆分,使用接口通信,降低了模塊之間的耦合度;

l為企業(yè)的現(xiàn)有資源帶來了更好的重用性;l能夠在最新的和現(xiàn)有的應(yīng)用之上創(chuàng)建應(yīng)用;

l能夠使客戶或服務(wù)消費者免予服務(wù)實現(xiàn)的改變所帶來的影響;

l能夠升級單個服務(wù)或服務(wù)消費者而無需重寫整個應(yīng)用,也無需保留已經(jīng)不再適用于新需求的現(xiàn)有系統(tǒng)。

雖然使用SOA解決了單體架構(gòu)中的問題,但多數(shù)情況下,SOA中相互獨立的服務(wù)仍然會部署在同一個運行環(huán)境中(類似于一個Tomcat實例下,運行了很多web應(yīng)用)。和單體架構(gòu)類似,隨著業(yè)務(wù)功能的增多,SOA的服務(wù)會變得越來越復(fù)雜。本質(zhì)上看,單體架構(gòu)的問題并沒有因為使用SOA而變的更好。

針對單體架構(gòu)和SOA的問題,許多公司(如Amazon、eBay和NetFlix)通過采用微處理結(jié)構(gòu)模式解決了系統(tǒng)架構(gòu)中的問題。其思路不是開發(fā)一個巨大的單體式的應(yīng)用,而是將應(yīng)用分解為小的、互相連接的微服務(wù)。隨著微服務(wù)的使用,微服務(wù)架構(gòu)的思想也隨之產(chǎn)生。

分享到:
在線咨詢 我要報名
和我們在線交談!