溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

發(fā)布時間:2021-10-21 14:13:28 來源:億速云 閱讀:121 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹“微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些”,在日常操作中,相信很多人在微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

微服務(wù)架構(gòu)

在之前的博客文章中,我已經(jīng)詳細(xì)介紹了微服務(wù)體系結(jié)構(gòu):微服務(wù)體系結(jié)構(gòu):簡要概述以及為什么要在下一個項(xiàng)目中使用它以及模塊化單片軟件體系結(jié)構(gòu)真的死了嗎?如果您有興趣,可以閱讀它們以更深入地了解它們。

什么是微服務(wù)架構(gòu)。微服務(wù)架構(gòu)有很多定義。這是我的定義:

微服務(wù)架構(gòu)旨在將大型,復(fù)雜的系統(tǒng)垂直(按功能或業(yè)務(wù)要求)劃分為較小的子系統(tǒng),這些子系統(tǒng)屬于流程(因此可獨(dú)立部署),并且這些子系統(tǒng)之間通過與語言無關(guān)的輕量級網(wǎng)絡(luò)通信相互通信(例如REST,gRPC)或異步(通過消息傳遞)方式。

這是具有微服務(wù)架構(gòu)的業(yè)務(wù)Web應(yīng)用程序的組件視圖:

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> Microservice Architecture by Md Kamaruzzaman

微服務(wù)架構(gòu)的重要特征:

  • 整個應(yīng)用程序分為多個單獨(dú)的進(jìn)程,每個進(jìn)程可以包含多個內(nèi)部模塊。

  • 與模塊化Monoliths或SOA相反,微服務(wù)應(yīng)用程序是垂直拆分的(根據(jù)業(yè)務(wù)能力或領(lǐng)域)

  • 微服務(wù)邊界是外部的。結(jié)果,微服務(wù)通過網(wǎng)絡(luò)調(diào)用(RPC或消息)相互通信。

  • 由于微服務(wù)是獨(dú)立的流程,因此它們可以獨(dú)立部署。

  • 他們以輕巧的方式交流,不需要任何智能交流渠道。

微服務(wù)架構(gòu)的優(yōu)勢:

  • 更好的開發(fā)規(guī)模。

  • 更高的發(fā)展速度。

  • 支持迭代或增量現(xiàn)代化。

  • 充分利用現(xiàn)代軟件開發(fā)生態(tài)系統(tǒng)(云,容器,DevOps,無服務(wù)器)的優(yōu)勢。

  • 支持水平縮放和粒度縮放。

  • 由于尺寸較小,它降低了開發(fā)人員的認(rèn)知復(fù)雜度。

微服務(wù)架構(gòu)的缺點(diǎn):

  • 大量的活動部件(服務(wù),數(shù)據(jù)庫,流程,容器,框架)。

  • 復(fù)雜性從代碼轉(zhuǎn)移到基礎(chǔ)架構(gòu)。

  • RPC調(diào)用和網(wǎng)絡(luò)流量的激增。

  • 管理整個系統(tǒng)的安全性具有挑戰(zhàn)性。

  • 設(shè)計(jì)整個系統(tǒng)比較困難。

  • 介紹分布式系統(tǒng)的復(fù)雜性。

何時使用微服務(wù)架構(gòu):

  • Web規(guī)模應(yīng)用程序開發(fā)。

  • 當(dāng)多個團(tuán)隊(duì)處理應(yīng)用程序時,進(jìn)行企業(yè)應(yīng)用程序開發(fā)。

  • 長期收益優(yōu)先于短期收益。

  • 該團(tuán)隊(duì)擁有能夠設(shè)計(jì)微服務(wù)架構(gòu)的軟件架構(gòu)師或高級工程師。

微服務(wù)架構(gòu)的設(shè)計(jì)模式

每個微服務(wù)獨(dú)占數(shù)據(jù)庫

