4 大經常使用的軟件架構,來看看大家公司用哪一種?

若是一個軟件開發人員,不瞭解軟件架構的演進,會制約技術的選型和開發人員的生存、晉升空間。這裏我列舉了目前主要的四種軟件架構以及他們的優缺點,但願可以幫助軟件開發人員拓展知識面。整理了一份Java面試寶典完整版PDF已整理成文檔前端

1、單體架構

單體架構比較初級,典型的三級架構,前端(Web/手機端)+中間業務邏輯層+數據庫層。這是一種典型的Java Spring mvc或者Python Drango框架的應用。其架構圖以下所示:android

4 大經常使用的軟件架構,來看看大家公司用哪一種?

單體架構ios

單體架構的應用比較容易部署、測試, 在項目的初期,單體應用能夠很好地運行。然而,隨着需求的不斷增長, 愈來愈多的人加入開發團隊,代碼庫也在飛速地膨脹。慢慢地,單體應用變得愈來愈臃腫,可維護性、靈活性逐漸下降,維護成本愈來愈高。下面是單體架構應用的一些缺點:面試

複雜性高: 以一個百萬行級別的單體應用爲例,整個項目包含的模塊很是多、模塊的邊界模糊、 依賴關係不清晰、 代碼質量良莠不齊、 混亂地堆砌在一塊兒。可想而知整個項目很是複雜。 每次修改代碼都心驚膽戰, 甚至添加一個簡單的功能, 或者修改一個Bug都會帶來隱含的缺陷。redis

技術債務: 隨着時間推移、需求變動和人員更迭,會逐漸造成應用程序的技術債務, 而且越積 越多。「 不壞不修」, 這在軟件開發中很是常見, 在單體應用中這種思想更甚。 已使用的系統設計或代碼難以被修改,由於應用程序中的其餘模塊可能會以意料以外的方式使用它。數據庫

部署頻率低: 隨着代碼的增多,構建和部署的時間也會增長。而在單體應用中, 每次功能的變動或缺陷的修復都會致使須要從新部署整個應用。全量部署的方式耗時長、 影響範圍大、 風險高, 這使得單體應用項目上線部署的頻率較低。 而部署頻率低又致使兩次發佈之間會有大量的功能變動和缺陷修復,出錯率比較高。後端

可靠性差: 某個應用Bug,例如死循環、內存溢出等, 可能會致使整個應用的崩潰。安全

擴展能力受限: 單體應用只能做爲一個總體進行擴展,沒法根據業務模塊的須要進行伸縮。例如,應用中有的模塊是計算密集型的,它須要強勁的CPU; 有的模塊則是IO密集型的,須要更大的內存。 因爲這些模塊部署在一塊兒,不得不在硬件的選擇上作出妥協。服務器

阻礙技術創新: 單體應用每每使用統一的技術平臺或方案解決全部的問題, 團隊中的每一個成員 都必須使用相同的開發語言和框架,要想引入新框架或新技術平臺會很是困難。微信

2、分佈式應用

中級架構,分佈式應用,中間層分佈式+數據庫分佈式,是單體架構的併發擴展,將一個大的系統劃分爲多個業務模塊,業務模塊分別部署在不一樣的服務器上,各個業務模塊之間經過接口進行數據交互。數據庫也大量採用分佈式數據庫,如redis、ES、solor等。經過LVS/Nginx代理應用,將用戶請求均衡的負載到不一樣的服務器上。其架構圖以下所示:

4 大經常使用的軟件架構,來看看大家公司用哪一種?

分佈式架構

該架構相對於單體架構來講,這種架構提供了負載均衡的能力,大大提升了系統負載能力,解決了網站高併發的需求。另外還有如下特色:

下降了耦合度:把模塊拆分,使用接口通訊,下降模塊之間的耦合度。

責任清晰:把項目拆分紅若干個子項目,不一樣的團隊負責不一樣的子項目。

