本文是 Service Mesh 系列文章的第一篇,旨在通過(guò)介紹互聯(lián)網(wǎng)架構(gòu)的演進(jìn)過(guò)程,幫助大家理解微服務(wù)(Microservices)以及服務(wù)網(wǎng)格(Service Mesh)的概念和出現(xiàn)的原因。
互聯(lián)網(wǎng)產(chǎn)品往往具備用戶量大、高并發(fā)、PB 級(jí)別的數(shù)據(jù)存儲(chǔ)等特點(diǎn),同時(shí)還需保證系統(tǒng)的高可用和彈性伸縮。面對(duì)用戶的需求,還需要快速迭代。這些都迫使系統(tǒng)架構(gòu)發(fā)生從簡(jiǎn)到繁的演進(jìn)?;ヂ?lián)網(wǎng)架構(gòu)先后經(jīng)歷了單體架構(gòu)、集群架構(gòu)、分布式架構(gòu)、SOA、Microservices、Service Mesh。
單體架構(gòu)
架構(gòu)的發(fā)展都是由簡(jiǎn)到繁,單體架構(gòu)在歷史的潮流中也經(jīng)歷了多次的演變。
簡(jiǎn)單架構(gòu)
早期互聯(lián)網(wǎng)產(chǎn)品用戶量少,并發(fā)量低,數(shù)據(jù)量小,多數(shù)只需要單個(gè)應(yīng)用服務(wù)器可以滿足需要,而數(shù)據(jù)庫(kù)和文件服務(wù)部署在外部單個(gè)服務(wù)器上,這就是早期的互聯(lián)網(wǎng)架構(gòu),如下圖所示:

特點(diǎn):
- 所有的功能集成在一個(gè)項(xiàng)目工程中
- 所有的功能打一個(gè) war 包部署到服務(wù)器
- 應(yīng)用與數(shù)據(jù)庫(kù)分開(kāi)部署
- 通過(guò)部署應(yīng)用集群和數(shù)據(jù)庫(kù)集群來(lái)提高系統(tǒng)的性能
優(yōu)點(diǎn):
- 項(xiàng)目架構(gòu)簡(jiǎn)單,前期開(kāi)發(fā)成本低,周期短,小型項(xiàng)目的首選
缺點(diǎn):
- 全部功能集成在一個(gè)工程中,一旦出現(xiàn)故障,無(wú)法轉(zhuǎn)移,在升級(jí)維護(hù)中也必須進(jìn)行停機(jī),可用性低,對(duì)于大型項(xiàng)目不易開(kāi)發(fā)、擴(kuò)展及維護(hù)
- 系統(tǒng)性能擴(kuò)展只能通過(guò)擴(kuò)展集群結(jié)點(diǎn),成本高、有瓶頸
- 技術(shù)棧受限
讀寫分離與緩存
隨著業(yè)務(wù)增長(zhǎng),訪問(wèn)量和數(shù)據(jù)量快速膨脹,應(yīng)用服務(wù)器和數(shù)據(jù)庫(kù)服務(wù)器性能瓶頸越來(lái)越明顯。單體服務(wù)總是資源有限,而單個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)流量越來(lái)越大,數(shù)據(jù)的訪問(wèn)性能也明顯下降。
為了降低數(shù)據(jù)庫(kù)的訪問(wèn)壓力,對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫分離、分庫(kù)分表等優(yōu)化。
- 讀寫分離:將數(shù)據(jù)庫(kù)分為主從數(shù)據(jù)庫(kù),從庫(kù)實(shí)時(shí)同步主庫(kù)的更新內(nèi)容。寫請(qǐng)求訪問(wèn)主數(shù)據(jù)庫(kù),讀請(qǐng)求訪問(wèn)從數(shù)據(jù)庫(kù)。
- 分庫(kù)分表:把原本存儲(chǔ)于一個(gè)庫(kù)的數(shù)據(jù)分塊存儲(chǔ)到多個(gè)庫(kù)上,把原本存儲(chǔ)于一個(gè)表的數(shù)據(jù)分塊存儲(chǔ)到多個(gè)表上。
讀寫分離和分庫(kù)分表在一定程度上分解了數(shù)據(jù)庫(kù)訪問(wèn)壓力。
在實(shí)際開(kāi)發(fā)中,數(shù)據(jù)經(jīng)常會(huì)出現(xiàn)如下特征:
- 大部分的業(yè)務(wù)數(shù)據(jù)只集中于數(shù)據(jù)中的一小部分
- 有些數(shù)據(jù)是需要經(jīng)常讀取,但是更新很少
- 有些數(shù)據(jù)是訪問(wèn)量非常大的數(shù)據(jù)塊
這些情況下我們就需要引入緩存層, 如果訪問(wèn)命中緩存,既能減小數(shù)據(jù)庫(kù)的訪問(wèn)壓力,又可以提高數(shù)據(jù)訪問(wèn)性能。緩存的發(fā)展也是由簡(jiǎn)單到復(fù)雜,由本地緩存到緩存集群,由單點(diǎn)到高可用。
- 本地緩存可以提供快速訪問(wèn),但無(wú)法實(shí)現(xiàn)共享,無(wú)法保證高可用。
- 緩存集群可以提供高可用、可共享、大容量的存儲(chǔ),緩存層降低數(shù)據(jù)庫(kù)的讀寫 IO,有效提升系統(tǒng)響應(yīng)能力。

