微服務(wù)架構(gòu)落地及其演進(jìn)
微服務(wù)架構(gòu)的定義:
圖片
如何篩選微服務(wù):
圖片
三種場景可以考慮使用微服務(wù)
(Are you tall enough?)
- 規(guī)模大(團(tuán)隊(duì)超過10人)
- 業(yè)務(wù)復(fù)雜度高(系統(tǒng)超過5個(gè)子模塊)
- 需要長期演進(jìn)(項(xiàng)目周期超過半年)
其他因素篩選微服務(wù)
- 軟件功能變化頻繁,快速迭代,縮短交付周期為核心的業(yè)務(wù)。
- 模塊有獨(dú)立的生命周期,服務(wù)復(fù)用,降本增效,減少重復(fù)造輪子
- 有獨(dú)立的隔離性需求和擴(kuò)展性需求(容錯(cuò))
- 簡化的外部依賴(Facade模式場景)
如何拆分微服務(wù):
圖片
拆分
- Domain-Driven Design (DDD)
- Domain(領(lǐng)域): 領(lǐng)域是指與某個(gè)特定問題相關(guān)的知識(shí)領(lǐng)域和行為。在設(shè)計(jì)微服務(wù)時(shí),首先要識(shí)別和定義業(yè)務(wù)領(lǐng)域。
- Bounded Context(界限上下文): 界限上下文定義了領(lǐng)域的邊界。在拆分微服務(wù)時(shí),要確保每個(gè)服務(wù)有明確的邊界,獨(dú)立承擔(dān)特定的業(yè)務(wù)功能。
- 業(yè)務(wù)功能模塊化
將系統(tǒng)按照業(yè)務(wù)功能拆分成多個(gè)模塊,每個(gè)模塊對應(yīng)一個(gè)或多個(gè)微服務(wù)。例如:訂單服務(wù)、用戶服務(wù)、支付服務(wù)等。
垂直拆分
圖片左側(cè)展示了不同層次的架構(gòu)設(shè)計(jì),從實(shí)體層到接口適配層再到控制層,可以根據(jù)這些層次進(jìn)行垂直拆分,使每個(gè)微服務(wù)獨(dú)立處理特定的功能。
構(gòu)建
12-Factor App 方法論
- I. 基準(zhǔn)代碼: 一份基準(zhǔn)代碼,多份部署。每個(gè)微服務(wù)應(yīng)該有自己的代碼庫。
- II. 依賴: 顯式聲明和隔離依賴關(guān)系。確保微服務(wù)之間的依賴關(guān)系清晰明確。
- III. 配置: 在環(huán)境中存儲(chǔ)配置。將配置和代碼分離,以便在不同環(huán)境中輕松部署。
- IV. 后端服務(wù): 把后端服務(wù)當(dāng)作附加資源。微服務(wù)應(yīng)能夠獨(dú)立調(diào)用其他后端服務(wù)。
- V. 構(gòu)建、發(fā)布、運(yùn)行: 嚴(yán)格分離構(gòu)建和運(yùn)行階段。確保每個(gè)微服務(wù)的構(gòu)建和運(yùn)行環(huán)境一致。
- VI. 進(jìn)程: 以一個(gè)或多個(gè)無狀態(tài)進(jìn)程運(yùn)行應(yīng)用。微服務(wù)應(yīng)該無狀態(tài),方便擴(kuò)展。
- VII. 端口綁定: 通過端口綁定提供服務(wù)。每個(gè)微服務(wù)獨(dú)立運(yùn)行并監(jiān)聽自己的端口。
- VIII. 并發(fā): 通過進(jìn)程模型進(jìn)行擴(kuò)展。根據(jù)需要?jiǎng)討B(tài)擴(kuò)展微服務(wù)實(shí)例。
- IX. 易處理: 快速啟動(dòng)和優(yōu)雅終止,確保最大化健壯性。微服務(wù)應(yīng)快速啟動(dòng)并能平滑關(guān)閉。
- X. 環(huán)境等價(jià): 盡可能的保持開發(fā)、預(yù)發(fā)布、線上環(huán)境相同。確保不同環(huán)境的一致性。
- XI. 日志: 把日志當(dāng)作事件流。集中管理和分析日志。
- XII. 管理進(jìn)程: 后臺(tái)管理任務(wù)作為一次性進(jìn)程運(yùn)行。后臺(tái)任務(wù)應(yīng)獨(dú)立運(yùn)行。
DevOps 實(shí)踐
自動(dòng)化部署:使用CI/CD管道實(shí)現(xiàn)代碼的自動(dòng)構(gòu)建、測試和部署。
持續(xù)監(jiān)控:對微服務(wù)的運(yùn)行狀態(tài)進(jìn)行持續(xù)監(jiān)控,確保服務(wù)的高可用性。
技術(shù)選型
選擇合適的技術(shù)棧和工具來支持微服務(wù)的開發(fā)和運(yùn)維。例如:Spring Boot、Docker、Kubernetes等。
微服務(wù)架構(gòu)的兩種建設(shè)思路:
圖片
SpringCloud的技術(shù)生態(tài):
圖片
Spring Cloud提供了一整套微服務(wù)架構(gòu)的解決方案,通過服務(wù)注冊與發(fā)現(xiàn)、配置管理、消息隊(duì)列、分布式跟蹤、服務(wù)熔斷等組件,幫助開發(fā)者構(gòu)建高可用、高擴(kuò)展性的微服務(wù)系統(tǒng)。這張生態(tài)圖展示了各個(gè)組件之間的關(guān)系和作用,是理解Spring Cloud生態(tài)系統(tǒng)的一個(gè)很好的參考。
Service(服務(wù))
- 服務(wù)注冊:使用Eureka或Consul進(jìn)行服務(wù)注冊。
- 服務(wù)調(diào)用:通過Feign進(jìn)行服務(wù)調(diào)用,依賴Ribbon實(shí)現(xiàn)負(fù)載均衡。
- 服務(wù)跟蹤:使用Sleuth進(jìn)行分布式服務(wù)跟蹤。
- 服務(wù)熔斷:使用Hystrix實(shí)現(xiàn)服務(wù)熔斷,Turbine用于集群監(jiān)控。
- 依賴管理:使用CLI服務(wù)調(diào)用腳本,任務(wù)調(diào)度和數(shù)據(jù)流(Data Flow)管理。
- 大數(shù)據(jù):通過JPA封裝JDBC連接大數(shù)據(jù)。
- 配置管理:通過Config Server管理配置,支持本地和遠(yuǎn)程Git倉庫。
Consumer(消費(fèi)者)
- 消息消費(fèi):通過Spring Cloud Stream與RabbitMQ或Kafka集成,實(shí)現(xiàn)消息隊(duì)列的消費(fèi)。
- 服務(wù)發(fā)現(xiàn):通過Eureka或Consul發(fā)現(xiàn)服務(wù)。
- 服務(wù)安全:通過Security實(shí)現(xiàn)服務(wù)的安全管理。
- 網(wǎng)關(guān):使用Zuul實(shí)現(xiàn)網(wǎng)關(guān)功能,處理外部請求。
- 服務(wù)配置:在服務(wù)啟動(dòng)時(shí)通過Config Server獲取配置信息。
Spring Boot Bus
- 廣播消息:用于整個(gè)服務(wù)集群統(tǒng)一廣播消息,例如刷新配置。
其他組件
- Cluster管理:使用Redis和其他集群管理工具(如Cluster)管理集群。
- 容器化部署:使用Docker和Linux進(jìn)行容器化部署,支持命令行(CLI)調(diào)用服務(wù)。
消息隊(duì)列
- 消息發(fā)布與訂閱:使用Spring Cloud Stream集成RabbitMQ和Kafka,實(shí)現(xiàn)消息的發(fā)布與訂閱。
配置管理
- Config Server:管理配置文件,支持從本地或遠(yuǎn)程Git倉庫獲取配置,Spring Boot應(yīng)用在啟動(dòng)時(shí)會(huì)從Config Server獲取配置。
安全與網(wǎng)關(guān)
- Security:提供服務(wù)的安全認(rèn)證與授權(quán)。
- Zuul:作為網(wǎng)關(guān),處理外部請求并路由到相應(yīng)的服務(wù)。
分布式跟蹤
- Sleuth:提供分布式系統(tǒng)的請求跟蹤。
- Turbine:用于監(jiān)控Hystrix的集群服務(wù)。
負(fù)載均衡
- Ribbon:在Feign調(diào)用時(shí),Ribbon提供負(fù)載均衡功能。
任務(wù)調(diào)度與數(shù)據(jù)流
- Task:用于任務(wù)調(diào)度。
- Data Flow:管理數(shù)據(jù)流。
微服務(wù)和SpringCloud的架構(gòu)復(fù)雜性: