10個微服務設計模式

微服務設計模式是一種指導微服務架構設計和開發的一系列原則和實踐。微服務設計模式的目的是為了解決微服務架構中遇到的一些常見的問題和挑戰,比如服務劃分、服務通信、服務治理、服務測試等。微服務設計模式可以幫助我們構建出高效、可靠、可擴展、可維護的微服務系統。

本文將介紹以下十種微服務設計模式:

  • API 網關(Api Gateway Pattern)

  • 服務發現與注冊(Service Registration and Discovery Pattern)

  • 斷路器(Circuit Breaker Pattern)

  • 隔板模式(Bulkhead Pattern)

  • 命令和查詢職責分離(CQRS Pattern)

  • 事件驅動模式(Dvent Driven Pattern)

  • Saga 模式(Saga Pattern)

  • 扼殺者模式(Strangler Pattern)

  • 邊車模式(Sidecar Pattern)

  • BFF 模式(Backend for Frontend Pattern)

1. API 網關

API 網關是訪問任何微服務的入口點,位于客戶端和微服務之間,負責處理諸如鑒權、限流、重試、負載均衡、服務發現等通用功能,以及根據客戶端的需求進行數據過濾、映射和聚合等操作。這種模式可以簡化客戶端的邏輯,減少網絡開銷,保護后端服務,以及實現不同級別的 API 接口。在 Spring Cloud 中我們可以使用 Zuul 或 Spring Cloud Gateway 來實現這一點。

應用場景

  1. 對于任何微服務調用 API 網關是唯一入口,簡化客戶端邏輯。

  2. 可以根據不同的規則將請求路由到不同的微服務上。

  3. 可以與 Eureka、Nacos、Ribbon 等注冊中心集成,實現服務發現和負載均衡。

  4. 可以聚合后端的請求結果再發送給前端。

  5. 可以在不同通信協議的服務之間做協議轉換。

  6. 可以把授權/認證功能從微服務中遷移到 API 網關上。

  7. 可以記錄請求日志。

  8. 可以做服務限流以及服務熔斷。

2. 服務注冊與發現

服務注冊與發現是一種用于管理微服務實例地址變化的技術。它可以讓微服務之間通過一個統一的服務名來進行通信,而不需要知道對方的具體位置。它主要包括兩個組件:服務注冊中心和服務發現客戶端。

  • 服務注冊中心:服務注冊中心是一個中心化的組件,負責存儲所有微服務實例的位置信息(如 IP 地址和端口號),以及提供查詢和更新這些信息的接口。每個微服務實例在啟動時都會向服務注冊中心注冊自己的位置信息,并定期發送心跳消息來維持自己的在線狀態。如果某個微服務實例停止或下線了,它會從服務注冊中心注銷自己的位置信息,或者由服務注冊中心檢測到并刪除它。

  • 服務發現客戶端:服務發現客戶端是一個分布式的組件,負責從服務注冊中心獲取所需微服務實例的位置信息,并根據負載均衡策略選擇一個合適的實例進行調用。每個客戶端或其他微服務在需要調用某個微服務時都會使用其服務名來請求服務發現客戶端,由服務發現客戶端返回一個可用的實例地址,并建立連接。

引入服務注冊與發現可以給微服務架構帶來很多好處,例如,

  • 動態發現:我們可以動態地發現新加入或退出的微服務實例,而不需要手動配置或修改地址信息。

  • 負載均衡:我們可以根據不同的算法(如輪詢、隨機、最少連接等)來選擇最合適的微服務實例來處理請求,從而提高系統的性能和效率。

  • 容錯處理:我們可以檢測并排除不可用或故障的微服務實例,從而提高系統的可靠性和穩定性。

常見的服務注冊中心如下,

  • Eureka:Eureka 是 Netflix 開源的一款服務發現組件,是 Spring Cloud 老版本的核心組件之一,現在已經處于維護期。它提供了服務注冊、服務發現和負載均衡等功能,具有高可用、高可靠、易于擴展的特點。適用于需要高可用、易于部署和維護的微服務架構。

  • Consul:Consul 是由 HashiCorp 開源的一款服務網格解決方案,提供了服務注冊、服務發現和健康檢查等功能,同時還支持多數據中心部署和分布式一致性協議。適用于需要多數據中心部署和強一致性的微服務架構。

  • Zookeeper:Zookeeper 是 Apache 開源的一款分布式協調服務,提供了命名服務、配置管理、分布式鎖等功能。Zookeeper 具有高可用、高可靠、支持集群和多數據中心等特點。適用于需要分布式鎖、分布式配置管理等功能的微服務架構。

  • Nacos:Nacos 是阿里巴巴開源的一款動態服務發現、配置管理和服務管理平臺,支持 DNS-based 和 RPC-based 兩種模式。Nacos 具有簡單易用、高性能、高可擴展等特點。適用于需要動態配置管理和服務治理的微服務架構。

  • Etcd:Etcd 是一個分布式鍵值存儲系統,基于 Raft 協議實現了強一致性和容錯性。Etcd 可以作為服務注冊中心使用,也可以作為配置中心或分布式鎖等其他場景使用。適用于需要強一致性和高性能的微服務架構。