一旦公司用許多較小的微服務(wù)替換了大型的單片系統(tǒng),它面臨的最重要的決定就是關(guān)于數(shù)據(jù)庫。在整體架構(gòu)中,使用大型中央數(shù)據(jù)庫。許多架構(gòu)師都喜歡保留數(shù)據(jù)庫原樣,即使他們轉(zhuǎn)向微服務(wù)架構(gòu)也是如此。盡管它提供了一些短期好處,但它是一種反模式,尤其是在大規(guī)模系統(tǒng)中,因?yàn)槲⒎?wù)將緊密耦合在數(shù)據(jù)庫層中。轉(zhuǎn)向微服務(wù)的整個目標(biāo)將失敗(例如,團(tuán)隊(duì)授權(quán),獨(dú)立開發(fā))。

更好的方法是為每個微服務(wù)都提供自己的數(shù)據(jù)存儲,以使數(shù)據(jù)庫層中的服務(wù)之間不存在強(qiáng)耦合。在這里,我使用數(shù)據(jù)庫一詞來表示數(shù)據(jù)的邏輯分離,即微服務(wù)可以共享同一物理數(shù)據(jù)庫,但是它們應(yīng)該使用單獨(dú)的架構(gòu)/集合/表。它還將確保根據(jù)域驅(qū)動設(shè)計(jì)正確隔離微服務(wù)。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> Database per Microservice by Md Kamaruzzaman

優(yōu)點(diǎn):

  • 數(shù)據(jù)對服務(wù)的完全所有權(quán)。

  • 開發(fā)服務(wù)的團(tuán)隊(duì)之間的松耦合。

缺點(diǎn):

  • 在服務(wù)之間共享數(shù)據(jù)變得充滿挑戰(zhàn)。

  • 提供應(yīng)用程序范圍的ACID事務(wù)保證變得更加困難。

  • 將Monolith數(shù)據(jù)庫分解為較小的零件需要仔細(xì)設(shè)計(jì),這是一項(xiàng)艱巨的任務(wù)。

每個微服務(wù)何時使用數(shù)據(jù)庫:

  • 在大型企業(yè)中的應(yīng)用。

  • 當(dāng)團(tuán)隊(duì)需要其微服務(wù)的完全所有權(quán)以進(jìn)行開發(fā)擴(kuò)展和提高開發(fā)速度時。

什么時候不使用每個微服務(wù)的數(shù)據(jù)庫:

  • 在小型應(yīng)用中。

  • 如果一個團(tuán)隊(duì)開發(fā)所有微服務(wù)。

啟用技術(shù)示例:

  • 所有SQL和NoSQL數(shù)據(jù)庫都提供邏輯上的數(shù)據(jù)分離(例如,分離的表,集合,模式,數(shù)據(jù)庫)。

事件源 Event Sourcing

在微服務(wù)架構(gòu)中,尤其是在每個微服務(wù)使用數(shù)據(jù)庫的情況下,微服務(wù)需要交換數(shù)據(jù)。對于有彈性,高度可擴(kuò)展和容錯的系統(tǒng),它們應(yīng)通過交換事件進(jìn)行異步通信。在這種情況下,您可能需要進(jìn)行原子操作,例如,更新數(shù)據(jù)庫并發(fā)送消息。如果您有SQL數(shù)據(jù)庫,并且希望為大量數(shù)據(jù)分配分布式事務(wù),則不能使用兩階段鎖定(2PL),因?yàn)樗鼰o法擴(kuò)展。如果您使用NoSQL數(shù)據(jù)庫并希望具有分布式事務(wù),則不能使用2PL,因?yàn)樵S多NoSQL數(shù)據(jù)庫不支持兩階段鎖定。

在這種情況下,請結(jié)合使用基于事件的體系結(jié)構(gòu)和事件源。在傳統(tǒng)數(shù)據(jù)庫中,具有當(dāng)前"狀態(tài)"的業(yè)務(wù)實(shí)體被直接存儲。在事件源中,將存儲任何狀態(tài)更改事件或其他重要事件,而不是實(shí)體。這意味著業(yè)務(wù)實(shí)體的修改將保存為一系列不可變的事件。通過在給定時間重新處理該業(yè)務(wù)實(shí)體的所有事件,可以扣除該業(yè)務(wù)實(shí)體的狀態(tài)。因?yàn)閿?shù)據(jù)存儲為一系列事件,而不是通過直接更新數(shù)據(jù)存儲來存儲,所以各種服務(wù)可以從事件存儲中重播事件以計(jì)算其各自數(shù)據(jù)存儲的適當(dāng)狀態(tài)。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> Event Sourcing by Md Kamaruzzaman

