一、單體架構
單體架構比較初級,典型的三級架構,前端(Web/手機端)+中間業務邏輯層+數據庫層。這是一種典型的Java Spring mvc或者Python Drango框架的應用。其架構圖如下所示:
單體架構的應用比較容易部署、測試, 在項目的初期,單體應用可以很好地運行。然而,隨着需求的不斷增加, 越來越多的人加入開發團隊,代碼庫也在飛速地膨脹。慢慢地,單體應用變得越來越臃腫,可維護性、靈活性逐漸降低,維護成本越來越高。
下面是單體架構應用的一些缺點:復雜性高:以一個百萬行級別的單體應用為例,整個項目包含的模塊非常多、模塊的邊界模糊、 依賴關系不清晰、 代碼質量參差不齊、 混亂地堆砌在一起。可想而知整個項目非常復雜。每次修改代碼都心驚膽戰, 甚至添加一個簡單的功能, 或者修改一個Bug都會帶來隱含的缺陷。
技術債務:隨着時間推移、需求變更和人員更迭,會逐漸形成應用程序的技術債務, 並且越積 越多。“ 不壞不修”, 這在軟件開發中非常常見, 在單體應用中這種思想更甚。
部署頻率低:隨着代碼的增多,構建和部署的時間也會增加。而在單體應用中, 每次功能的變更或缺陷的修復都會導致需要重新部署整個應用。全量部署的方式耗時長、 影響范圍大、 風險高, 這使得單體應用項目上線部署的頻率較低。
可靠性差:某個應用Bug,例如死循環、內存溢出等, 可能會導致整個應用的崩潰。
擴展能力受限:單體應用只能作為一個整體進行擴展,無法根據業務模塊的需要進行伸縮。
阻礙技術創新:單體應用往往使用統一的技術平台或方案解決所有的問題, 團隊中的每個成員 都必須使用相同的開發語言和框架,要想引入新框架或新技術平台會非常困難。
二、分布式應用
中級架構,分布式應用,中間層分布式+數據庫分布式,是單體架構的並發擴展,將一個大的系統划分為多個業務模塊,業務模塊分別部署在不同的服務器上,各個業務模塊之間通過接口進行數據交互。
數據庫也大量采用分布式數據庫,如redis、ES、solor等。通過LVS/Nginx代理應用,將用戶請求均衡的負載到不同的服務器上。其架構圖如下所示:
該架構相對於單體架構來說,這種架構提供了負載均衡的能力,大大提高了系統負載能力,解決了網站高並發的需求。另外還有以下特點:降低了耦合度:把模塊拆分,使用接口通信,降低模塊之間的耦合度。
責任清晰:把項目拆分成若干個子項目,不同的團隊負責不同的子項目。
擴展方便:增加功能時只需要再增加一個子項目,調用其他系統的接口就可以。
部署方便:可以靈活的進行分布式部署。
提高代碼的復用性:比如service層,如果不采用分布式rest服務方式架構就會在手機wap商城,微信商城,pc,android,ios每個端都要寫一個service層邏輯,開發量大,難以維護一起升級,這時候就可以采用分布式rest服務方式,公用一個service層。
缺點 : 系統之間的交互要使用遠程通信,接口開發增大工作量,但是利大於弊。
三、微服務架構
微服務架構,主要是中間層分解,將系統拆分成很多小應用(微服務),微服務可以部署在不同的服務器上,也可以部署在相同的服務器不同的容器上。當應用的故障不會影響到其他應用,單應用的負載也不會影響到其他應用,其代表框架有Spring cloud、Dubbo等。
其架構圖如下所示:
易於開發和維護:一個微服務只會關注一個特定的業務功能,所以它業務清晰、代碼量較少。
單個微服務啟動較快:單個微服務代碼量較少, 所以啟動會比較快。
局部修改容易部署:單體應用只要有修改,就得重新部署整個應用,微服務解決了這樣的問題。一般來說,對某個微服務進行修改,只需要重新部署這個服務即可。
技術棧不受限:在微服務架構中,可以結合項目業務及團隊的特點,合理地選擇技術棧。
微服務雖然有很多吸引人的地方,但它並不是免費的午餐,使用它是有代價的。使用微服務架構面臨的挑戰。
運維要求較高:更多的服務意味着更多的運維投入。在單體架構中,只需要保證一個應用的正常運行。
分布式固有的復雜性:使用微服務構建的是分布式系統。對於一個分布式系統,系統容錯、網絡延遲、分布式事務等都會帶來巨大的挑戰。
接口調整成本高:微服務之間通過接口進行通信。如果修改某一個微服務的API,可能所有使用了該接口的微服務都需要做調整。
重復勞動:很多服務可能都會使用到相同的功能,而這個功能並沒有達到分解為一個微服務的程度,這個時候,可能各個服務都會開發這一功能,從而導致代碼重復。
四、Serverless架構
當我們還在容器的浪潮中前行時,已經有一些革命先驅悄然布局另外一個雲計算戰場:Serverless架構。
2014年11月14日,亞馬遜AWS發布了新產品Lambda。當時Lambda被描述為:一種計算服務,根據時間運行用戶的代碼,無需關心底層的計算資源。從某種意義上來說,Lambda姍姍來遲,它像雲計算的PaaS理念:客戶只管業務,無需擔心存儲和計算資源。
Serverless架構能夠讓開發者在構建應用的過程中無需關注計算資源的獲取和運維,由平台來按需分配計算資源並保證應用執行的SLA(服務等級協議),按照調用次數進行計費,有效的節省應用成本。ServerLess的架構如上圖所示。
其優點如下所示:低運營成本、簡化設備運維、提升可維護性、更快的開發速度。
但ServerLess架構也有其缺點:
廠商平台綁定:平台會提供Serverless架構給大玩家,比如AWS Lambda,運行它需要使用AWS指定的服務,比如API網關,DynamoDB,S3等等,一旦你在這些服務上開發一個復雜系統,你會粘牢AWS,以后只好任由他們漲價定價或者下架等操作,個性化需求很難滿足,不能進行隨意的遷移或者遷移的成本比較大,同時不可避免帶來一些損失。
目前微服務架構在四種架構中處於主流地位,很多應用第一、第二種架構的企業也開始慢慢轉向微服務架構。到目前為止微服務的技術相對於二三年前已經比較成熟,第四種架構將是未來發展的一種趨勢。