擴展方便:增長功能時只須要再增長一個子項目,調用其餘系統的接口就能夠。

部署方便:能夠靈活的進行分佈式部署。

提升代碼的複用性:好比service層,若是不採用分佈式rest服務方式架構就會在手機wap商城,微信商城,pc,android,ios每一個端都要寫一個service層邏輯,開發量大,難以維護一塊兒升級,這時候就能夠採用分佈式rest服務方式,公用一個service層。

缺點 : 系統之間的交互要使用遠程通訊,接口開發增大工做量,可是利大於弊。

3、微服務架構

微服務架構,主要是中間層分解,將系統拆分紅不少小應用(微服務),微服務能夠部署在不一樣的服務器上,也能夠部署在相同的服務器不一樣的容器上。當應用的故障不會影響到其餘應用,單應用的負載也不會影響到其餘應用,其表明框架有Spring cloud、Dubbo等。 其架構圖以下所示:

4 大經常使用的軟件架構,來看看大家公司用哪一種?

微服務架構

易於開發和維護: 一個微服務只會關注一個特定的業務功能,因此它業務清晰、代碼量較少。 開發和維護單個微服務相對簡單。而整個應用是由若干個微服務構建而成的,因此整個應用也會被維持在一個可控狀態。

單個微服務啓動較快: 單個微服務代碼量較少, 因此啓動會比較快。

局部修改容易部署: 單體應用只要有修改,就得從新部署整個應用,微服務解決了這樣的問題。 通常來講,對某個微服務進行修改,只須要從新部署這個服務便可。

技術棧不受限:在微服務架構中,能夠結合項目業務及團隊的特色,合理地選擇技術棧。例如某些服務可以使用關係型數據庫MySQL;某些微服務有圖形計算的需求,可使用Neo4j;甚至可根據須要,部分微服務使用Java開發,部分微服務使用Node.js開發。

微服務雖然有不少吸引人的地方,但它並非免費的午飯,使用它是有代價的。使用微服務架構面臨的挑戰。

運維要求較高:更多的服務意味着更多的運維投入。在單體架構中,只須要保證一個應用的正常運行。而在微服務中,須要保證幾十甚至幾百個服務服務的正常運行與協做,這給運維帶來了很大的挑戰。

分佈式固有的複雜性:使用微服務構建的是分佈式系統。對於一個分佈式系統,系統容錯、網絡延遲、分佈式事務等都會帶來巨大的挑戰。

接口調整成本高:微服務之間經過接口進行通訊。若是修改某一個微服務的API,可能全部使用了該接口的微服務都須要作調整。

重複勞動:不少服務可能都會使用到相同的功能,而這個功能並無達到分解爲一個微服務的程度,這個時候,可能各個服務都會開發這一功能,從而致使代碼重複。儘管可使用共享庫來解決這個問題(例如能夠將這個功能封裝成公共組件,須要該功能的微服務引用該組件),但共享庫在多語言環境下就不必定行得通了。

4、Serverless架構

當咱們還在容器的浪潮中前行時,已經有一些革命先驅悄然佈局另一個雲計算戰場:Serverless架構。

4 大經常使用的軟件架構,來看看大家公司用哪一種?

Serverless架構

2014年11月14日,亞馬遜AWS發佈了新產品Lambda。當時Lambda被描述爲:一種計算服務,根據時間運行用戶的代碼,無需關心底層的計算資源。從某種意義上來講,Lambda姍姍來遲,它像雲計算的PaaS理念:客戶只管業務,無需擔憂存儲和計算資源。在此前不久,2014年10月22日,谷歌收購了實時後端數據庫創業公司Firebase。Firebase聲稱開發者只需引用一個API庫文件就可使用標準REST API的各類接口對數據進行讀寫操做,只需編寫HTML+CSS+JavaScrip前端代碼,不須要服務器端代碼(如需整合,也極其簡單)。