優(yōu)點(diǎn):

  • 為高度可擴(kuò)展的系統(tǒng)提供原子性。

  • 實(shí)體的自動歷史記錄,包括時間旅行功能。

  • 松散耦合和事件驅(qū)動的微服務(wù)。

缺點(diǎn):

  • 從事件存儲中讀取實(shí)體變得具有挑戰(zhàn)性,通常需要額外的數(shù)據(jù)存儲(CQRS模式)

  • 系統(tǒng)的整體復(fù)雜性增加,通常需要域驅(qū)動設(shè)計(jì)。

  • 系統(tǒng)需要處理重復(fù)事件(冪等)或丟失事件。

  • 遷移事件模式變得具有挑戰(zhàn)性。

何時使用事件來源:

  • 具有SQL數(shù)據(jù)庫的高度可擴(kuò)展的事務(wù)系統(tǒng)。

  • 帶有NoSQL數(shù)據(jù)庫的事務(wù)系統(tǒng)。

  • 高度可擴(kuò)展且具有彈性的微服務(wù)架構(gòu)。

  • 典型的消息驅(qū)動或事件驅(qū)動系統(tǒng)(電子商務(wù),預(yù)訂和預(yù)訂系統(tǒng))。

何時不使用事件來源:

  • 具有SQL數(shù)據(jù)庫的低伸縮性事務(wù)系統(tǒng)。

  • 在簡單的微服務(wù)架構(gòu)中,微服務(wù)可以同步交換數(shù)據(jù)(例如,通過API)。

啟用技術(shù)示例:

  • 事件存儲:EventStoreDB,Apache Kafka,Confluent Cloud,AWS  Kinesis,Azure事件中心,GCP發(fā)布/訂閱,Azure Cosmos DB,MongoDB,Cassandra。Amazon  DynamoDB,

  • 框架:Lagom,Akka,Spring,akkatecture,Axon,Eventuate

命令查詢職責(zé)隔離(CQRS)

如果我們使用事件源,那么從事件存儲中讀取數(shù)據(jù)將變得充滿挑戰(zhàn)。要從數(shù)據(jù)存儲中獲取實(shí)體,我們需要處理所有實(shí)體事件。另外,有時我們對讀寫操作有不同的一致性和吞吐量要求。

在這種用例中,我們可以使用CQRS模式。在CQRS模式中,系統(tǒng)的數(shù)據(jù)修改部分(命令)與數(shù)據(jù)讀取(查詢)部分分開。CQRS模式有兩種形式:簡單和高級,這導(dǎo)致軟件工程師之間產(chǎn)生一些混淆。

以簡單的形式,不同的實(shí)體或ORM模型用于讀取和寫入,如下所示:

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> CQRS (simple) by Md Kamaruzzaman

它有助于實(shí)施"單一責(zé)任原則"和"關(guān)注點(diǎn)分離",從而使設(shè)計(jì)更簡潔。

在其高級形式中,不同的數(shù)據(jù)存儲區(qū)用于讀取和寫入操作。高級CQRS與事件來源一起使用。根據(jù)使用情況,使用不同類型的寫入數(shù)據(jù)存儲和讀取數(shù)據(jù)存儲。寫入數(shù)據(jù)存儲區(qū)是"記錄系統(tǒng)",即整個系統(tǒng)的黃金來源。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> CQRS (advanced) by Md Kamaruzzaman

對于重讀應(yīng)用程序或微服務(wù)體系結(jié)構(gòu),將OLTP數(shù)據(jù)庫(任何提供ACID事務(wù)保證的SQL或NoSQL數(shù)據(jù)庫)或分布式消息平臺用作寫存儲。對于繁重的寫程序(高寫可伸縮性和吞吐量),使用了水平可寫伸縮的數(shù)據(jù)庫(公共云全局?jǐn)?shù)據(jù)庫)。規(guī)范化的數(shù)據(jù)保存在寫入數(shù)據(jù)存儲中。