動(dòng)靜分離
動(dòng)靜分離技術(shù)是將服務(wù)的靜態(tài)資源與后臺(tái)應(yīng)用進(jìn)行分開(kāi)部署,提高用戶訪問(wèn)靜態(tài)資源的速度,降低對(duì)后臺(tái)的訪問(wèn)壓力。
靜態(tài)資源一般放在 CDN 上,部署在網(wǎng)絡(luò)提供商的機(jī)房。用戶在訪問(wèn)靜態(tài)資源時(shí),可以很好的利用 CDN 的優(yōu)點(diǎn),從距離自己最近的網(wǎng)絡(luò)提供商機(jī)房獲取數(shù)據(jù)。
動(dòng)靜分離后,后端應(yīng)用更為服務(wù)化,更多的是提供 api 接口,前端可以通過(guò)更加專業(yè)的技術(shù)提高訪問(wèn)效率。但同時(shí)靜態(tài)文件的緩存更新以及前后端的更新成本都是動(dòng)靜分離所帶來(lái)的問(wèn)題。

集群架構(gòu)
隨著用戶規(guī)模和業(yè)務(wù)量的不斷上漲,單個(gè)應(yīng)用服務(wù)器將出現(xiàn)性能瓶頸,對(duì)于 PB 級(jí)的數(shù)據(jù)和高并發(fā)用戶大流量訪問(wèn),單一或者主備的數(shù)據(jù)庫(kù)、文件系統(tǒng)都已經(jīng)不能滿足需求,需要集群化來(lái)分擔(dān)負(fù)載。
當(dāng)數(shù)據(jù)規(guī)模達(dá)到一定規(guī)模,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)性能下滑非常嚴(yán)重,通過(guò)分庫(kù)分表也難以應(yīng)對(duì),為了支撐海量數(shù)據(jù)和流量,出現(xiàn)了 NoSql 數(shù)據(jù)庫(kù),它關(guān)注對(duì)數(shù)據(jù)高并發(fā)地讀寫和對(duì)海量數(shù)據(jù)的存儲(chǔ)。
應(yīng)用服務(wù)器從單體變?yōu)榧?,客戶端也不再是直接接入后端?yīng)用,而是轉(zhuǎn)而通過(guò)負(fù)載均衡設(shè)備代理后端多個(gè)服務(wù)器集群,一方面將訪問(wèn)壓力分?jǐn)偟搅硕鄠€(gè)后端應(yīng)用上,單個(gè)應(yīng)用不再是性能瓶頸,另一方面可以實(shí)現(xiàn)服務(wù)路由,以及異常熔斷等特性。