3. 斷路器

斷路器是一種處理遠程調用失敗或超時的模式。由于微服務之間需要通過網絡進行通信,因此可能會遇到網絡故障、超時、擁塞等問題,導致遠程調用失敗或延遲。如果不及時處理這些問題,可能會造成雪崩效應(Cascading Failure),即一個失敗的調用會引起其他調用的失敗,最終導致整個系統崩潰。電路斷路器模式可以避免這種情況,它類似于電路中的保險絲,當檢測到某個遠程調用出現故障時,就會切斷該調用,防止進一步的損害,并嘗試恢復該調用。在 Spring Cloud 中,我們可以使用 Hystrix 或 Resilient4J 來實現斷路器。

斷路器模式通常有三種狀態:閉合(Closed)、打開(Open)和半開(Half-Open)。閉合狀態表示遠程調用正常工作,打開狀態表示遠程調用出現故障,半開狀態表示遠程調用正在恢復。電路斷路器根據一定的條件和策略來切換這三種狀態,比如故障次數、故障比例、故障時間等。電路斷路器還可以提供一些備選方案來處理失敗的調用,比如重試、降級、緩存等。

斷路器行為類似于電路中的斷路器。當連續的請求失敗的次數超過閾值時,斷路器將跳閘一段時間,并且在跳閘的這段時間內,所有遠程服務調用的嘗試都將立即失敗。當超過了斷路器跳閘時間之后,斷路器將允許有限數量的測試請求通過。如果這些請求成功,則斷路器將恢復正常操作。否則如果有一個請求失敗,則斷路器再次跳閘。對于一個應用試圖嘗試調用另一個遠程服務或者獲取共享資源,并且該操作很容易的失敗的情況來說, 這個模式非常適用。

3. 隔板模式

隔板模式(Bulkhead Pattern)通過根據需要調用的服務數量劃分線程池,幫助處理與線程池相關的容錯問題。例如我們在服務 A 中定義了一個 50 線程池,服務 A 會向服務 B 和 C 發出請求。因此服務 A 應該將 50 線程池分為 2 個(服務 B 25 個,服務 C 25 個),如果服務 C 不可用或需要較長時間來處理請求,則不會影響服務 B 調用,因為它有自己的線程池來執行作業。在 Spring Cloud 中,我們可以使用 Resilient4J 來實現這一點。

隔板模式類似于船體中一個個被隔離的分區。根據使用者負載和可用性要求,這些分區服務實例被分割到不同的組里面。這種設計模式有助于隔離故障(isolate failures), 并允許即使在故障期間仍可為某些使用者提供服務功能。

5. 命令和查詢職責分離

命令和查詢職責分離(Command Query Responsibility Segregation,CQRS)模式,是一種將數據存儲的讀取操作和更新操作分離的模式。這種模式的目的是提高微服務的性能、可擴展性和安全性。CQRS 的基本思想是,對于不同的操作,可以使用不同的模型、服務和數據庫。例如,讀取操作可以使用一個優化了查詢效率的數據庫,而更新操作可以使用一個保證了數據一致性的數據庫。這樣就可以根據不同的需求來選擇合適的技術和架構。

優點

  • 可以根據讀寫比例來調整資源分配,提高系統的效率和響應速度。

  • 可以針對不同的場景使用不同的數據模型和驗證規則,提高系統的靈活性和可維護性。

  • 可以降低數據沖突和并發問題的風險,提高系統的可靠性和安全性。

缺點

  • 需要維護多個數據源之間的同步和一致性,增加了系統的復雜度和開發成本。

  • 需要處理數據延遲和最終一致性的問題,可能影響用戶體驗和業務邏輯。

6. 事件驅動模式

微服務中的事件驅動模式是一種讓微服務之間通過發布和訂閱事件來進行異步通信的模式。事件是一種表示系統中發生了某種變化或動作的消息,比如訂單創建、支付完成、用戶注冊等。事件驅動模式的優點是可以降低微服務之間的耦合度,提高系統的可擴展性、性能和可靠性,以及支持復雜的業務邏輯和流程。事件驅動模式的挑戰是需要保證事件的順序、一致性、冪等性和可追溯性,以及處理分布式事務和異常情況。事件驅動模式中的事件一般是通過消息隊列發出,例如 RabbitMQ 或 Apache Kafka。