為搜索(例如Apache  Solr,Elasticsearch)或讀取(鍵值數(shù)據(jù)存儲,文檔數(shù)據(jù)存儲)而優(yōu)化的NoSQL數(shù)據(jù)庫用作讀取存儲。在許多情況下,在需要SQL查詢的地方使用可伸縮的SQL數(shù)據(jù)庫。歸一化和優(yōu)化的數(shù)據(jù)將保存在讀取存儲中。

數(shù)據(jù)從寫入存儲異步復(fù)制到讀取存儲。結(jié)果,讀存儲區(qū)滯后于寫存儲區(qū),并且最終保持一致。

優(yōu)點(diǎn):

  • 在事件驅(qū)動的微服務(wù)中更快地讀取數(shù)據(jù)。

  • 數(shù)據(jù)的高可用性。

  • 讀寫系統(tǒng)可以獨(dú)立擴(kuò)展。

缺點(diǎn):

  • 讀取數(shù)據(jù)存儲弱一致性(最終一致性)

  • 系統(tǒng)的整體復(fù)雜性增加。貨運(yùn)培訓(xùn)CQRS可能會嚴(yán)重危害整個項(xiàng)目。

何時使用CQRS:

  • 在使用事件源的高度可擴(kuò)展的微服務(wù)體系結(jié)構(gòu)中。

  • 在讀取數(shù)據(jù)需要查詢到多個數(shù)據(jù)存儲區(qū)的復(fù)雜域模型中。

  • 在讀寫操作具有不同負(fù)載的系統(tǒng)中。

何時不使用CQRS:

  • 在微事件數(shù)量微不足道的微服務(wù)體系結(jié)構(gòu)中,使用事件存儲快照來計(jì)算實(shí)體狀態(tài)是更好的選擇。

  • 在讀寫操作具有相似負(fù)載的系統(tǒng)中。

啟用技術(shù)示例:

  • 寫存儲:EventStoreDB,Apache Kafka,Confluent Cloud,AWS Kinesis,Azure Event  Hub,GCP發(fā)布/訂閱,Azure Cosmos DB,MongoDB,Cassandra。亞馬遜DynamoDB

  • 閱讀商店:Elastic Search,Solr,Cloud Spanner,Amazon Aurora,Azure Cosmos  DB,Neo4j

  • 框架:Lagom,Akka,Spring,akkatecture,Axon,Eventuate

SAGA

如果您將微服務(wù)體系結(jié)構(gòu)與每個微服務(wù)的數(shù)據(jù)庫一起使用,那么通過分布式事務(wù)管理一致性就具有挑戰(zhàn)性。您不能使用傳統(tǒng)的兩階段提交協(xié)議,因?yàn)樗鼰o法擴(kuò)展(SQL數(shù)據(jù)庫)或不被支持(許多NoSQL數(shù)據(jù)庫)。

您可以將Saga模式用于Microservice  Architecture中的分布式事務(wù)。Saga是一種舊模式,于1987年開發(fā),作為SQL數(shù)據(jù)庫中長期運(yùn)行的數(shù)據(jù)庫事務(wù)的概念替代方案。但是,這種模式的現(xiàn)代變體對于分布式事務(wù)也非常有效。Saga模式是一個本地事務(wù)序列,其中每個事務(wù)在單個微服務(wù)中更新數(shù)據(jù)存儲中的數(shù)據(jù)并發(fā)布事件或消息。傳奇中的第一個事務(wù)由外部請求(事件或操作)啟動。一旦本地事務(wù)完成(數(shù)據(jù)存儲在數(shù)據(jù)存儲中,并且發(fā)布消息或事件),發(fā)布的消息/事件將觸發(fā)Saga中的下一個本地事務(wù)。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> Saga by Md Kamaruzzaman

如果本地事務(wù)失敗,則Saga執(zhí)行一系列補(bǔ)償事務(wù),以撤消先前本地事務(wù)的更改。

