微服務中常見的 9 種設計模式!如何選擇?
你好,我是猿 java
現如今,微服務已經成了很多中大型互聯網公司的標配,不同的公司採用的設計模式可能不一樣,因此,這篇文章,我們來分析下微服務中常見的 9 種設計模式:
-
API Gateway Pattern(網關模式)
-
Service Registry Pattern(服務註冊表模式)
-
Circuit Breaker Pattern(斷路器模式)
-
Saga Pattern(Saga 模式)
-
Event Sourcing Pattern(事件溯源模式)
-
Strangler Fig Pattern(絞殺者模式)
-
Bulkhead Pattern(艙壁模式)
-
API Composition Pattern(API 組合模式)
-
CQRS Design Pattern(CQRS 模式)
接下來,我們將分別介紹每種模式以及它們的優缺點和使用場景:
API Gateway Pattern
API Gateway 模式是一種設計模式,用於管理客戶端與後端服務之間的請求,它充當客戶端和服務之間的中介層,提供一個統一的接口來處理所有的 API 請求。
這種模式通過將多個服務的複雜性隱藏在一個接口後面來簡化客戶端的體驗,它還可以處理身份驗證、日誌記錄和速率限制等任務,使其成爲微服務架構的關鍵部分。
API Gateway 模式可以抽象如下圖:
優點:
-
簡化客戶端開發: 客戶端只需與 API 網關交互,而不必直接與多個後端服務進行通信。
-
安全性: 可以在網關層實現身份驗證和授權策略。
-
負載均衡和緩存: 可以在 API 網關中實現,以提高性能。
-
協議轉換: 支持不同協議(如 HTTP 到 gRPC)的轉換。
缺點:
-
單點故障: API 網關可能成爲系統的單點故障。
-
複雜性: 需要額外的開發和維護工作來管理網關。
適用場景:
-
微服務架構:在微服務架構中,API 網關可以作爲一個集中入口,簡化客戶端與多個後端服務的交互。
-
安全需求:需要在一個集中點管理身份驗證、授權和流量控制。
-
跨域請求和協議轉換:需要支持不同客戶端協議(如 HTTP、WebSocket)的請求,或需要執行協議轉換。
-
負載均衡和緩存:需要在網關層實現負載均衡和緩存以提高性能。
Service Registry Pattern
服務註冊表模式用於在微服務架構中跟蹤微服務實例的位置和狀態,服務提供者在啓動時將其地址註冊到服務註冊表中,然後,其他服務可以查找註冊表以查找它並與之通信。這種動態發現實現了靈活性,並幫助服務在不對其位置進行硬編碼的情況下進行交互。
Service Registry 模式可以抽象如下圖:
優點:
-
動態發現: 服務消費者可以動態地發現服務提供者的位置。
-
負載均衡: 幫助實現客戶端負載均衡,通過選擇最優的服務實例來處理請求。
缺點:
-
一致性問題: 需要確保註冊表中信息的一致性和及時更新。
-
複雜性增加: 需要額外的組件和配置來管理服務註冊。
適用場景:
-
動態服務發現:在微服務環境中,服務實例是動態的,需要一種機制來註冊和發現服務。
-
自動伸縮:服務實例數量根據負載自動調整,需要動態更新服務註冊信息。
-
服務的健康檢查:需要定期檢查服務實例的健康狀態並更新註冊信息。
Circuit Breaker Pattern
斷路器模式用於在服務之間調用時,防止系統因服務故障而出現級聯故障,它可以檢測服務的失敗,並在檢測到故障時,短路請求以避免進一步的失敗。如果服務反覆失敗,斷路器將跳閘,從而阻止對該服務的進一步請求。超時期限後,它允許有限的請求測試服務是否重新聯機,這減少了失敗服務的負載並增強了系統彈性。
Circuit Breaker 模式可以抽象如下圖:
優點:
-
提高系統穩定性: 防止因服務故障導致的系統崩潰。
-
快速失敗: 當檢測到故障時,快速返回錯誤而不是等待超時。
缺點:
-
狀態管理: 需要管理斷路器的狀態(關閉、打開、半開)。
-
配置複雜性: 需要調整斷路器的參數以適應不同的服務。
適用場景:
-
不穩定的網絡環境:經常出現網絡故障或延遲,需要防止這些問題影響整個系統。
-
下游服務不可靠:某些服務可能會不時出現故障,需要隔離這些故障以保護系統的其他部分。
-
高可用性要求:需要確保系統在部分服務不可用時仍能繼續運行。
Saga Pattern
Saga 模式是一種分佈式事務管理模式,用於管理跨多個服務的長時間運行的業務交易。Saga 將事務分解爲一系列的小事務,每個小事務由一個獨立的服務處理。如果一個步驟失敗,則會採取補償措施來反轉前面的步驟。這樣,即使遇到故障,您也可以保持整個系統的數據一致性。
Saga 模式可以抽象如下圖:
優點:
-
去中心化: 沒有單一的事務管理器。
-
靈活性: 支持複雜的業務流程和長時間運行的事務。
缺點:
-
複雜性: 需要設計補償邏輯來處理事務失敗。
-
一致性挑戰: 需要確保最終一致性,而不是立即一致性。
適用場景:
-
分佈式事務:需要管理跨多個服務的長時間運行的事務,確保數據最終一致性。
-
複雜業務流程:涉及多個步驟和服務的業務流程,需要靈活的事務管理。
-
需要補償邏輯:在事務失敗時,需要執行補償操作來回滾或調整狀態。
Event Sourcing Pattern
事件溯源模式是通過存儲系統中所有狀態變化的事件來記錄狀態的變化,應用程序的狀態可以通過重放這些事件來重建。每個事件都描述了發生的更改,允許服務通過重放事件歷史記錄來重建當前狀態,這提供了清晰的審計跟蹤,並簡化了出現錯誤時的數據恢復。
Event Sourcing 模式可以抽象如下圖:
優點:
-
審計和回溯: 可以輕鬆回溯系統狀態的變化。
-
重放能力: 可以重放事件來恢復系統狀態。
缺點:
-
存儲需求: 需要存儲大量的事件數據。
-
複雜性: 需要處理事件的版本控制和模式演進。
適用場景:
-
審計和回溯:需要詳細記錄系統中所有狀態變化,以便進行審計和回溯。
-
複雜狀態恢復:需要在系統故障後通過事件重建狀態。
-
歷史分析:需要分析系統歷史事件以獲取業務洞察。
Strangler Fig Pattern
絞殺者模式用於逐步替換舊系統的功能,而不需要一次性重構整個系統,新功能在新系統中實現,隨着時間的推移,隨着更多功能轉移到微服務,舊系統會逐漸被 “扼殺” ,直到它可以完全停用,這種方法將風險降至最低,並允許更順利的遷移。
Strangler Fig 模式可以抽象如下圖:
優點:
-
風險降低: 逐步遷移減少了系統中斷的風險。
-
靈活性: 允許同時運行舊系統和新系統。
缺點:
-
複雜性: 需要管理兩個系統的並行運行。
-
整合挑戰: 需要處理新舊系統之間的數據和功能集成。
適用場景:
-
遺留系統替換:需要逐步替換舊系統的功能,而不是一次性重構,比如:單體服務遷移成微服務。
-
風險管理:在遷移過程中需要降低系統中斷的風險。
-
持續交付:需要在不斷交付新功能的同時,逐步淘汰舊系統。
Bulkhead Pattern
艙壁模式通過將系統分成獨立的隔離部分,如果一個服務遇到問題,它不會損害其他服務,通過創建邊界,此模式增強了系統的彈性,確保一個領域的故障不會導致整個系統故障。
Bulkhead 模式可以抽象如下圖:
優點:
-
增強穩定性: 隔離故障,防止其影響其他部分。
-
資源隔離: 可以爲不同的服務或組件分配不同的資源池。
缺點:
-
資源利用率: 可能導致資源的低效利用。
-
複雜性: 需要設計和管理多個隔離區域。
適用場景:
-
隔離故障:需要防止一個組件的故障影響整個系統。
-
資源管理:需要爲不同的服務或組件分配獨立的資源池,以優化資源利用。
-
高可靠性需求:需要確保系統某些部分在其他部分出現故障時仍能正常工作。
API Composition Pattern
API 組合模式用於在微服務架構中聚合來自多個服務的數據,以提供客戶端需要的完整響應,通常用於替代複雜的查詢。單獨的服務 (組合服務) 從各種服務收集響應,並將它們組合成一個 Client 端的響應,這減少了 Client 端發出多個請求的需要,並簡化了它們與系統的交互。
API Composition 模式可以抽象如下圖:
優點:
-
簡化客戶端: 客戶端可以通過一個 API 請求獲取完整的數據。
-
減少請求數量: 通過組合 API 減少客戶端的請求次數。
缺點:
-
性能問題: 組合多個服務的響應可能導致延遲。
-
複雜性: 需要處理不同服務響應的合併和格式化。
適用場景:
-
數據聚合:需要從多個服務中聚合數據以提供完整的響應。
-
複雜查詢替代:無法或不希望在單個服務中執行復雜查詢時,需要在 API 層進行數據組合。
-
減少客戶端請求:通過組合 API 減少客戶端的請求次數和複雜性。
CQRS Design Pattern
CQRS(Command Query Responsibility Segregation)模式將命令(寫操作)和查詢(讀操作)分開,以優化性能和可擴展性。例如,命令端可以專注於執行業務規則,而查詢端可以優化以實現快速數據檢索,這種模式在具有大量讀寫操作的應用程序中特別有用,因爲它通過允許對每一端進行不同的優化來增強性能和可擴展性。
CQRS 模式可以抽象如下圖:
優點:
-
優化性能: 讀寫分離可以針對不同的操作進行優化。
-
靈活性: 支持不同的數據存儲策略。
缺點:
-
複雜性: 需要維護兩個獨立的數據模型。
-
一致性挑戰: 需要確保讀寫模型之間的一致性。
適用場景:
-
高併發和性能優化:需要同時支持大量的讀取和寫入操作,並且需要分別優化讀取和寫入路徑。
-
複雜業務邏輯:寫操作需要執行復雜的業務規則,而讀取操作需要快速響應。
-
大規模系統:需要靈活擴展和優化系統的不同部分以滿足不同的負載需求。
總結
本文,我們分析了微服務中常見的 9 種設計模式,這些模式各有優缺點,適用於不同的場景和需求,在設計分佈式系統時,選擇合適的模式可以提高系統的性能、可靠性和可維護性。因此,瞭解和掌握它們可以幫助我們更好地選擇和使用。
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/3Pe1WCLP8nrWmy_OTi5D-Q