事件驅動模式讓微服務之間通過發布和訂閱事件來進行異步通信,而不是直接調用或依賴其他微服務的接口。這樣每個微服務只需要關注自己的業務邏輯,而不需要知道其他微服務的存在和狀態。

7. Saga 模式

眾所周知,處理分布式系統很困難,尤其是涉及分布式事務時,二階段提交是最好的選擇,但由于其悲觀鎖的性質使其難以擴展、性能較低,所以就有了 Saga 模式,是一種在分布式事務場景中跨微服務管理數據一致性的方法。Saga 是一系列事務,用于更新每項服務并發布消息或事件來觸發下一個事務步驟。如果某個步驟失敗,則 Saga 將執行補償事務,以抵消上一個事務的影響。這種模式可以保證數據的最終一致性,同時避免了長時間鎖定資源的問題。有兩種常見的 Saga 實現方法,即協調和編排。 每個方法都有自己的一組挑戰和技術來協調工作流。

協調

協調是協調 Saga 的一種方法,參與者在沒有集中控制點的情況下交換事件。 通過協調,每個本地事務都會發布在其他服務中觸發本地事務的域事件。。

好處

  • 適用于只需很少參與者且不需要協調邏輯的簡單工作流。

  • 不需要額外的服務實現和維護。

  • 不會引入單一故障點,因為責任在各個 Saga 參與者之間進行分配。

缺點

  • 添加新步驟時,工作流可能會變得混亂,因為很難跟蹤哪些 Saga 參與者偵聽哪些命令。

  • 由于 Saga 參與者必須使用彼此的命令,因此他們之間存在循環依賴的風險。

  • 集成測試很困難,因為必須運行所有服務才能模擬事務。

編排

編排是協調 Saga 的一種方法,在此方法中,中央控制器告訴 Saga 參與者要執行的本地事務。 Saga 編排器處理所有事務,并告知參與者根據事件執行哪項操作。 編排器執行 Saga 請求、存儲和解釋每個任務的狀態,并通過補償事務處理故障恢復。

好處

  • 適用于只需很少參與者且不需要協調邏輯的簡單工作流。

  • 不需要額外的服務實現和維護。

  • 不會引入單一故障點,因為責任在各個 Saga 參與者之間進行分配。

缺點

  • 添加新步驟時,工作流可能會變得混亂,因為很難跟蹤哪些 Saga 參與者偵聽哪些命令。

  • 由于 Saga 參與者必須使用彼此的命令,因此他們之間存在循環依賴的風險。

  • 集成測試很困難,因為必須運行所有服務才能模擬事務。

8. 扼殺者模式

扼殺者(Strangler Pattern)模式是一種將單體應用逐漸遷移到微服務架構的模式,它的靈感來源于一種纏繞并殺死它所依附的樹木的藤蔓植物。扼殺者模式的基本思想是,通過創建單體應用的新版本來替換舊版本,同時保持外部 API 不變,讓客戶端感知不到任何變化。隨著轉換進度的推進,最終所有功能都被重構為微服務,新架構“扼殺”取代了原來的單體架構。

扼殺應用(Strangler Application)的步驟分為轉換,共存和消滅三步:

  • 轉換(Transform?) —? 用新方式創建一個新的平行的服務。

  • 共存(Coexist?)—? 保持老服務,將老服務請求重定向到新服務,新服務逐步實現老服務的功能。

  • 消滅(Eliminate?) —? 移除老服務。

扼殺者模式的優點是可以漸進地進行微服務化,而不是一次性地重寫整個應用,這樣可以降低風險和成本,同時保持業務的連續性和穩定性。缺點是需要維護兩套系統之間的兼容性和同步性,這可能會增加系統的復雜度和開發成本。

9. 邊車模式

邊車模式(Sidecar Pattern)是一種將一些與業務邏輯無關的功能(如日志、監控、配置、安全等)從主應用程序中分離出來,部署在同一個主機或容器中的一個獨立的進程或服務中的模式。這樣,主應用程序可以專注于自己的核心功能,而邊車服務可以提供一些通用的功能,比如數據轉換、網絡通信、故障處理等。邊車服務與主應用程序之間通過本地接口或共享內存來進行通信,從而實現高效和透明的協作。

邊車模式的優點是可以降低微服務之間的耦合度,提高微服務的性能、可靠性和靈活性,以及簡化微服務的開發和維護。缺點是需要額外的資源和管理成本,以及處理邊車與主應用程序之間的通信和協調問題。