Saga交易協(xié)調(diào)主要有兩種變體:

  • 分散的協(xié)調(diào),每個微服務(wù)生成并收聽其他微服務(wù)的事件/消息,并決定是否應(yīng)該采取措施。

  • 統(tǒng)籌協(xié)調(diào),協(xié)調(diào)器告訴協(xié)調(diào)的微服務(wù)哪些本地事務(wù)需要執(zhí)行。

優(yōu)點(diǎn):

  • 通過高度可擴(kuò)展的或松散耦合的,事件驅(qū)動的微服務(wù)架構(gòu)中的事務(wù)來提供一致性。

  • 通過使用沒有2PC支持的NoSQL數(shù)據(jù)庫的微服務(wù)體系結(jié)構(gòu)中的事務(wù)來提供一致性。

缺點(diǎn):

  • 需要處理短暫故障,并應(yīng)提供冪等性。

  • 難以調(diào)試,并且隨著微服務(wù)數(shù)量的增加,復(fù)雜性也隨之增加。

何時使用佐賀:

  • 在使用事件源的高度可擴(kuò)展的,松散耦合的微服務(wù)架構(gòu)中。

  • 在使用分布式NoSQL數(shù)據(jù)庫的系統(tǒng)中。

什么時候不使用佐賀:

  • 具有SQL數(shù)據(jù)庫的低伸縮性事務(wù)系統(tǒng)。

  • 在服務(wù)之間存在循環(huán)依賴性的系統(tǒng)中。

啟用技術(shù)示例:

  • Axon,Eventuate,Narayana

前端的后端(BFF)

在現(xiàn)代業(yè)務(wù)應(yīng)用程序開發(fā)中,尤其是在微服務(wù)體系結(jié)構(gòu)中,前端和后端應(yīng)用程序是分離的和獨(dú)立的服務(wù)。它們通過API或GraphQL連接。如果應(yīng)用程序還具有Mobile  App客戶端,則對Web和Mobile客戶端使用相同的后端微服務(wù)將成為問題。移動客戶端的API要求通常與Web客戶端不同,因?yàn)樗鼈兙哂胁煌钠聊淮笮?,顯示,性能,能源和網(wǎng)絡(luò)帶寬。

后端的后端模式可用于每個UI都有為特定UI定制的單獨(dú)后端的場景。它還提供了其他優(yōu)勢,例如充當(dāng)下游微服務(wù)的外觀,從而減少了UI與下游微服務(wù)之間的閑聊通信。同樣,在高度安全的情況下,下游微服務(wù)部署在DMZ網(wǎng)絡(luò)中,BFF用于提供更高的安全性。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> Backends for Frontends by Md Kamaruzzaman

優(yōu)點(diǎn):

  • BFF之間的關(guān)注點(diǎn)分離。我們可以針對特定的UI優(yōu)化它們。

  • 提供更高的安全性。

  • 減少UI與下游微服務(wù)之間的交流。

缺點(diǎn):

  • BFF之間的代碼重復(fù)。

  • 如果使用其他許多UI(例如,智能電視,Web,移動設(shè)備,臺式機(jī)),BFF的數(shù)量也會激增。

  • BFF不應(yīng)包含任何業(yè)務(wù)邏輯,而應(yīng)僅包含特定于客戶的邏輯和行為,因此需要仔細(xì)設(shè)計(jì)和實(shí)施。

何時將后端用于前端:

  • 如果應(yīng)用程序具有多個具有不同API要求的UI。

  • 如果出于安全原因在UI和下游微服務(wù)之間需要額外的一層。

  • 如果在UI開發(fā)中使用微前端。

何時不使用后端作為前端:

  • 如果應(yīng)用程序具有多個UI,但是它們使用相同的API。

  • 如果未在DMZ中部署核心微服務(wù)。

啟用技術(shù)示例:

  • 任何后端框架(Node.js,Spring,Django,Laravel,F(xiàn)lask,Play等)都支持它。

API網(wǎng)關(guān)

在微服務(wù)架構(gòu)中,UI通常與多個微服務(wù)連接。如果微服務(wù)是細(xì)粒度的(FaaS),則客戶端可能需要連接許多微服務(wù),這變得很繁瑣且具有挑戰(zhàn)性。而且,服務(wù)(包括其API)可以發(fā)展。大型企業(yè)還希望擁有其他跨領(lǐng)域的問題(SSL終止,身份驗(yàn)證,授權(quán),限制,日志記錄等)。