分布式架構(gòu)
隨著業(yè)務(wù)場(chǎng)景的復(fù)雜化,存儲(chǔ)規(guī)模越來(lái)越龐大。將業(yè)務(wù)進(jìn)行拆分并分而治之成為更好的選擇。大型的業(yè)務(wù)被細(xì)分為單個(gè)更小的子業(yè)務(wù)。例如對(duì)于電商系統(tǒng),按功能維度我們可以拆分為商品中心,訂單中心,用戶中心,購(gòu)物車,結(jié)算等功能模塊。每一個(gè)子模塊由不同的業(yè)務(wù)團(tuán)隊(duì)負(fù)責(zé)。每個(gè)子業(yè)務(wù)模塊進(jìn)行獨(dú)立開(kāi)發(fā)、部署、運(yùn)維。
隨著對(duì)業(yè)務(wù)場(chǎng)景越來(lái)越細(xì)的劃分,模塊越來(lái)越多,整個(gè)應(yīng)用的復(fù)雜度也越來(lái)越高,大量的獨(dú)立子應(yīng)用對(duì)數(shù)據(jù)庫(kù)的獨(dú)立訪問(wèn),導(dǎo)致后端數(shù)據(jù)庫(kù)的壓力越來(lái)越大,需要將各個(gè)子應(yīng)用的重疊邏輯再進(jìn)行抽取為獨(dú)立子服務(wù),子應(yīng)用服務(wù)之間通過(guò) RPC 或者消息系統(tǒng)進(jìn)行相互通信,因此出現(xiàn)了分布式應(yīng)用。

SOA
隨著應(yīng)用的更細(xì)力度的拆分,逐漸呈現(xiàn)了一個(gè)相互依賴、公共的模塊,這些模塊大都依賴于相同的邏輯或者功能代碼。這時(shí)候就需要把這些應(yīng)用的公用模塊提出來(lái),采用獨(dú)立部署統(tǒng)一管理的方式,提高重用度,這就是服務(wù)導(dǎo)向架構(gòu)(SOA)。
SOA 是一種理念,它的主要特性:面向服務(wù)的計(jì)算,服務(wù)之間松散耦合,支持服務(wù)的封裝,服務(wù)注冊(cè)和自動(dòng)發(fā)現(xiàn)。SOA 并沒(méi)有定義出具體的實(shí)現(xiàn)方式,目前一種主要的實(shí)現(xiàn)方式是企業(yè)服務(wù)總線(Enterprise Service Bus,ESB),ESB 的根本目標(biāo)是解決異構(gòu)系統(tǒng)的連通性,通過(guò)協(xié)議轉(zhuǎn)換、消息解析、消息路由把服務(wù)提供者的數(shù)據(jù)傳遞到服務(wù)消費(fèi)者。所以 SOA 的中心化雖然重,但是會(huì)解決一些公用邏輯的問(wèn)題。

微服務(wù)
SOA 架構(gòu)實(shí)現(xiàn)了松耦合,系統(tǒng)之間通過(guò)服務(wù)接口和 ESB 進(jìn)行交互。但這種拆分往往是業(yè)務(wù)系統(tǒng)的一種垂直拆分,拆分的子系統(tǒng)隨著業(yè)務(wù)的復(fù)雜耦合仍然面臨難以開(kāi)發(fā)和維護(hù)的問(wèn)題。因此更細(xì)粒度的拆分變得必要,將子系統(tǒng)功能進(jìn)一步拆分,變成一項(xiàng)項(xiàng)的服務(wù)。系統(tǒng)分布式架構(gòu),服務(wù)去中心化實(shí)現(xiàn),也即微服務(wù)的思想。
Martin Fowler 在 2014 年定義了微服務(wù)架構(gòu)的概念:微服務(wù)架構(gòu)是一種軟件系統(tǒng)風(fēng)格。這種架構(gòu)風(fēng)格就是把一組小服務(wù)演化成為一個(gè)單一的應(yīng)用的一種方法。每個(gè)應(yīng)用都運(yùn)行在自己的進(jìn)程中,并通過(guò)輕量級(jí)的機(jī)制保持通信,就像 HTTP 這樣的 API。這些服務(wù)要基于業(yè)務(wù)場(chǎng)景,并使用自動(dòng)化布署工具進(jìn)行獨(dú)立的發(fā)布。可以有一個(gè)非常輕量級(jí)的集中式管理來(lái)協(xié)調(diào)這些服務(wù),可以使用不同的語(yǔ)言來(lái)編寫服務(wù),也可以使用不同的數(shù)據(jù)存儲(chǔ)。
微服務(wù)架構(gòu)通過(guò)業(yè)務(wù)拆分實(shí)現(xiàn)服務(wù)組件化,通過(guò)組件組合快速開(kāi)發(fā)系統(tǒng),業(yè)務(wù)單一的服務(wù)組件又可以獨(dú)立部署,使得整個(gè)系統(tǒng)變得清晰靈活。但是,大量的分布式服務(wù)又使得架構(gòu)實(shí)現(xiàn)面臨許多問(wèn)題。
- 服務(wù)注冊(cè)發(fā)現(xiàn)
- 服務(wù)統(tǒng)一入口
- 鑒權(quán)
- 負(fù)載均衡
- 服務(wù)配置的集中管理
- 熔斷
- 監(jiān)控
- …
所以在微服務(wù)架構(gòu)中除了業(yè)務(wù)服務(wù)組件外通常會(huì)引入服務(wù)注冊(cè)發(fā)現(xiàn)組件來(lái)進(jìn)行服務(wù)治理;引入服務(wù)網(wǎng)關(guān)來(lái)提供統(tǒng)一入口和鑒權(quán);引入負(fù)載均衡組件來(lái)提供客戶端或服務(wù)器端的負(fù)載均衡;引入集中配置組件來(lái)提供服務(wù)集中管理;引入熔斷器組件來(lái)提供服務(wù)熔斷;引入服務(wù)追蹤組件來(lái)提供服務(wù)監(jiān)控等。因此微服務(wù)架構(gòu)是由這些基礎(chǔ)的服務(wù)組件和業(yè)務(wù)微服務(wù)組件共同組成,如下圖所示:

Service Mesh
Service Mesh 是在微服務(wù)架構(gòu)盛行的必然產(chǎn)物。Service Mesh 可以說(shuō)是微服務(wù)架構(gòu)的一種實(shí)現(xiàn),它提供了一種透明的、與編程語(yǔ)言無(wú)關(guān)的方式,使網(wǎng)絡(luò)配置、安全配置以及遙測(cè)等操作能夠靈活而簡(jiǎn)便地實(shí)現(xiàn)自動(dòng)化。Service Mesh 將開(kāi)發(fā)人員從服務(wù)之間的交互中釋放出來(lái),專心維護(hù)業(yè)務(wù)邏輯。Service Mesh 是解決服務(wù)間通訊的基礎(chǔ)設(shè)施層,用于代理服務(wù)間的通信,來(lái)負(fù)責(zé)消息直接按需傳遞,開(kāi)發(fā)人員不再需要在考慮服務(wù)發(fā)現(xiàn)等非業(yè)務(wù)邏輯,服務(wù)治理也上升到統(tǒng)一的層面。從本質(zhì)上說(shuō),Service Mesh 解耦了服務(wù)的開(kāi)發(fā)與運(yùn)維工作。
Service Mesh 通常是通過(guò)一組輕量級(jí)網(wǎng)絡(luò)代理(Sidecar proxy),與應(yīng)用程序代碼部署在一起來(lái)實(shí)現(xiàn),而無(wú)需感知應(yīng)用程序本身。

不同的業(yè)務(wù)之間通過(guò) Service Mesh 進(jìn)行通訊,Service Mesh 根據(jù)預(yù)先定義好的規(guī)則進(jìn)行流量治理:可以配置 A/B 測(cè)試,金絲雀發(fā)布,同樣也可以根據(jù) Service Mesh 的進(jìn)行流量統(tǒng)計(jì)。
微服務(wù)大量部署之后,每個(gè)服務(wù)節(jié)點(diǎn)的 Sidecar 自然就形成了一個(gè)網(wǎng)格, 如下圖所示:

更多 Service Mesh 的知識(shí)點(diǎn)可以閱讀 什么是 Service Mesh(服務(wù)網(wǎng)格) 和 Istio。
小結(jié)
本文主要向大家介紹了互聯(lián)網(wǎng)架構(gòu)的演進(jìn),幫助大家理解 Service Mesh 的概念和出現(xiàn)的原因。后續(xù)的文章,我們將通過(guò)理論和實(shí)踐相結(jié)合的形式繼續(xù)講解 Service Mesh,咱們下一篇見(jiàn)。