10. BFF 模式

BFF 模式是一種為前端定制的后端的模式,它的全稱是 Backend for Frontend。BFF 模式的目的是將后端的微服務根據不同的前端渠道和場景進行適配和聚合,提供給前端友好和統一的 API,從而提升前端的用戶體驗和開發效率。BFF 模式可以讓前端與后端之間實現更好地解耦和協作。

BFF 模式的優點是可以根據不同的前端需求來定制和優化 API,避免了過度抽象或者冗余的 API,提高了網絡傳輸和數據處理的效率。缺點是需要額外的開發和維護成本,每個前端渠道都需要一個對應的 BFF,可能會導致代碼重復或者不一致。

應用場景

  1. 接口剪裁:后端提供的一個接口,對于不同的前端場景來說,需求的字段可能會不同。BFF 的剪裁能力使得后端只需要專注領域開發,不需要為前端定制不同的 API 接口,方便 API 生命周期的管理。

  2. 接口聚合:一個前端頁面,往往會依賴多個后端接口,這樣就需要和后端產生多次交互。BFF 可以對后端接口進行聚合,并處理依賴關系,使得前端一個頁面只需要和后端交互一次。

總結

以上的十種設計模式能幫助我們構建擴展性良好的軟件系統,但是在生產實踐中,我們還需要根據具體的業務場景和需求來引入合適的微服務設計模式。

最后感謝大家閱讀,希望本文能對你有所幫助.

關注公眾號【waynblog】每周分享技術干貨、開源項目、實戰經驗、高效開發工具等,您的關注將是我的更新動力!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/36010.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/36010.shtml
英文地址,請注明出處:http://en.pswp.cn/news/36010.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

九耶丨閣瑞鈦倫特-井字棋html5代碼

你想了解關于井字棋&#xff08;Tic-Tac-Toe&#xff09;的HTML代碼嗎&#xff1f;以下是一個簡單的井子棋的HTML代碼示例&#xff1a; <!DOCTYPE html> <html> <head><title>Tic-Tac-Toe</title><style>.board {display: flex;flex-wrap…

使用AT命令操作Modem 3G/4G模塊

1. 引言 AT命令是一種通信協議&#xff0c;用于控制和配置各種設備&#xff0c;尤其在通信領域中具有重要性。它的名稱來源于"ATtention"&#xff08;注意&#xff09;&#xff0c;因為命令通常以"AT"開頭。AT命令最早被用于調制解調器&#xff0c;用于與…

redis學習筆記(三)

文章目錄 key操作&#xff08;1&#xff09;查找鍵&#xff08;2&#xff09;判斷鍵是否存在&#xff08;3&#xff09;查看鍵的的值的數據類型&#xff08;4&#xff09;刪除鍵以及鍵對應的值&#xff08;5&#xff09;查看鍵的有效期&#xff08;6&#xff09;設置key的有效期…

springboot整合rabbitmq

rabbitmq的七種模式 Hello word 客戶端引入依賴 <!--rabbitmq 依賴客戶端--><dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>5.8.0</version></dependency> 生產者 imp…

STM32 LoRa源碼解讀

目錄結構&#xff1a; SX1278 |-- include | |-- fifo.h | |-- lora.h | |-- platform.h | |-- radio.h | |-- spi.h | |-- sx1276.h | |-- sx1276Fsk.h | |-- sx1276FskMisc.h | |-- sx1276Hal.h | |-- sx1276LoRa.h | -- sx1276LoRaMisc.h – src |-- fifo.c |-- lora.c |-- …

【解析postman工具的使用---基礎篇】

postman前端請求詳解 主界面1.常見類型的接口請求1.1 查詢參數的接口請求1.1.1 什么是查詢參數?1.1.2 postman如何請求 1.2 ?表單類型的接口請求1.2.1 復習下http請求1.2.2? 什么是表單 1.3 上傳文件的表單請求1.4? json類型的接口請求 2. 響應接口數據分析2.1 postman的響…

紅帽RHCA考試內容解析

紅帽RHCA考試內容解析&#xff1a;最新的RHCA有3大方向體系&#xff0c;考試內容分別為&#xff1a; 一、Platform 平臺技術 RH442&#xff1a;性能調優 使用紅帽企業Linux和紅帽網絡提供的工具來學習Linux的性能調優和規劃的技巧及方法&#xff0c;學習系統架構&#xff0c;…

什么是DNS欺騙及如何進行DNS欺騙

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、什么是 DNS 欺騙&#xff1f;二、開始1.配置2.Ettercap啟動3.操作 總結 前言 我已經離開了一段時間&#xff0c;我現在回來了&#xff0c;我終于在做一個教…

【AI】p54-p58導航網絡、藍圖和AI樹實現AI隨機移動和跟隨移動、靠近玩家揮拳、AI跟隨樣條線移動思路

p54-p58導航網絡、藍圖和AI樹實現AI隨機移動和跟隨移動、靠近玩家揮拳、AI跟隨樣條線移動思路 p54導航網格p55藍圖實現AI隨機移動和跟隨移動AI Move To&#xff08;AI進行移動&#xff09;Get Random Pointln Navigable Radius&#xff08;獲取可導航半徑內的隨機點&#xff09…

Java基礎十 - 設計模式

一、單例 1. 創建 餓漢式 package basic;public class ESingleton {// 先私有化靜態實例private static ESingleton eSingleton new ESingleton();// 私有化構造方法&#xff0c;防止外部實例化private ESingleton(){};// 提供全局訪問方法public static ESingleton geteSi…

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)

時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價) 目錄 時序預測 | MATLAB實現基于LSTM長短期記憶神經網絡的時間序列預測-遞歸預測未來(多指標評價)預測結果基本介紹程序設計參考資料 預測結果 基本介紹 Matlab實現LSTM長短期記憶神經…

識別和應對內存抖動

關于作者&#xff1a;CSDN內容合伙人、技術專家&#xff0c; 從零開始做日活千萬級APP。 專注于分享各領域原創系列文章 &#xff0c;擅長java后端、移動開發、人工智能等&#xff0c;希望大家多多支持。 目錄 一、導讀二、概覽三、案例分析3.1 使用memory-profiler3.2 使用 cp…

磁粉制動器離合器收放卷應用介紹

張力控制系統的開環閉環應用介紹,請查看下面文章鏈接: PLC張力控制(開環閉環算法分析)_張力控制plc程序實例_RXXW_Dor的博客-CSDN博客里工業控制張力控制無處不在,也衍生出很多張力控制專用控制器,磁粉制動器等,本篇博客主要討論PLC的張力控制相關應用和算法,關于繞線…

什么是 fullgc

GC GC 全稱為garbage collection,中文含義為垃圾回收&#xff0c;在jvm中的含義為回收無用內存空間 Young space 中文名為年輕代或者新生代&#xff0c;為JVM 堆的一部分&#xff0c;由分代GC概念劃分而來&#xff0c;保存生命周期較短的對象 Tenured space 中文名為老年代…

APP外包開發的iOS開發語言

學習iOS開發需要掌握Swift編程語言和相關的開發工具、框架和技術。而學習iOS開發需要時間和耐心&#xff0c;尤其是對于初學者。通過堅持不懈的努力&#xff0c;您可以逐步掌握iOS開發技能&#xff0c;構建出功能豐富、優質的移動應用。今天和大家分享學習iOS開發的一些建議方法…

【數據結構系列】鏈表

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kuan 的首頁,持續學…

解決hbase節點已下線,但在status中顯示為dead問題

工作中需要下線4臺hbase小節點&#xff0c;下線完成后使用status 命令查看,有一臺為dead狀態: 使用status detailed 查看&#xff0c;發現“hd-03"這臺節點是dead。 檢查各節點配置文件無誤&#xff0c;并使用 /opt/hbase/bin/hbase-daemon.sh restart master 重啟兩個…

less基本使用

1 less中的變量 //對值進行聲明 link-color: #ccc//定義變量名稱 .{sleName} {}bg: background-color; //定義屬性名稱 .container {{bg}: red; }2 繼承&#xff08;復用重復樣式&#xff09; //繼承必須位于選擇器最后 //繼承選擇器名不能為變量 .a:hover:extend(.b) {}.a {…

走出迷宮(多組輸入bfs)

鏈接&#xff1a;登錄—專業IT筆試面試備考平臺_牛客網 來源&#xff1a;牛客網 題目描述 小明現在在玩一個游戲&#xff0c;游戲來到了教學關卡&#xff0c;迷宮是一個N*M的矩陣。 小明的起點在地圖中用“S”來表示&#xff0c;終點用“E”來表示&#xff0c;障礙物用“#…

淺談人工智能技術與物聯網結合帶來的好處

物聯網是指通過互聯網和各種技術將設備進行連接&#xff0c;實時采集數據、交互信息的網絡&#xff0c;對設備實現智能化自動化感知、識別和控制&#xff0c;給人們帶來便利。 人工智能是計算機科學的一個分支&#xff0c;旨在研究和開發能夠模擬人類智能的技術和方法。人工智能…