解決這些問題的一種可能方法是使用API網(wǎng)關(guān)。API網(wǎng)關(guān)位于客戶端APP和后端微服務(wù)之間,并充當(dāng)外觀。它可以用作反向代理,將客戶端請求路由到適當(dāng)?shù)暮蠖宋⒎?wù)。它還可以支持將客戶端請求的扇出擴(kuò)展到多個微服務(wù),然后將匯總的響應(yīng)返回給客戶端。它還支持基本的跨領(lǐng)域關(guān)注。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> API Gateway by Md Kamaruzzaman

優(yōu)點(diǎn):

  • 提供前端和后端微服務(wù)之間的松散耦合。

  • 減少客戶端和微服務(wù)之間的往返呼叫次數(shù)。

  • 通過SSL終止,身份驗(yàn)證和授權(quán)實(shí)現(xiàn)高安全性。

  • 集中管理的跨領(lǐng)域問題,例如日志記錄和監(jiān)視,節(jié)流,負(fù)載平衡。

缺點(diǎn):

  • 可能導(dǎo)致微服務(wù)架構(gòu)中的單點(diǎn)故障。

  • 由于額外的網(wǎng)絡(luò)呼叫,延遲增加了。

  • 如果不進(jìn)行擴(kuò)展,它們很容易成為整個企業(yè)的瓶頸。

  • 額外的維護(hù)和開發(fā)成本。

何時使用API網(wǎng)關(guān):

  • 在復(fù)雜的微服務(wù)架構(gòu)中,這幾乎是強(qiáng)制性的。

  • 在大型公司中,必須使用API網(wǎng)關(guān)來集中安全性和跨領(lǐng)域問題。

何時不使用API網(wǎng)關(guān):

  • 在安全性和中央管理不是最高優(yōu)先級的私人項(xiàng)目或小型公司中。

  • 如果微服務(wù)的數(shù)量很小。

啟用技術(shù)示例:

  • Amazon API Gateway,Azure API管理,Apigee,Kong,WSO2 API管理器

扼殺者

如果要在棕地項(xiàng)目中使用微服務(wù)架構(gòu),則需要將舊版或現(xiàn)有的Monolithic應(yīng)用程序遷移到微服務(wù)。將現(xiàn)有的大型生產(chǎn)單片式應(yīng)用程序遷移到微服務(wù)中具有很大的挑戰(zhàn)性,因?yàn)檫@可能會破壞應(yīng)用程序的可用性。

一種解決方案是使用Strangler模式。Strangler模式意味著通過逐步用新的微服務(wù)替換特定功能,將Monolithic應(yīng)用程序逐步遷移到微服務(wù)架構(gòu)。此外,新功能僅在微服務(wù)中添加,繞過了傳統(tǒng)的Monolithic應(yīng)用程序。然后將Facade(API網(wǎng)關(guān))配置為在舊版Monolith和微服務(wù)之間路由請求。一旦功能從Monolith遷移到微服務(wù),F(xiàn)acade就會攔截客戶端請求并路由到新的微服務(wù)。一旦所有舊版Monolithic功能都已遷移,舊版Monolithic應(yīng)用程序?qū)⒈?quot;勒死",即退役。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> Strangler by Md Kamaruzzaman

優(yōu)點(diǎn):

  • 將Monolithic應(yīng)用程序安全遷移到微服務(wù)。

  • 遷移和新功能開發(fā)可以并行進(jìn)行。

  • 遷移過程可以有自己的進(jìn)度。

缺點(diǎn):

  • 在現(xiàn)有的Monolith和新的微服務(wù)之間共享數(shù)據(jù)存儲變得充滿挑戰(zhàn)。

  • 添加外觀(API網(wǎng)關(guān))將增加系統(tǒng)延遲。

  • 端到端測試變得困難。

何時使用Strangler:

  • 將大型后端單片應(yīng)用程序增量遷移到微服務(wù)。

