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