什么是微服務(wù)?如何拆分微服務(wù)?
在了解微服務(wù)之前,我們需要了解一下它的背景。
微服務(wù)的背景
大約在 2005年左右,隨著互聯(lián)網(wǎng)公司的快速發(fā)展,許多企業(yè)開始遇到單體應(yīng)用程序在可擴(kuò)展性和靈活性方面的瓶頸,為了應(yīng)對(duì)這些挑戰(zhàn),企業(yè)開始探索將應(yīng)用程序拆分成更小的、獨(dú)立的組件。
基于上述的背景,微服務(wù)的發(fā)展出現(xiàn)了幾個(gè)關(guān)鍵時(shí)刻:
- 2011年:在這段時(shí)間,行業(yè)內(nèi)開始廣泛使用“微服務(wù)”這一術(shù)語(yǔ)。雖然沒(méi)有一個(gè)明確的“首次提出”事件,但在技術(shù)會(huì)議、博客和相關(guān)文獻(xiàn)中,微服務(wù)的概念逐漸被討論和推廣。
- 2012年:James Lewis和 Martin Fowler在 ThoughtWorks的技術(shù)雷達(dá)和博客中發(fā)表了關(guān)于微服務(wù)的文章,詳細(xì)描述了微服務(wù)的特征和優(yōu)點(diǎn),這篇文章 被認(rèn)為是推動(dòng)微服務(wù)架構(gòu)普及的重要里程碑。
要理解微服務(wù),我們首先需要理解軟件架構(gòu)的演變,早期的軟件,所有功能都寫在一起,數(shù)據(jù)庫(kù)也共用一個(gè),這稱為單體架構(gòu)(monolithic software)。
單體軟件
單體軟件(Monolithic Software)是一種傳統(tǒng)的軟件架構(gòu)風(fēng)格,其中所有的功能組件都被打包成一個(gè)獨(dú)立的、不可分割的應(yīng)用程序?qū)嵗?。在單體架構(gòu)中,應(yīng)用程序的所有部分(如用戶界面、業(yè)務(wù)邏輯、數(shù)據(jù)訪問(wèn)層等)都是緊密集成在一起的。這種架構(gòu)的構(gòu)建方式在軟件開發(fā)的早期階段特別普遍,因?yàn)樵诋?dāng)時(shí)的硬件限制和軟件工具鏈條件下,單體應(yīng)用程序相對(duì)容易設(shè)計(jì)、實(shí)現(xiàn)和部署。
單體架構(gòu)的模型可以抽象成下圖:
1.單體軟件架構(gòu)的特點(diǎn)
- 統(tǒng)一代碼庫(kù):所有功能與模塊共享一個(gè)代碼庫(kù),所有開發(fā)人員都在同一代碼庫(kù)中進(jìn)行協(xié)作。
- 集成部署:整個(gè)應(yīng)用程序被作為一個(gè)單獨(dú)的單元進(jìn)行構(gòu)建和部署。如果需要對(duì)應(yīng)用的任何部分進(jìn)行更新或修復(fù),通常需要重新構(gòu)建并重新部署整個(gè)應(yīng)用。
- 規(guī)模龐大:隨著時(shí)間的推移,單體應(yīng)用程序往往會(huì)變得規(guī)模龐大,代碼復(fù)雜度增加,管理和理解難度加大。
- 緊密耦合:各個(gè)模塊間往往緊密耦合,程序的不同部分共享較多的代碼和資源。
22.單體軟件的優(yōu)勢(shì)
盡管單體軟件在現(xiàn)代軟件開發(fā)中逐漸被微服務(wù)架構(gòu)所取代,它仍然有一些優(yōu)勢(shì):
- 簡(jiǎn)單開發(fā)和測(cè)試:由于整個(gè)應(yīng)用整合在一個(gè)代碼庫(kù)中,開發(fā)人員可以容易理解整個(gè)系統(tǒng)的運(yùn)作。這種集中性簡(jiǎn)化了測(cè)試和調(diào)試。
- 快速部署:作為一個(gè)整體進(jìn)行部署,可以簡(jiǎn)化部署流程,尤其對(duì)于小型應(yīng)用或者新項(xiàng)目來(lái)說(shuō),能迅速發(fā)布上線。
- 簡(jiǎn)單監(jiān)控與管理:只需要管理一個(gè)平臺(tái)或者服務(wù),可以有更簡(jiǎn)便的監(jiān)控管理和日志處理。
3.單體軟件的局限性
隨著應(yīng)用程序功能的擴(kuò)展和用戶數(shù)量的增長(zhǎng),單體軟件架構(gòu)的局限性開始顯現(xiàn):
- 規(guī)模和復(fù)雜性問(wèn)題:應(yīng)用程序的代碼庫(kù)可能變得非常龐大,導(dǎo)致理解和管理變得困難。代碼變動(dòng)的風(fēng)險(xiǎn)較高,單一的變更可能造成意外的副作用。
- 限制靈活性:由于所有模塊打包在一起,技術(shù)棧的變更和更新難度增大。此外,無(wú)法針對(duì)某些模塊單獨(dú)進(jìn)行技術(shù)升級(jí)或替換。
- 部署瓶頸:即便是小的改動(dòng),也可能導(dǎo)致重新構(gòu)建和部署整個(gè)應(yīng)用程序,增加了部署成本和時(shí)間。有時(shí)可能需要停機(jī)來(lái)完成部署,影響用戶體驗(yàn)。
- 可擴(kuò)展性受限:?jiǎn)误w架構(gòu)難以滿足不同模塊的不同擴(kuò)展需求,當(dāng)某個(gè)模塊需要擴(kuò)展時(shí),無(wú)法單獨(dú)進(jìn)行擴(kuò)展,需要擴(kuò)展整個(gè)應(yīng)用,資源使用效率降低。
- 服務(wù)故障隔離差:一個(gè)模塊的故障可能導(dǎo)致整個(gè)系統(tǒng)的非正常運(yùn)行,從而影響整個(gè)服務(wù)的可用性和可靠性。
- 面臨技術(shù)債務(wù):隨著技術(shù)更新的需求(如引入新的開發(fā)框架或庫(kù)),在單體架構(gòu)中解決技術(shù)債務(wù)的成本和風(fēng)險(xiǎn)較高。
由于上述局限性,許多企業(yè)選擇將單體應(yīng)用系統(tǒng)逐步轉(zhuǎn)型為微服務(wù)架構(gòu),微服務(wù)架構(gòu)可以通過(guò)將大型應(yīng)用程序分解為多個(gè)小型、獨(dú)立的服務(wù)來(lái)避免單體架構(gòu)的限制,從而實(shí)現(xiàn)更高的靈活性、可擴(kuò)展性和故障隔離。
什么是微服務(wù)?
微服務(wù)架構(gòu)的核心理念是將單體應(yīng)用程序拆分為多個(gè)小型服務(wù),每個(gè)服務(wù)都是一個(gè)獨(dú)立的進(jìn)程,通常通過(guò)輕量級(jí)的通信機(jī)制(如HTTP/REST、消息隊(duì)列等)進(jìn)行交互。每個(gè)微服務(wù)都擁有自己的數(shù)據(jù)存儲(chǔ),可以選擇最適合其功能的數(shù)據(jù)庫(kù)類型。
微服務(wù)架構(gòu)的模型可以抽象成下圖:
微服務(wù)主要包含以下 5個(gè)特點(diǎn):
- 單一職責(zé)原則:微服務(wù)的設(shè)計(jì)理念強(qiáng)調(diào)每個(gè)服務(wù)模塊應(yīng)該聚焦于完成一項(xiàng)特定的任務(wù)或功能,遵循單一職責(zé)原則。這意味著每個(gè)微服務(wù)應(yīng)該解決某一特定業(yè)務(wù)領(lǐng)域的問(wèn)題,使得服務(wù)更易于開發(fā)、維護(hù)和理解。
- 獨(dú)立部署:微服務(wù)可以獨(dú)立部署和更新,而無(wú)需影響整個(gè)系統(tǒng)。這樣一來(lái),可以更快地響應(yīng)業(yè)務(wù)需求的變化,部署新的功能也更加便捷。
- 去中心化管理和治理:在微服務(wù)架構(gòu)中,基礎(chǔ)設(shè)施和服務(wù)的開發(fā)由不同的團(tuán)隊(duì)負(fù)責(zé),這樣各個(gè)團(tuán)隊(duì)可以根據(jù)自身的技術(shù)棧獨(dú)立決定如何實(shí)現(xiàn)服務(wù),并采用適合的技術(shù)進(jìn)行治理。去中心化的治理模型支持團(tuán)隊(duì)的敏捷性和創(chuàng)新。
- 自治性:每個(gè)微服務(wù)都是自治的,擁有自己獨(dú)立的數(shù)據(jù)存儲(chǔ)和業(yè)務(wù)邏輯。這種自治性使得服務(wù)之間的耦合度降低,從而提高了系統(tǒng)的魯棒性。
- 輕量級(jí)通信:微服務(wù)之間的通信通常是輕量級(jí)的,常用的協(xié)議有HTTP/REST、gRPC、AMQP等。這些協(xié)議以其跨平臺(tái)和靈活性著稱,適合復(fù)雜分布式環(huán)境下的服務(wù)交互。
如何拆分?
為了更好地理解微服務(wù)架構(gòu),這里以電商服務(wù)為例,假如某電商的場(chǎng)景有商品功能,訂單功能,支付功能,用戶功能,運(yùn)營(yíng)功能,倉(cāng)儲(chǔ)功能等6個(gè)功能,當(dāng)業(yè)務(wù)量比較小時(shí),我們可以將這 6個(gè)功能點(diǎn)都在一個(gè)單體服務(wù)中開發(fā)和維護(hù),但是,隨著業(yè)務(wù)的快速發(fā)展以及技術(shù)團(tuán)隊(duì)的壯大,單體服務(wù)就出現(xiàn)很大的問(wèn)題,因此,我們需要使用微服務(wù)架構(gòu),理想情況下的微服務(wù)設(shè)計(jì)如下圖:
各個(gè)微服務(wù)的功能說(shuō)明如下:
- 商品中心:負(fù)責(zé)商品分類、商品列表、商品詳情頁(yè)、商品檢索、商品評(píng)價(jià)等業(yè)務(wù)
- 訂單中心:負(fù)責(zé)訂單創(chuàng)建、管理,促銷和優(yōu)惠的計(jì)算等
- 支付中心:負(fù)責(zé)支付相關(guān)的業(yè)務(wù)流程,同時(shí)財(cái)務(wù)結(jié)算也劃分到該微服務(wù)中
- 用戶中心:負(fù)責(zé)用戶信息的管理,以及用戶名下訂單、優(yōu)惠券、權(quán)益等的管理(該部分未在上圖呈現(xiàn)出來(lái))
- 運(yùn)營(yíng)中心:負(fù)責(zé)商品的個(gè)性化推薦、秒殺預(yù)售等活動(dòng)的支持,以及優(yōu)惠券的發(fā)放
- 倉(cāng)儲(chǔ)中心:負(fù)責(zé)庫(kù)存管理和物流管理
但是,從單體服務(wù)到微服務(wù)受到很多因素的影響很難拆分得一步到位,因此,我們可能會(huì)經(jīng)過(guò)下面的拆分過(guò)程,所以微服務(wù)中的拆分粒度是根據(jù)具體的業(yè)務(wù)場(chǎng)景和技術(shù)能力來(lái)拆分的。
從上面微服務(wù)拆分迭代的過(guò)程可以看出,拆分過(guò)程中的任何一個(gè)階段都是合理存在并且有可能是微服務(wù)的最終拆分結(jié)果,拆分的粒度完全全局于業(yè)務(wù)場(chǎng)景和業(yè)務(wù)體量。因此,在微服務(wù)架構(gòu)中,過(guò)度拆分也是需要重點(diǎn)關(guān)注的一個(gè)問(wèn)題。
微服務(wù)的優(yōu)勢(shì)
- 可擴(kuò)展性:由于微服務(wù)架構(gòu)將應(yīng)用拆分成多個(gè)小型服務(wù),每個(gè)服務(wù)可以根據(jù)負(fù)載進(jìn)行單獨(dú)擴(kuò)展。這使得系統(tǒng)具備高擴(kuò)展性和高并發(fā)處理能力。
- 靈活性和敏捷性:微服務(wù)架構(gòu)允許團(tuán)隊(duì)按照自身的需要選擇適合的技術(shù)棧,并獨(dú)立進(jìn)行開發(fā)和部署。這種靈活性加快了產(chǎn)品的迭代速度,增強(qiáng)了系統(tǒng)對(duì)業(yè)務(wù)變化的敏捷響應(yīng)能力。
- 故障隔離:在一個(gè)微服務(wù)體系下,如果某個(gè)服務(wù)出現(xiàn)故障,理論上只會(huì)影響到該服務(wù)的功能,而不會(huì)導(dǎo)致整個(gè)系統(tǒng)的癱瘓。這樣有助于系統(tǒng)的穩(wěn)定性和可靠運(yùn)行。
- 技術(shù)多樣性:微服務(wù)架構(gòu)允許各個(gè)服務(wù)采用不同的技術(shù)棧進(jìn)行開發(fā),這意味著可以為不同的服務(wù)選擇最適合的框架、語(yǔ)言和工具,優(yōu)化各個(gè)服務(wù)的開發(fā)效率和性能。
總結(jié)
本文,我們分析了什么是微服務(wù),分析了它和單體服務(wù)的對(duì)比,以及如何拆分微服務(wù)。微服務(wù)是現(xiàn)在主流的應(yīng)用解決方案,它將應(yīng)用拆分成多個(gè)小型服務(wù),每個(gè)服務(wù)可以根據(jù)負(fù)載進(jìn)行單獨(dú)擴(kuò)展,這使得系統(tǒng)具備高擴(kuò)展性和高并發(fā)處理能力,同時(shí)也提高了系統(tǒng)的故障隔離和敏捷性。但是,微服務(wù)的拆分粒度是根據(jù)具體的業(yè)務(wù)場(chǎng)景和技術(shù)能力來(lái)拆分的,拆分粒度完全全局于業(yè)務(wù)場(chǎng)景和業(yè)務(wù)體量。因此,微服務(wù)的拆分沒(méi)有一個(gè)統(tǒng)一的標(biāo)準(zhǔn)。