何時不使用Strangler:

  • 如果后端整體組件較小,則批量替換是一個更好的選擇。

  • 如果客戶端對舊版Monolithic應(yīng)用程序的請求無法被攔截。

推動技術(shù):

  • 帶有API網(wǎng)關(guān)的后端應(yīng)用程序框架。

斷路器

在微服務(wù)體系結(jié)構(gòu)中,微服務(wù)進(jìn)行同步通信,微服務(wù)通常調(diào)用其他服務(wù)來滿足業(yè)務(wù)需求。由于瞬態(tài)故障(網(wǎng)絡(luò)連接速度慢,超時或時間不可用),對另一個服務(wù)的調(diào)用可能會失敗。在這種情況下,重試呼叫可以解決此問題。但是,如果存在嚴(yán)重問題(微服務(wù)完全失敗),則微服務(wù)將長時間不可用。在這種情況下,重試是沒有意義的,并且浪費(fèi)了寶貴的資源(線程被阻塞,浪費(fèi)了CPU周期)。同樣,一項(xiàng)服務(wù)的故障可能會導(dǎo)致整個應(yīng)用程序級聯(lián)故障。在這種情況下,立即失敗是一種更好的方法。

對于此類用例,可以使用斷路器模式。微服務(wù)應(yīng)通過代理來請求另一個微服務(wù),該代理的工作方式類似于斷路器。代理應(yīng)該計(jì)算最近發(fā)生的故障數(shù),并使用它來決定是允許操作繼續(xù)進(jìn)行還是直接返回異常。

微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些

> Circuit Breaker by Md Kamaruzzaman

  • 斷路器可以具有以下三種狀態(tài):

  • 已關(guān)閉:斷路器將請求發(fā)送到微服務(wù),并計(jì)算給定時間段內(nèi)的故障數(shù)。如果在一定時間內(nèi)的故障數(shù)量超過閾值,則它將跳閘并進(jìn)入"打開狀態(tài)"。

  • 打開:來自微服務(wù)的請求立即失敗,并返回異常。超時后,斷路器進(jìn)入半開狀態(tài)。

  • 半開放式:僅允許來自微服務(wù)的有限數(shù)量的請求通過并調(diào)用該操作。如果這些請求成功,則斷路器將進(jìn)入閉合狀態(tài)。如果任何請求失敗,則斷路器進(jìn)入"打開"狀態(tài)。

優(yōu)點(diǎn):

  • 提高微服務(wù)架構(gòu)的容錯性和彈性。

  • 停止將故障級聯(lián)到其他微服務(wù)。

缺點(diǎn):

  • 需要復(fù)雜的異常處理。

  • 記錄和監(jiān)視。

  • 應(yīng)該支持手動重置。

何時使用斷路器:

  • 在緊密耦合的微服務(wù)體系結(jié)構(gòu)中,微服務(wù)進(jìn)行同步通信。

  • 一個微服務(wù)是否依賴于多個其他微服務(wù)。

何時不使用斷路器:

  • 松散耦合的,事件驅(qū)動的微服務(wù)架構(gòu)。

  • 微服務(wù)是否不依賴于其他微服務(wù)。

推動技術(shù):

  • API網(wǎng)關(guān),服務(wù)網(wǎng)格,各種斷路器庫(Hystrix,Reselience4J,Polly。

外部化配置

每個業(yè)務(wù)應(yīng)用程序都有許多用于各種基礎(chǔ)結(jié)構(gòu)的配置參數(shù)(例如,數(shù)據(jù)庫,網(wǎng)絡(luò),連接的服務(wù)地址,憑據(jù),證書路徑)。同樣,在企業(yè)環(huán)境中,應(yīng)用程序通常部署在各種運(yùn)行時中(本地,開發(fā),生產(chǎn))。實(shí)現(xiàn)此目標(biāo)的一種方法是通過內(nèi)部配置,這是一種致命的不良做法。由于很容易破壞生產(chǎn)憑據(jù),因此可能導(dǎo)致嚴(yán)重的安全風(fēng)險。另外,配置參數(shù)的任何更改都需要重建應(yīng)用程序。在微服務(wù)架構(gòu)中,這一點(diǎn)尤為重要,因?yàn)槲覀兛赡軗碛袛?shù)百種服務(wù)。