相對於上二者,Facebook 在2014年二月收購的 Parse,則側重於提供一個通用的後臺服務。這些服務被稱爲Serverless或no sever。想到PaaS(平臺即服務)了是嗎?很像,用戶不須要關心基礎設施,只須要關心業務,這是遲到的PaaS,也是更實用的PaaS。這頗有可能將會變革整個開發過程和傳統的應用生命週期,一旦開發者們習慣了這種全自動的雲上資源的建立和分配,或許就再也回不到那些須要微應用配置資源的時代裏去了。

Serverless架構可以讓開發者在構建應用的過程當中無需關注計算資源的獲取和運維,由平臺來按需分配計算資源並保證應用執行的SLA(服務等級協議),按照調用次數進行計費,有效的節省應用成本。ServerLess的架構如上圖所示。其優勢以下所示:

低運營成本:在業務突發性極高的場景下,系統爲了應對業務高峯,必須構建可以應對峯值需求的系統,這個系統在大部分時間是空閒的,這就致使了嚴重的資源浪費和成本上升。在微服務架構中,服務須要一直運行,實際上在高負載狀況下每一個服務都不止一個實例,這樣才能完成高可用性;在Serverless架構下,服務將根據用戶的調用次數進行計費,按照雲計算pay-as-you-go原則,若是沒有東西運行,你就沒必要付款,節省了使用成本。同時,用戶可以經過共享網絡、硬盤、CPU等計算資源,在業務高峯期經過彈性擴容方式有效的應對業務峯值,在業務波谷期將資源分享給其餘用戶,有效的節約了成本。

簡化設備運維:在原有的IT體系中,開發團隊即須要維護應用程序,同時還要維護硬件基礎設施;Serverless架構中,開發人員面對的將是第三方開發或自定義的API 和URL,底層硬件對於開發人員透明化了,技術團隊無需再關注運維工做,可以更加專一於應用系統開發。

提高可維護性:Serverless架構中,應用程序將調用多種第三方功能服務,組成最終的應用邏輯。目前,例如登錄鑑權服務,雲數據庫服務等第三方服務在安全性、可用性、性能方面都進行了大量優化,開發團隊直接集成第三方的服務,可以有效的下降開發成本,同時使得應用的運維過程變得更加清晰,有效的提高了應用的可維護性。

更快的開發速度:這一點在如今互聯網創業公司獲得很好的體現,創業公司每每開始因爲人員和資金等問題,不可能每一個產品線都同時進行,這時候就能夠考慮第三方的Baas平臺,好比使用微信的用戶認證、阿里雲提供的RDS,極光的消息推送,第三方支付及地理位置等等,可以很快進行產品開發的速度,把工做重點放在業務實現上,把產品更快的推向市場。

但ServerLess架構也有其缺點:

廠商平臺綁定:平臺會提供Serverless架構給大玩家,好比AWS Lambda,運行它須要使用AWS指定的服務,好比API網關,DynamoDB,S3等等,一旦你在這些服務上開發一個複雜系統,你會粘牢AWS,之後只好任由他們漲價訂價或者下架等操做,個性化需求很難知足,不能進行隨意的遷移或者遷移的成本比較大,同時不可避免帶來一些損失。Baas行業內一個比較典型的事件,2016年1月19日Facebook關閉曾經花鉅額資金收購的Parse,形成用戶不得不遷移在這個平臺中產生一年多的數據,無疑須要花費比較大的人力和時間成本。

成功案例比較少,沒有行業標準:目前的狀況也只適合簡單的應用開發,缺少大型成功案例的推進。對於Serverless缺少統一的認知以及相應的標準,沒法適應全部的雲平臺。整理了一份Java面試寶典完整版PDF已整理成文檔

目前微服務架構在四種架構中處於主流地位,不少應用第1、第二種架構的企業也開始慢慢轉向微服務架構。到目前爲止微服務的技術相對於二三年前已經比較成熟,第四種架構將是將來發展的一種趨勢。

相關文章
相關標籤/搜索