架構(gòu)目的和指標(biāo)
架構(gòu)目的:
架構(gòu)設(shè)計的主要目的是為了解決軟件系統(tǒng)復(fù)雜度帶來的問題,是用最小的人力成本來滿足需求的開發(fā)和響應(yīng)需求的變化,用最小的運行成本來保障軟件的運行。讓軟件達(dá)到“高內(nèi)聚、松耦合”,從而使軟件具有:
易擴(kuò)展——易于增加新的功能
更強(qiáng)壯——不容易被粗心的程序員破壞
可移植——能夠在多樣的環(huán)境下運行
更簡單——容易理解、容易維護(hù)
設(shè)計目標(biāo):
可擴(kuò)展性(Scalable)
可靠性(Reliable),支持灰度發(fā)布,異地容錯
可伸縮 (Extensible),支持水平擴(kuò)展和垂直增強(qiáng)
可維護(hù)性(Maintainable),一是排除現(xiàn)有的錯誤,二是新需求可反映到現(xiàn)有系統(tǒng)中去。
安全性(Secure)
可定制化(Customizable)
客戶體驗(Customer Experience),必須易于使用。
架構(gòu)的方法論
面向?qū)ο?/p>
設(shè)計原則-SOLID
設(shè)計原則-SOLID
設(shè)計模式的六大原則有:
Single Responsibility Principle:單一職責(zé)原則
Open Closed Principle:開閉原則
Liskov Substitution Principle:里氏替換原則
Law of Demeter:迪米特法則
Interface Segregation Principle:接口隔離原則
Dependence Inversion Principle:依賴倒置原則
把這六個原則的首字母聯(lián)合起來( L 算做一個)就是 SOLID (solid,穩(wěn)定的),其代表的含義就是這六個原則結(jié)合使用的好處:建立穩(wěn)定、靈活、健壯的設(shè)計。
單一責(zé)任原則:
當(dāng)需要修改某個類的時候原因有且只有一個(THERE SHOULD NEVER BE MORE THAN ONE REASON FOR A CLASS TO CHANGE)。換句話說就是讓一個類只做一種類型責(zé)任,當(dāng)這個類需要承擔(dān)其他類型的責(zé)任的時候,就需要分解這個類。
開放封閉原則:
軟件實體應(yīng)該是可擴(kuò)展,而不可修改的。也就是說,對擴(kuò)展是開放的,而對修改是封閉的。這個原則是諸多面向?qū)ο缶幊淘瓌t中最抽象、最難理解的一個。
里氏替換原則:
當(dāng)一個子類的實例應(yīng)該能夠替換任何其他類的實例時,它們之間才具有is-A關(guān)系。
依賴倒置原則:
高層模塊不應(yīng)該依賴于低層模塊,二者都應(yīng)該依賴于抽象
抽象不應(yīng)該依賴于細(xì)節(jié),細(xì)節(jié)應(yīng)該依賴于抽象
接口分離原則:
不能強(qiáng)迫用戶去依賴那些他們不使用的接口。換句話說,使用多個專門的接口比使用單一的總接口總要好。
設(shè)計模式類型
設(shè)計模式類型
CAP定理
CAP是Consistency、Availablity和Partition-tolerance的縮寫。分別是指:
一致性(Consistency):每次讀操作都能保證返回的是最新數(shù)據(jù);
可用性(Availablity):任何一個沒有發(fā)生故障的節(jié)點,會在合理的時間內(nèi)返回一個正常的結(jié)果;
分區(qū)容忍性(Partition-tolerance):當(dāng)節(jié)點間出現(xiàn)網(wǎng)絡(luò)分區(qū),照樣可以提供服務(wù)。
1.一致性:一致性是指數(shù)據(jù)在多個副本之間是否能夠保持一致的特性。假如現(xiàn)在的多個節(jié)點中的數(shù)據(jù)是保持一致的,當(dāng)執(zhí)行完某一個更新操作之后,應(yīng)當(dāng)要保證系統(tǒng)的數(shù)據(jù)然后處于一致性的狀態(tài)。對于一個將數(shù)據(jù)副本分布在不同的分布式節(jié)點上,如果對第一個結(jié)點的數(shù)據(jù)進(jìn)行了更新的操作,并且更新成功之后,卻沒有讓第二個節(jié)點得到相應(yīng)的更新。當(dāng)外部系統(tǒng)再去調(diào)用第二個節(jié)點時,獲取到的依然是原始的數(shù)據(jù),這就是分布式數(shù)據(jù)不一致的情況了。在分布式系統(tǒng)中,如果能夠做到針對一個數(shù)據(jù)項更新操作執(zhí)行成功之后,所有的用戶都可以讀取到最新的值,那么這樣的系統(tǒng)就被認(rèn)為是具有強(qiáng)一致性的。
2.可用性:可用性是指系統(tǒng)提供的服務(wù)必須一直處于可用的狀態(tài),對于用戶的每一個操作請求總是能夠在有限的時間內(nèi),返回結(jié)果。有限的時間內(nèi):對于用戶的一個操作請求,系統(tǒng)必須能夠在指定的時間內(nèi)返回對應(yīng)的結(jié)果。如果超過了這個時間,就認(rèn)為系統(tǒng)是不可用的。返回結(jié)果是可用性的一個非常重要的指標(biāo),它要求系統(tǒng)在完成對用戶請求的處理后,返回一個正常的響應(yīng)結(jié)果。正常的響應(yīng)結(jié)果包含成功或失敗,而不是一個讓用戶迷惑的結(jié)果。
3.分區(qū)容錯性:分布式系統(tǒng)在遇到任何網(wǎng)絡(luò)分區(qū)故障的時候,仍然需要對外提供滿足一致性和可用性的服務(wù)。
CAP
一個分布式系統(tǒng)既然不能同時滿足上述的三個需求,因此在進(jìn)行對cap定理的應(yīng)用時,我們就需要去拋棄一項。
①選擇CA
放棄分區(qū)容錯性,比較簡單的方式就是把所有的數(shù)據(jù)都放在一個分布式節(jié)點上。那不就又成為了單機(jī)應(yīng)用了嗎?
②選擇CP
放棄可用性,一旦出現(xiàn)網(wǎng)絡(luò)故障,受到影響的服務(wù)需要再等待一定時間,因為系統(tǒng)處于不可用的狀態(tài)。
③選擇AP
放棄一致性,這里所指的一致性是強(qiáng)一致性,但是確保最終一致性。是很多分布式系統(tǒng)的選擇。
小結(jié):從cap的定理可以看出,分區(qū)容錯性是一個最基本的要求,因為既然是一個分布式系統(tǒng),必然要部署到兩個或兩個以上的節(jié)點上,否則,就不是分布式系統(tǒng),因此我們只能在一致性和可用性尋求平衡。
BASE理論
BASE理論
base是Basically Available(基本可用)、Soft state(軟狀態(tài))和Eventually consistent(最終一致性)三個短語的簡寫。base是對cap中一致性和可用性的權(quán)衡的結(jié)果。是根據(jù)cao理論演變而來,核心思想是即使無法做到強(qiáng)一致性,但是每個應(yīng)用根據(jù)自身的業(yè)務(wù)特點,采用適當(dāng)?shù)姆绞絹硎瓜到y(tǒng)達(dá)到最終與執(zhí)行。
①基本可用
基本可用指的是分布式系統(tǒng)出現(xiàn)了不可預(yù)知故障的時候,允許損失部分可用性。響應(yīng)時間合理延長,功能上適當(dāng)做服務(wù)降級。
②弱狀態(tài)
弱狀態(tài)指的是允許系統(tǒng)中的數(shù)據(jù)存在中間狀態(tài),并認(rèn)為該中間狀態(tài)不會影響系統(tǒng)的整體可用性,即允許在各個節(jié)點數(shù)據(jù)同步時存在延時。
③最終一致性
最終一致性強(qiáng)調(diào)的是系統(tǒng)中所有的數(shù)據(jù)副本,在經(jīng)過一段時間的同步之后,最終能夠達(dá)到一個一致的狀態(tài)。因此,最終一致性的本質(zhì)是需要系統(tǒng)保證數(shù)據(jù)最終能夠達(dá)到一致。而不需要實時保證系統(tǒng)數(shù)據(jù)的一致性。
AKF架構(gòu)原則
AFK立方體
X軸擴(kuò)展
所謂X軸代表把同樣的工作或數(shù)據(jù)鏡像分配給多個實體。換句話說就是復(fù)制服務(wù)然后負(fù)載均衡。這也是最簡單最基礎(chǔ)的擴(kuò)展。
示例:我有個網(wǎng)站,一開始部署在服務(wù)器A上對外服務(wù),隨著訪問人數(shù)增加,一臺服務(wù)器的性能無法支持,于是我又在服務(wù)器上B上同樣部署了網(wǎng)站,然后在前面部署了Apache或者Nginx來分流訪問,這就是最基本的X軸擴(kuò)展。
Y軸擴(kuò)展
針對X軸擴(kuò)展產(chǎn)生的問題,我們需要將大型服務(wù)進(jìn)行拆解,把分割的工作指責(zé)和數(shù)據(jù)分配給多個實體這也就是Y軸擴(kuò)展。也是微服務(wù)理論誕生的基礎(chǔ)。
示例:我把網(wǎng)站的注冊登錄模塊,首頁新聞?wù)故灸K,后臺維護(hù)模塊拆成了多個微服務(wù)進(jìn)行部署維護(hù)。 X軸擴(kuò)展和Y軸擴(kuò)展并不矛盾,是可以結(jié)合的,比如我發(fā)現(xiàn)新聞?wù)故灸K壓力很大,我可以對新聞?wù)故灸K進(jìn)行X軸擴(kuò)展,部署多個鏡像來分擔(dān)壓力。
Z軸擴(kuò)展
Z軸代表按照客戶、客戶的需要、位置或者價值分割或分配工作職責(zé)。一般在超大型系統(tǒng)中,架構(gòu)設(shè)計就會面臨Z軸擴(kuò)展的需求。
示例:網(wǎng)站一開始建設(shè)在上海數(shù)據(jù)中心,面向全國服務(wù)。隨著公司業(yè)務(wù)的增長,西安的客戶大量增加,但是訪問上海數(shù)據(jù)中心速度很慢,所以公司考慮在西安建立數(shù)據(jù)中心來應(yīng)對用戶訪問,這就是Z軸擴(kuò)展。
康威定律
第一定律:企業(yè)溝通方式會通過系統(tǒng)設(shè)計表達(dá)出來
第二定律:再多的時間也沒辦法讓任務(wù)完美至極,但總有時間能將它完成
第三定律:線型系統(tǒng)和線型組織架構(gòu)間有潛在的異質(zhì)同態(tài)特性
第四定律:大系統(tǒng)比小系統(tǒng)更適用于任務(wù)分解
架構(gòu)思維
架構(gòu)思維圖
架構(gòu)的變遷
架構(gòu)的變遷圖
單體架構(gòu):最簡單架構(gòu)風(fēng)格所有代碼在一個項目中,團(tuán)隊所有成員,可隨時任意修改一段代碼或增加一些新的代碼。
單體架構(gòu)圖
Web應(yīng)用程序發(fā)展的早期,大部分web工程師將所有的功能模塊打包到一起并放在一 個web容器中運行,所有功能模塊使用同一個數(shù)據(jù)庫。
特點:
1、所有的功能集成在一個項目工程中。
2、所有的功能打在一個war包部署到服務(wù)器。
3、通過部署應(yīng)用集群和數(shù)據(jù)庫集群來提高系統(tǒng)的性能。
優(yōu)點:
1、項目架構(gòu)簡單,前期開發(fā)成本低,周期短,小型項目的首選。
2、開發(fā)效率高,模塊之間交互采用本地方法調(diào)用。
3、容易部署,運維成本小,直接打包到web容器即可運行。
4、容易測試,無依賴,在本地就可以啟動調(diào)試完整的系統(tǒng)。
缺點:
1、全部功能集成在一個工程中,對于大型項目不易擴(kuò)展及維護(hù)。
2、版本迭代速度逐漸變慢,修改就要將整個應(yīng)用全部編譯。
3、無法針對某業(yè)務(wù)按需伸縮。
垂直架構(gòu):分層是典型的對復(fù) 雜系統(tǒng)進(jìn)行結(jié)構(gòu)化 思考和抽象聚合的 通用方法,也符合金字塔原理。MVC是一個常見的三層架構(gòu)模式。
垂直架構(gòu)圖
針對單體架構(gòu)的不足,為了適應(yīng)大型項目的開發(fā)需求,許多公司將一個單體系統(tǒng)按業(yè) 務(wù)垂直拆分為若干系統(tǒng),系統(tǒng)之間通過網(wǎng)絡(luò)交互來完成用戶的業(yè)務(wù)處理,每個系統(tǒng)可 分布式部署,這種架構(gòu)稱為分布式架構(gòu)。
特點:
1、按業(yè)務(wù)垂直拆分成一個一個的單體系統(tǒng),此架構(gòu)也稱為垂直架構(gòu)。
2、系統(tǒng)與系統(tǒng)之間的存在數(shù)據(jù)冗余,耦合性較大,如上圖中三個項目都存在客戶信息。
3、系統(tǒng)之間的接口多為實現(xiàn)數(shù)據(jù)同步,如上圖中三個項目要同步客戶信息。
優(yōu)點:
1、通過垂直拆分,每個子系統(tǒng)變成小型系統(tǒng),功能簡單,前期開發(fā)成本低,周期短。
2、每個子系統(tǒng)可按需伸縮。
3、每個子系統(tǒng)可采用不同的技術(shù)。
缺點:
1、子系統(tǒng)之間存在數(shù)據(jù)冗余、功能冗余,耦合性高。
2、按需伸縮粒度不夠,對同一個子系統(tǒng)中的不同的業(yè)務(wù)無法實現(xiàn),比如訂單管理和用戶管理。
SOA架構(gòu):面向服務(wù)架構(gòu)是一種建設(shè)企業(yè)IT生態(tài)系統(tǒng)的架構(gòu)指導(dǎo)思想。SOA關(guān)注服務(wù),服務(wù)是最基本的業(yè)務(wù)功能單元, 服務(wù)之間通過ESB通信。
SOA架構(gòu)圖
SOA是一種面向服務(wù)的架構(gòu),基于分布式架構(gòu),它將不同業(yè)務(wù)功能按服務(wù)進(jìn)行拆分, 并通過這些服務(wù)之間定義良好的接口和協(xié)議聯(lián)系起來。
特點:
1、基于SOA的架構(gòu)思想,將重復(fù)公用的功能抽取為組件,以服務(wù)的方式向各個系統(tǒng)提供服務(wù)。
2、各個系統(tǒng)與服務(wù)之間采用webservice、rpc等方式進(jìn)行通信。
3、ESB企業(yè)服務(wù)總線作為系統(tǒng)與服務(wù)之間通信的橋梁。
優(yōu)點:
1、將重復(fù)的功能抽取為服務(wù),提高開發(fā)效率,提高系統(tǒng)的可重用性、可維護(hù)性。
2、可以針對不同服務(wù)的特點按需伸縮。
3、采用ESB減少系統(tǒng)中的接口耦合。
缺點:
1、系統(tǒng)與服務(wù)的界限模糊,會導(dǎo)致抽取的服務(wù)的粒度過大,系統(tǒng)與服務(wù)之間耦合性高。
2、雖然使用了ESB,但是服務(wù)的接口協(xié)議不固定,種類繁多,不利于系統(tǒng)維護(hù)。
微服務(wù)架構(gòu):微服務(wù)架構(gòu)風(fēng)格以實現(xiàn)一組小服務(wù)的方式來開發(fā)一個獨立的應(yīng)用系統(tǒng)方法。其中每個小服務(wù)運行在獨立進(jìn)程。服務(wù)間通過ApiGW機(jī)制通信。
微服務(wù)架構(gòu)圖
基于SOA架構(gòu)的思想,為了滿足移動互聯(lián)網(wǎng)對大型項目及多客戶端的需求,對服務(wù)層進(jìn)行細(xì)粒度的拆分,所拆分的每個服務(wù)只完成某個特定的業(yè)務(wù)功能,比如訂單服務(wù)只實現(xiàn)訂單相關(guān)的業(yè)務(wù),用戶服務(wù)實現(xiàn)用戶管理相關(guān)的業(yè)務(wù)等等,服務(wù)的粒度很小,所以稱為微服務(wù)架構(gòu)。
特點:
1、服務(wù)層按業(yè)務(wù)拆分為一個一個的微服務(wù)。
2、微服務(wù)的職責(zé)單一。
3、微服務(wù)之間采用RESTful、RPC等輕量級協(xié)議傳輸。
4、有利于采用前后端分離架構(gòu)。
優(yōu)點:
1、服務(wù)拆分粒度更細(xì),有利于資源重復(fù)利用,提高開發(fā)效率。
2、可以更加精準(zhǔn)的制定每個服務(wù)的優(yōu)化方案,按需伸縮。
3、適用于互聯(lián)網(wǎng)時代,產(chǎn)品迭代周期更短。
缺點:
1、開發(fā)的復(fù)雜性增加,因為一個業(yè)務(wù)流程需要多個微服務(wù)通過網(wǎng)絡(luò)交互來完成。
2、微服務(wù)過多,服務(wù)治理成本高,不利于系統(tǒng)維護(hù)。
微服務(wù)架構(gòu)2.0-Service Mesh
Service Mesh
優(yōu)點:
1、屏蔽分布式系統(tǒng)通信的復(fù)雜性(負(fù)載均衡、服務(wù)發(fā)現(xiàn)、認(rèn)證授權(quán)、監(jiān)控追蹤、流量控 制等等),服務(wù)只用關(guān)注業(yè)務(wù)邏輯。
2、真正的與語言無關(guān),服務(wù)可以用任何語言編寫,只需和Service Mesh通信即可。
3、對應(yīng)用透明,Service Mesh組件可以單獨升級。
缺點:
1、邊緣網(wǎng)絡(luò),IoT場景:資源非常有限,不適合啟動太多Sidecar。
2、FaaS場景:應(yīng)用自身足夠輕量,甚至比Sidecar還要輕量。
3、Serverless場景:ScaletoZero時,對冷啟動速度有嚴(yán)格要求,Sidecar的啟動和初始化可能拖累應(yīng)用啟動速度。