更好的方法是外部化所有配置。結(jié)果,將構(gòu)建過程與運(yùn)行時環(huán)境分開。此外,由于生產(chǎn)配置文件僅在運(yùn)行時或通過環(huán)境變量使用,因此將安全風(fēng)險降到最低。

優(yōu)點(diǎn):

  • 生產(chǎn)配置不是代碼庫的一部分,因此可以最大程度地減少安全漏洞。

  • 無需重新構(gòu)建即可更改配置參數(shù)。

缺點(diǎn):

  • 我們需要選擇一個支持外部化配置的框架。

何時使用外部化配置:

  • 任何重要的生產(chǎn)應(yīng)用程序都必須使用外部配置。

何時不使用外部化配置:

  • 在概念發(fā)展的證明。

推動技術(shù):幾乎所有企業(yè)級的現(xiàn)代框架都支持外部化配置。

消費(fèi)者驅(qū)動的合同測試

在微服務(wù)架構(gòu)中,通常由獨(dú)立的團(tuán)隊(duì)開發(fā)許多微服務(wù)。這些微服務(wù)一起工作來滿足業(yè)務(wù)需求(例如,客戶請求),并且彼此同步或異步地通信。消費(fèi)者微服務(wù)的集成測試具有挑戰(zhàn)性。通常,在這種情況下使用TestDouble可以進(jìn)行更快,更便宜的測試。但是TestDouble通常并不代表真正的提供程序微服務(wù)。另外,如果提供者微服務(wù)更改了其API或消息,則TestDouble無法確認(rèn)這一點(diǎn)。另一個選擇是進(jìn)行端到端測試。雖然在生產(chǎn)之前必須進(jìn)行端到端測試,但它脆弱,緩慢,昂貴,并且不能替代集成測試(測試金字塔)。

消費(fèi)者驅(qū)動的合同測試可以在這方面為我們提供幫助。此處,消費(fèi)者微服務(wù)所有者團(tuán)隊(duì)編寫了一個測試套件,其中包含針對特定提供者微服務(wù)的請求和預(yù)期響應(yīng)(用于同步通信)或預(yù)期消息(用于異步通信)。這些測試套件稱為顯式合同。對于提供商微服務(wù),其使用者的所有合同測試套件都添加到了自動測試中。在執(zhí)行針對特定提供程序微服務(wù)的自動測試時,它將運(yùn)行自己的測試,合同并驗(yàn)證合同。通過這種方式,合同測試可以幫助以自動化的方式維護(hù)微服務(wù)通信的完整性。

優(yōu)點(diǎn):

  • 如果提供者意外更改了API或消息,則會在很短的時間內(nèi)自動找到它。

  • 更少的驚喜和更高的健壯性,尤其是包含大量微服務(wù)的企業(yè)應(yīng)用程序。

  • 改善團(tuán)隊(duì)自主權(quán)。

缺點(diǎn):

  • 由于合同測試可能使用完全不同的測試工具,因此需要進(jìn)行額外的工作才能在合同商微服務(wù)中開發(fā)和集成合同測試。

  • 如果合同測試與實(shí)際服務(wù)消耗不匹配,則可能導(dǎo)致生產(chǎn)失敗。

何時使用消費(fèi)者驅(qū)動的合同測試:

  • 在大型企業(yè)業(yè)務(wù)應(yīng)用程序中,通常,不同的團(tuán)隊(duì)開發(fā)不同的服務(wù)。

何時不使用消費(fèi)者主導(dǎo)的合同測試:

  • 一個團(tuán)隊(duì)開發(fā)所有微服務(wù)的相對簡單,較小的應(yīng)用程序。

  • 提供者微服務(wù)是否相對穩(wěn)定且未處于積極開發(fā)中。

推動技術(shù):

  • 契約,郵遞員,Spring Cloud合同

到此,關(guān)于“微服務(wù)架構(gòu)最重要的設(shè)計(jì)模式有哪些”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬?shí)用的文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI