介紹:?jiǎn)误w架構(gòu)發(fā)展到微服務(wù)架構(gòu))
單體架構(gòu)與微服務(wù)架構(gòu)對(duì)比Spring Cloud 微服務(wù)入門(mén)指南—1.1 什么是單體架構(gòu)單體架構(gòu)Monolithic Architecture是指把應(yīng)用的所有功能模塊全部打進(jìn)同一個(gè)程序里部署后跑在同一個(gè)進(jìn)程中的架構(gòu)模式。它是傳統(tǒng)軟件開(kāi)發(fā)中最常見(jiàn)、最基礎(chǔ)的架構(gòu)形態(tài)。## 1.2 單體架構(gòu)優(yōu)缺點(diǎn)單體架構(gòu)的優(yōu)點(diǎn)優(yōu)點(diǎn)說(shuō)明開(kāi)發(fā)簡(jiǎn)單直觀代碼都在一個(gè)工程里不用處理分布式問(wèn)題IDE 友好、調(diào)試方便小團(tuán)隊(duì)能快速啟動(dòng)部署方便快捷打一個(gè) WAR/JAR 包即可發(fā)布不需要容器編排和服務(wù)編排測(cè)試容易集成端到端測(cè)試起一個(gè)應(yīng)用就行不用為服務(wù)間依賴做一堆 mock集成測(cè)試覆蓋率高性能開(kāi)銷(xiāo)小模塊間是進(jìn)程內(nèi)調(diào)用沒(méi)有網(wǎng)絡(luò)和序列化開(kāi)銷(xiāo)響應(yīng)延遲低技術(shù)棧統(tǒng)一團(tuán)隊(duì)只學(xué)一套技術(shù)體系培訓(xùn)和招人成本低事務(wù)一致性簡(jiǎn)單本地事務(wù)就能保證數(shù)據(jù)一致不用碰分布式事務(wù)單體架構(gòu)的缺點(diǎn)缺點(diǎn)說(shuō)明代碼高度耦合功能一多模塊邊界就模糊改一處牽全身維護(hù)成本漲得很快擴(kuò)展困難只能整個(gè)應(yīng)用一起擴(kuò)容沒(méi)法單獨(dú)給某個(gè)高負(fù)載模塊擴(kuò)容資源利用率低技術(shù)棧受限全局一套選型想給某個(gè)模塊換技術(shù)很難新技術(shù)的采用受制于歷史包袱部署影響面大改一處就要全量發(fā)布風(fēng)險(xiǎn)高一次發(fā)布可能讓整個(gè)系統(tǒng)不可用啟動(dòng)越來(lái)越慢代碼膨脹后啟動(dòng)時(shí)間從幾秒漲到幾分鐘開(kāi)發(fā)體驗(yàn)和彈性伸縮都受影響團(tuán)隊(duì)協(xié)作困難多團(tuán)隊(duì)改同一個(gè)代碼庫(kù)沖突頻繁合并和發(fā)布的協(xié)調(diào)成本很高單點(diǎn)故障風(fēng)險(xiǎn)任何一個(gè)模塊的內(nèi)存泄漏或異常都可能拖垮整個(gè)進(jìn)程故障隔離能力弱技術(shù)債務(wù)累積改不動(dòng)、不敢改的模塊越來(lái)越多架構(gòu)腐化加劇新人上手門(mén)檻持續(xù)升高二、微服務(wù)架構(gòu)上面介紹了單體架構(gòu)這時(shí)候就要引入微服務(wù)架構(gòu)了。2.1 什么是微服務(wù)架構(gòu)微服務(wù)架構(gòu)Microservices Architecture是把單一應(yīng)用拆成一組小型、獨(dú)立部署的服務(wù)的架構(gòu)風(fēng)格。每個(gè)服務(wù)圍繞一個(gè)明確的業(yè)務(wù)能力構(gòu)建跑在自己的進(jìn)程里服務(wù)間通過(guò)輕量級(jí)通信機(jī)制如 HTTP/REST、消息隊(duì)列協(xié)作。簡(jiǎn)單來(lái)說(shuō)單體架構(gòu)就像是把一堆藥材堆在一起而微服務(wù)架構(gòu)則是把這堆藥材按功效做了分類(lèi)。2.2 單體架構(gòu) 與 微服務(wù)架構(gòu)對(duì)比對(duì)比維度單體架構(gòu)微服務(wù)架構(gòu)架構(gòu)理念一個(gè)應(yīng)用包含一切每個(gè)服務(wù)做好一件事通信機(jī)制進(jìn)程內(nèi)方法調(diào)用零網(wǎng)絡(luò)開(kāi)銷(xiāo)網(wǎng)絡(luò)遠(yuǎn)程調(diào)用存在序列化與網(wǎng)絡(luò)開(kāi)銷(xiāo)數(shù)據(jù)管理共享單一數(shù)據(jù)庫(kù)每服務(wù)獨(dú)享數(shù)據(jù)庫(kù)數(shù)據(jù)邊界清晰部署粒度全量構(gòu)建全量部署單服務(wù)獨(dú)立構(gòu)建獨(dú)立部署擴(kuò)展能力整體復(fù)制無(wú)法精準(zhǔn)擴(kuò)容按服務(wù)負(fù)載獨(dú)立擴(kuò)縮容故障隔離弱一處異常全盤(pán)崩潰強(qiáng)故障可隔離在單個(gè)服務(wù)運(yùn)維復(fù)雜度低一套部署一套監(jiān)控高需服務(wù)治理、分布式監(jiān)控、容器編排適用階段項(xiàng)目初期、小型應(yīng)用、團(tuán)隊(duì)≤10人業(yè)務(wù)復(fù)雜、團(tuán)隊(duì)規(guī)?;?、需快速迭代選型建議架構(gòu)選型沒(méi)有絕對(duì)優(yōu)劣關(guān)鍵是匹配業(yè)務(wù)階段。項(xiàng)目初期優(yōu)先用單體架構(gòu)快速驗(yàn)證業(yè)務(wù)模式當(dāng)業(yè)務(wù)復(fù)雜度上升再逐步向微服務(wù)演進(jìn)。盲目提前微服務(wù)化只會(huì)帶來(lái)不必要的復(fù)雜度。2.3 微服務(wù)架構(gòu)優(yōu)缺點(diǎn)微服務(wù)解決了單體的擴(kuò)展瓶頸但也引入了分布式系統(tǒng)固有的復(fù)雜度。要不要上微服務(wù)需要把好處和代價(jià)都看明白。微服務(wù)架構(gòu)的優(yōu)點(diǎn)優(yōu)點(diǎn)說(shuō)明獨(dú)立部署與交付每個(gè)服務(wù)能獨(dú)立構(gòu)建、測(cè)試、部署發(fā)布周期從周級(jí)縮短到天級(jí)甚至小時(shí)級(jí)CI/CD 友好彈性擴(kuò)展可以只給某個(gè)高負(fù)載服務(wù)單獨(dú)擴(kuò)容資源利用率高成本可控故障隔離單個(gè)服務(wù)故障不會(huì)拖垮全局配合熔斷降級(jí)能做到優(yōu)雅降級(jí)而不是雪崩技術(shù)演進(jìn)靈活單個(gè)服務(wù)能獨(dú)立重構(gòu)、升級(jí)甚至重寫(xiě)技術(shù)債務(wù)可控、迭代靈活可復(fù)用與可組合服務(wù)以 API 暴露能力可被多個(gè)前端或第三方復(fù)用沉淀企業(yè)能力中心微服務(wù)架構(gòu)的缺點(diǎn)缺點(diǎn)說(shuō)明分布式復(fù)雜性網(wǎng)絡(luò)不可靠、調(diào)用可能超時(shí)、服務(wù)可能宕機(jī)要處理重試、冪等、超時(shí)、降級(jí)等難題運(yùn)維成本高服務(wù)從 1 個(gè)變成 N 個(gè)需要容器編排K8s、配置中心、服務(wù)網(wǎng)格、全鏈路監(jiān)控等基礎(chǔ)設(shè)施支撐數(shù)據(jù)一致性難跨服務(wù)事務(wù)無(wú)法用本地 ACID 保證要引入 Saga、TCC、消息最終一致性等分布式事務(wù)方案服務(wù)通信開(kāi)銷(xiāo)網(wǎng)絡(luò)調(diào)用帶來(lái)序列化/反序列化和網(wǎng)絡(luò)延遲開(kāi)銷(xiāo)對(duì)時(shí)延敏感場(chǎng)景要專(zhuān)門(mén)優(yōu)化調(diào)試與排障困難一個(gè)請(qǐng)求跨多個(gè)服務(wù)傳統(tǒng)單機(jī)調(diào)試失靈要依賴分布式鏈路追蹤如 Sleuth/Zipkin定位問(wèn)題接口契約管理服務(wù)間 API 變更需版本管理和兼容性控制否則容易引發(fā)調(diào)用方故障測(cè)試復(fù)雜度高端到端測(cè)試要編排多服務(wù)依賴環(huán)境搭建和 mock 成本明顯上升安全邊界擴(kuò)大服務(wù)間網(wǎng)絡(luò)通信帶來(lái)新的攻擊面需要服務(wù)間鑒權(quán)與 mTLS 等機(jī)制2.4 微服務(wù)拆分拆分是微服務(wù)落地最核心也最難的環(huán)節(jié)。拆得好系統(tǒng)清晰好維護(hù)拆得不好服務(wù)是拆了但耦合還在。拆分原則拆分的第一原則是圍繞業(yè)務(wù)能力拆而不是按技術(shù)分層拆。按技術(shù)分層拆的意思是把用戶接口數(shù)據(jù)訪問(wèn)這些技術(shù)層單獨(dú)拆成服務(wù)這樣做每個(gè)業(yè)務(wù)變更都要橫跨多個(gè)服務(wù)協(xié)作服務(wù)自治就名存實(shí)亡了。而拆分方式也主要分為按模塊縱向拆分和抽取公共模塊橫向拆分。拆分時(shí)還要注意以下原則高內(nèi)聚低耦合經(jīng)常一起變更的功能放進(jìn)同一個(gè)服務(wù)跨服務(wù)調(diào)用越少越好。單一職責(zé)一個(gè)服務(wù)對(duì)應(yīng)一個(gè)明確的業(yè)務(wù)能力避免大而全。獨(dú)立數(shù)據(jù)所有權(quán)拆服務(wù)的同時(shí)把數(shù)據(jù)邊界劃好每個(gè)服務(wù)獨(dú)占自己的數(shù)據(jù)存儲(chǔ)禁止別的服務(wù)直接連它的數(shù)據(jù)庫(kù)表。三、Spring Cloud前面主要介紹微服務(wù)相關(guān)的概念接下來(lái)將簡(jiǎn)單介紹微服務(wù)項(xiàng)目中常見(jiàn)的一個(gè)微服務(wù)架構(gòu)——Spring CloudSpring Cloud 是什么Spring Cloud是基于 Spring Boot 構(gòu)建的、面向微服務(wù)架構(gòu)的一站式治理框架可以理解成微服務(wù)架構(gòu)的基礎(chǔ)設(shè)施全家桶服務(wù)注冊(cè)發(fā)現(xiàn)、配置管理、API 網(wǎng)關(guān)、負(fù)載均衡、熔斷降級(jí)、分布式鏈路追蹤都有對(duì)應(yīng)的組件。有個(gè)很形象的區(qū)分Spring Boot 解決單個(gè)微服務(wù)怎么快速構(gòu)建Spring Cloud 解決多個(gè)微服務(wù)怎么協(xié)作治理。而且 Spring Cloud 本身是一套規(guī)范和抽象底層實(shí)現(xiàn)可以替換——比如服務(wù)注冊(cè)發(fā)現(xiàn)既可以用 Netflix 的 Eureka也可以用阿里的 NacosSpring Cloud 定義統(tǒng)一接口具體實(shí)現(xiàn)由各家提供。它的核心價(jià)值是你不用從零搭建分布式基礎(chǔ)設(shè)施靠注解和自動(dòng)配置就能快速接入服務(wù)治理能力把精力放在業(yè)務(wù)邏輯本身。