技術(shù)架構(gòu)涵蓋內(nèi)容和演變過(guò)程總結(jié)
目錄
- 一、前言
- 二、架構(gòu)演變
- 1. 單體架構(gòu)
- 2. 應(yīng)用與數(shù)據(jù)庫(kù)分離
- 3. 使用緩存抗量
- 4. 多應(yīng)用部署和Nginx反向代理
- 5. 數(shù)據(jù)庫(kù)讀寫(xiě)分離
- 6. 應(yīng)用分組部署
- 7. 應(yīng)用分庫(kù)設(shè)計(jì)
- 8. RPC 分布式部署
- 9. 應(yīng)用細(xì)分和網(wǎng)關(guān)引入
- 10. 低代碼編程和可復(fù)用
- 三、架構(gòu)圖??下載
- 四、總結(jié)
- 五、系列推薦
一、前言
架構(gòu),說(shuō)的是開(kāi)發(fā)用的框架嗎?
對(duì)于剛接觸編程的新人來(lái)說(shuō),可能并能很清楚的知道架構(gòu)是怎么來(lái)的,都包括什么內(nèi)容。如果非得說(shuō)什么架構(gòu),那么可能就是目前在 IDEA 中打開(kāi)的工程就是架構(gòu)。
拋開(kāi)技術(shù)圈內(nèi)的架構(gòu)而已,蓋房子的圖紙算不算架構(gòu)、做豆腐的步驟算不算架構(gòu)、結(jié)婚的流程算不算架構(gòu)?歸納得出,所有的這些步驟都在計(jì)算成本、耗材、執(zhí)行和產(chǎn)出,那么架構(gòu)就可以看做是一個(gè)用于完成目標(biāo)結(jié)果的指導(dǎo)藍(lán)圖,現(xiàn)在在放到技術(shù)架構(gòu)的層面來(lái)看,架構(gòu)就不只是我們研發(fā)人員用到的技術(shù)框架,還需要根據(jù)場(chǎng)景、規(guī)模,設(shè)定技術(shù)選型、實(shí)施標(biāo)準(zhǔn)、部署結(jié)構(gòu),綜合來(lái)完成一個(gè)項(xiàng)目的交付。
- 應(yīng)用場(chǎng)景:你的應(yīng)用場(chǎng)景是最先決定你采用哪種架構(gòu)的,這可能會(huì)包括:電商、交易、社交、視頻、音樂(lè)、出行、外賣(mài)等等,當(dāng)然除了互聯(lián)網(wǎng)中的應(yīng)用場(chǎng)景,還會(huì)有一些基于物聯(lián)網(wǎng)的應(yīng)用,例如:PLC 應(yīng)用、IO 板卡、中繼器打碼以及你熟悉的小區(qū)自提柜。
- 業(yè)務(wù)規(guī)模:這決定了你的用戶范圍和體量,如果你是在當(dāng)下正火的抖音里開(kāi)發(fā)商城,那你的用戶體量基數(shù)從上線之初就會(huì)特別大,但如果你還是一個(gè)初創(chuàng)團(tuán)隊(duì)小電商,那么每天的QPS維持在 5~10,可能這個(gè)階段你就不需要有能承載多大體量的系統(tǒng)架構(gòu)。這也類(lèi)似網(wǎng)絡(luò)上的笑話,團(tuán)隊(duì)初期招聘某大廠大佬,上來(lái)就是超級(jí)架構(gòu)的建設(shè),沒(méi)等系統(tǒng)開(kāi)發(fā)完呢,公司沒(méi)了!
- 服務(wù)類(lèi)型:有了場(chǎng)景和規(guī)模的設(shè)定,接下來(lái)要考慮的內(nèi)容就是整個(gè)技術(shù)實(shí)現(xiàn)層面的內(nèi)容,服務(wù)類(lèi)型可能是整個(gè)團(tuán)隊(duì)最初對(duì)系統(tǒng)拆分模塊和如何支持的考量,有了業(yè)務(wù)的分層就可以劃分出由各個(gè)團(tuán)隊(duì)來(lái)協(xié)同支持開(kāi)發(fā)。當(dāng)然如果是小團(tuán)隊(duì)那么這一環(huán)節(jié)最好縮小,哪怕把所有的功能都開(kāi)發(fā)到一個(gè)系統(tǒng)里去,先快速驗(yàn)證市場(chǎng)是主要的。
- 部署結(jié)構(gòu):是部署結(jié)構(gòu)決定了開(kāi)發(fā)模式,單體部署、集群部署、分布式部署、云環(huán)境等,這些都會(huì)決定技術(shù)的選型和框架的結(jié)構(gòu)。例如不引用RPC,那么就很難實(shí)現(xiàn)分布式部署,如果不使用分庫(kù)分表和大數(shù)據(jù)環(huán)境,也很難支撐起分布式部署下的數(shù)據(jù)應(yīng)用。
- 開(kāi)發(fā)框架:MVC、DDD,這應(yīng)該是研發(fā)人員最先接觸到整個(gè)系統(tǒng)架構(gòu)中的代碼開(kāi)發(fā)部分,也就是具體功能的具體實(shí)現(xiàn)層,如果是單體應(yīng)用那么基本一個(gè) MVC 結(jié)構(gòu)就夠了,但如果是大體量的分布式部署,那么你的系統(tǒng)開(kāi)發(fā)里可能有的是操作數(shù)據(jù)庫(kù)的,有的是專門(mén)做業(yè)務(wù)的,有的是用于支持分布式任務(wù)和消費(fèi)MQ消息的。
- 技術(shù)選型:其實(shí)開(kāi)發(fā)框架,無(wú)論是 MVC 還是 DDD,都是不影響技術(shù)選型的,任何一種語(yǔ)言都可以放在同樣的架構(gòu)框架中進(jìn)行開(kāi)發(fā),比如你說(shuō) Java、PHP、GO,只不過(guò)它們都是在自己語(yǔ)言下有自己的解決方案。
綜上,就是我們研發(fā)人員在做架構(gòu)設(shè)計(jì)時(shí)要考慮的核心內(nèi)容,隨著我們技術(shù)的不斷迭代也會(huì)有更多更新的思想,就像20年熱起來(lái)中臺(tái)、21年熱起來(lái)的低代碼,都是為了更好的讓架構(gòu)降本增效的實(shí)施方案。
但如果想了解和學(xué)習(xí)架構(gòu),最好還是要從它是一顆小樹(shù)苗時(shí)候看起,看看它是如何一點(diǎn)點(diǎn)長(zhǎng)大的。在頭腦中有了一個(gè)這樣的架構(gòu)體系,也能讓大家更好的理解和設(shè)計(jì)你需要的架構(gòu)。
二、架構(gòu)演變
1. 單體架構(gòu)
- 體量:
- 技術(shù):tomcat、weblogic、Java、Mysql、MVC
- 描述:我的博客 bugstack.cn 基本就是這種架構(gòu),只不過(guò)開(kāi)發(fā)語(yǔ)言不是Java的。這種結(jié)構(gòu)適合體量較小的業(yè)務(wù)場(chǎng)景,通常都是大佬在互聯(lián)網(wǎng)初期自研的網(wǎng)站,不過(guò)現(xiàn)在這種模型并沒(méi)有過(guò)期,依舊有它的應(yīng)用場(chǎng)景。
2. 應(yīng)用與數(shù)據(jù)庫(kù)分離
- 體量:
- 技術(shù):tomcat、weblogic、Java、DB2、MVC
- 描述:這一階段的拆分其實(shí)沒(méi)有太多變體,主要是由于原有的單體架構(gòu)應(yīng)用和數(shù)據(jù)庫(kù)部署在一臺(tái)服務(wù)器上,導(dǎo)致性能不足。那么最簡(jiǎn)單高效的拆分就是把應(yīng)用和數(shù)據(jù)庫(kù)分離開(kāi)了,讓它們?cè)诟髯缘姆?wù)器上發(fā)揮最大性能。
3. 使用緩存抗量
- 體量:
- 技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis
- 描述:在這個(gè)階段大家發(fā)現(xiàn),我們需要頻繁的從數(shù)據(jù)庫(kù)中拉取數(shù)據(jù),非常耗費(fèi)性能。也嘗試把一部分?jǐn)?shù)據(jù)存放在本地內(nèi)存,但在服務(wù)重啟后這部分?jǐn)?shù)據(jù)就沒(méi)有了。因此引入了Redis這樣的緩存服務(wù),在這個(gè)階段還是非常大的提升了整體服務(wù)的性能。
4. 多應(yīng)用部署和Nginx反向代理
- 體量:
- 技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis、Nginx
- 描述:當(dāng)單個(gè)服務(wù)的承載體量已經(jīng)到極限了以后,就能想到的就是把服務(wù)部署多套,因?yàn)檫@些服務(wù)都是做著同樣的事,數(shù)據(jù)庫(kù)又都是統(tǒng)一一套的,那么通過(guò)Nginx的反向代理,就可以把用戶的請(qǐng)求分散到不同的服務(wù)上去,大大的減輕了服務(wù)壓力。
5. 數(shù)據(jù)庫(kù)讀寫(xiě)分離
體量:
技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis、Nginx
描述:數(shù)據(jù)庫(kù)的讀寫(xiě)分離設(shè)計(jì),更多的是因?yàn)槟承I(yè)務(wù)場(chǎng)景需要大量的事務(wù)性寫(xiě)入,影響到需要讀操作的業(yè)務(wù)。但讀寫(xiě)分離的設(shè)計(jì)并沒(méi)有太大程度上提升系統(tǒng)性能,因?yàn)楹艽蟪潭鹊淖x操作已經(jīng)使用 Redis 抗住。不過(guò)這樣的設(shè)計(jì)思路卻為后續(xù)的架構(gòu)模型提供了新的思路。
6. 應(yīng)用分組部署
- 體量:
- 技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis、Nginx
- 描述:所有業(yè)務(wù)都開(kāi)發(fā)在一個(gè)應(yīng)用上所能承載的用戶體量已經(jīng)到極限了,那么接下來(lái)最好架構(gòu)方式就把不同的業(yè)務(wù)拆分為不同的應(yīng)用,這些應(yīng)用都配有自己的數(shù)據(jù)庫(kù),也分別部署在自己的服務(wù)器內(nèi)。這樣一來(lái)就大大提升了整體的負(fù)載能力。
7. 應(yīng)用分庫(kù)設(shè)計(jì)
體量:
技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis、Nginx、MyCat
描述:當(dāng)應(yīng)用按照不同的業(yè)務(wù)各自系統(tǒng)拆分以后,接下來(lái)的瓶頸就在于已經(jīng)獨(dú)立的應(yīng)用用戶體量依舊很大,對(duì)應(yīng)的數(shù)據(jù)庫(kù)熱連接數(shù)持續(xù)增高。所以在當(dāng)前條件下,開(kāi)始設(shè)計(jì)應(yīng)用分庫(kù)操作,同時(shí)后可能也會(huì)在這個(gè)階段引入分表操作。這樣一來(lái)單個(gè)應(yīng)用的負(fù)載能力又得到了一大截的提升,但是拆庫(kù)以后也需要引入分布式事務(wù)、數(shù)據(jù)匯總等其他技術(shù)的使用,來(lái)解決拆庫(kù)新增的問(wèn)題。
8. RPC 分布式部署
體量:
技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis、Nginx、MyCat、RPC、LVS/F5
描述:在系統(tǒng)不斷的再精細(xì)化設(shè)計(jì)以后,其實(shí)某些服務(wù)并不需要持續(xù)的連庫(kù)操作,它們可能更多的是業(yè)務(wù)邏輯的包裝,同時(shí)這些數(shù)據(jù)庫(kù)層的操作應(yīng)用屬于底層系統(tǒng),那么就可以把這樣系統(tǒng)用于連庫(kù)操作,而上層服務(wù)通過(guò)RPC框架來(lái)連接這樣的服務(wù)。那么,現(xiàn)在就可以通過(guò)分布式部署的方式,提升整體的服務(wù)性能。
9. 應(yīng)用細(xì)分和網(wǎng)關(guān)引入
體量:
技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis、Nginx、MyCat、RPC、LVS/F5、網(wǎng)關(guān)、MQ、分布式任務(wù)、Elasticsearch
描述:從上到下的整個(gè)架構(gòu)演變過(guò)程,我們不斷的拆分應(yīng)用、單獨(dú)部署一直到應(yīng)用細(xì)分,都是在不斷的提升應(yīng)用服務(wù)的能力,讓各自應(yīng)用體負(fù)責(zé)獨(dú)立的事情。這個(gè)階段已經(jīng)開(kāi)始體現(xiàn)出微服務(wù)的能力了,同時(shí)這個(gè)階段也引入了上層的網(wǎng)關(guān)統(tǒng)一接入和下層的數(shù)據(jù)使用能力。
10. 低代碼編程和可復(fù)用
體量:
技術(shù):tomcat、weblogic、Java、Oracle、MVC、Redis、Nginx、MyCat、RPC、LVS/F5、網(wǎng)關(guān)、MQ、分布式任務(wù)、Elasticsearch、SDK、低代碼、支撐服務(wù)
描述:在目前這個(gè)階段服務(wù)框架基本已經(jīng)可以很好的支撐用戶體量,所以也開(kāi)始考慮如何更高效的開(kāi)發(fā)和交付問(wèn)題。那么也就引入了服務(wù)編排、服務(wù)治理以及通用的模塊、組件和中間件。而這些設(shè)計(jì)其實(shí)壓縮來(lái)看基本就是以前你開(kāi)發(fā)的一個(gè)應(yīng)用而已,不過(guò)把所有非業(yè)務(wù)邏輯的通用性功能不斷的拆分出來(lái)了,再通過(guò)這些細(xì)分的組件和服務(wù)能力的編排,提供所需接口,這樣一來(lái)也就大大的提升了可持續(xù)交付集成的效率。
三、架構(gòu)圖下載
有小伙伴反饋看了架構(gòu)圖,也有了點(diǎn)自己的想法,但是動(dòng)手畫(huà)的時(shí)候就很懵,不知道從哪開(kāi)始。那么小傅哥把畫(huà)的架構(gòu)圖原稿分享給大家,可以讓感興趣的小伙伴下載使用。
四、總結(jié)
- 本章也是小傅哥在整理系列架構(gòu)內(nèi)容資料的一個(gè)總結(jié),讓新人碼農(nóng)對(duì)架構(gòu)有一個(gè)從小到大的認(rèn)識(shí)。在總結(jié)整理時(shí)也結(jié)合現(xiàn)在的架構(gòu)簡(jiǎn)化了一部分內(nèi)容,因?yàn)橹挥袆兘z抽繭的看懂最主干的內(nèi)容,大家才好不斷的擴(kuò)展枝葉。
- 從演變的過(guò)程我們可以看到,業(yè)務(wù)體量會(huì)影響部署,部署形態(tài)會(huì)改變架構(gòu),架構(gòu)會(huì)呼應(yīng)開(kāi)發(fā)方式,最終語(yǔ)言只是當(dāng)前最合適某種架構(gòu)的工具,各項(xiàng)技術(shù)棧的運(yùn)用也是為了技術(shù)需求而存在。
- 最后,就是如果你也想讓圖表達(dá)出你的意思,那么可以嘗試畫(huà)一畫(huà)、總結(jié)總結(jié),找到一種能適合你表達(dá)出結(jié)果的畫(huà)圖結(jié)構(gòu)。