微服務架構10個最重要的設計模式
自從軟件開發(fā)的早期(1960年代)以來,解決大型軟件系統(tǒng)中的復雜性一直是一項艱巨的任務。多年來,軟件工程師和架構師為解決軟件系統(tǒng)的復雜性進行了許多嘗試:David Parnas的模塊化和信息隱藏(1972),Edsger W. Dijkstra的關注分離(1974),面向服務的體系結構(1998)。
他們所有人都使用了久經(jīng)考驗的成熟技術來解決大型系統(tǒng)的復雜性:分而治之。自2010年代以來,這些技術不足以解決Web規(guī)模應用程序或現(xiàn)代大型企業(yè)應用程序的復雜性。結果,架構師和工程師開發(fā)了一種新方法來解決現(xiàn)代軟件系統(tǒng)的復雜性:微服務架構。它也使用了相同的舊"分而治之"技術,盡管采用了新穎的方式。
軟件設計模式是解決軟件設計中常見問題的通用,可重用的解決方案。設計模式可幫助我們共享通用詞匯,并使用經(jīng)過實戰(zhàn)檢驗的解決方案,而不是重新發(fā)明輪子。在上一篇文章:有效的微服務:10個最佳實踐中,我描述了開發(fā)有效的微服務的一組最佳實踐。在這里,我將描述一組設計模式,以幫助您實現(xiàn)這些最佳實踐。如果您是微服務架構的新手,那么不用擔心,我將向您介紹微服務架構。
通過閱讀本文,您將學到:
- 微服務架構
 - 微服務架構的優(yōu)勢
 - 微服務架構的缺點
 - 何時使用微服務架構
 - 最重要的微服務架構設計模式,包括其優(yōu)缺點,用例,上下文,技術堆棧示例和有用的資源。
 
請注意,此清單的大多數(shù)設計模式都有幾種上下文,可以在非微服務體系結構中使用。但是我將在微服務架構的背景下對其進行描述。
微服務架構
在之前的博客文章中,我已經(jīng)詳細介紹了微服務體系結構:微服務體系結構:簡要概述以及為什么要在下一個項目中使用它以及模塊化單片軟件體系結構真的死了嗎?如果您有興趣,可以閱讀它們以更深入地了解它們。
什么是微服務架構。微服務架構有很多定義。這是我的定義:
微服務架構旨在將大型,復雜的系統(tǒng)垂直(按功能或業(yè)務要求)劃分為較小的子系統(tǒng),這些子系統(tǒng)屬于流程(因此可獨立部署),并且這些子系統(tǒng)之間通過與語言無關的輕量級網(wǎng)絡通信相互通信(例如REST,gRPC)或異步(通過消息傳遞)方式。
這是具有微服務架構的業(yè)務Web應用程序的組件視圖:

> Microservice Architecture by Md Kamaruzzaman
微服務架構的重要特征:
- 整個應用程序分為多個單獨的進程,每個進程可以包含多個內(nèi)部模塊。
 - 與模塊化Monoliths或SOA相反,微服務應用程序是垂直拆分的(根據(jù)業(yè)務能力或領域)
 - 微服務邊界是外部的。結果,微服務通過網(wǎng)絡調(diào)用(RPC或消息)相互通信。
 - 由于微服務是獨立的流程,因此它們可以獨立部署。
 - 他們以輕巧的方式交流,不需要任何智能交流渠道。
 
微服務架構的優(yōu)勢:
- 更好的開發(fā)規(guī)模。
 - 更高的發(fā)展速度。
 - 支持迭代或增量現(xiàn)代化。
 - 充分利用現(xiàn)代軟件開發(fā)生態(tài)系統(tǒng)(云,容器,DevOps,無服務器)的優(yōu)勢。
 - 支持水平縮放和粒度縮放。
 - 由于尺寸較小,它降低了開發(fā)人員的認知復雜度。
 
微服務架構的缺點:
- 大量的活動部件(服務,數(shù)據(jù)庫,流程,容器,框架)。
 - 復雜性從代碼轉移到基礎架構。
 - RPC調(diào)用和網(wǎng)絡流量的激增。
 - 管理整個系統(tǒng)的安全性具有挑戰(zhàn)性。
 - 設計整個系統(tǒng)比較困難。
 - 介紹分布式系統(tǒng)的復雜性。
 
何時使用微服務架構:
- Web規(guī)模應用程序開發(fā)。
 - 當多個團隊處理應用程序時,進行企業(yè)應用程序開發(fā)。
 - 長期收益優(yōu)先于短期收益。
 - 該團隊擁有能夠設計微服務架構的軟件架構師或高級工程師。
 
微服務架構的設計模式
每個微服務獨占數(shù)據(jù)庫
一旦公司用許多較小的微服務替換了大型的單片系統(tǒng),它面臨的最重要的決定就是關于數(shù)據(jù)庫。在整體架構中,使用大型中央數(shù)據(jù)庫。許多架構師都喜歡保留數(shù)據(jù)庫原樣,即使他們轉向微服務架構也是如此。盡管它提供了一些短期好處,但它是一種反模式,尤其是在大規(guī)模系統(tǒng)中,因為微服務將緊密耦合在數(shù)據(jù)庫層中。轉向微服務的整個目標將失敗(例如,團隊授權,獨立開發(fā))。
更好的方法是為每個微服務都提供自己的數(shù)據(jù)存儲,以使數(shù)據(jù)庫層中的服務之間不存在強耦合。在這里,我使用數(shù)據(jù)庫一詞來表示數(shù)據(jù)的邏輯分離,即微服務可以共享同一物理數(shù)據(jù)庫,但是它們應該使用單獨的架構/集合/表。它還將確保根據(jù)域驅動設計正確隔離微服務。

> Database per Microservice by Md Kamaruzzaman
優(yōu)點:
- 數(shù)據(jù)對服務的完全所有權。
 - 開發(fā)服務的團隊之間的松耦合。
 
缺點:
- 在服務之間共享數(shù)據(jù)變得充滿挑戰(zhàn)。
 - 提供應用程序范圍的ACID事務保證變得更加困難。
 - 將Monolith數(shù)據(jù)庫分解為較小的零件需要仔細設計,這是一項艱巨的任務。
 
每個微服務何時使用數(shù)據(jù)庫:
- 在大型企業(yè)中的應用。
 - 當團隊需要其微服務的完全所有權以進行開發(fā)擴展和提高開發(fā)速度時。
 
什么時候不使用每個微服務的數(shù)據(jù)庫:
- 在小型應用中。
 - 如果一個團隊開發(fā)所有微服務。
 
啟用技術示例:
- 所有SQL和NoSQL數(shù)據(jù)庫都提供邏輯上的數(shù)據(jù)分離(例如,分離的表,集合,模式,數(shù)據(jù)庫)。
 
事件源 Event Sourcing
在微服務架構中,尤其是在每個微服務使用數(shù)據(jù)庫的情況下,微服務需要交換數(shù)據(jù)。對于有彈性,高度可擴展和容錯的系統(tǒng),它們應通過交換事件進行異步通信。在這種情況下,您可能需要進行原子操作,例如,更新數(shù)據(jù)庫并發(fā)送消息。如果您有SQL數(shù)據(jù)庫,并且希望為大量數(shù)據(jù)分配分布式事務,則不能使用兩階段鎖定(2PL),因為它無法擴展。如果您使用NoSQL數(shù)據(jù)庫并希望具有分布式事務,則不能使用2PL,因為許多NoSQL數(shù)據(jù)庫不支持兩階段鎖定。
在這種情況下,請結合使用基于事件的體系結構和事件源。在傳統(tǒng)數(shù)據(jù)庫中,具有當前"狀態(tài)"的業(yè)務實體被直接存儲。在事件源中,將存儲任何狀態(tài)更改事件或其他重要事件,而不是實體。這意味著業(yè)務實體的修改將保存為一系列不可變的事件。通過在給定時間重新處理該業(yè)務實體的所有事件,可以扣除該業(yè)務實體的狀態(tài)。因為數(shù)據(jù)存儲為一系列事件,而不是通過直接更新數(shù)據(jù)存儲來存儲,所以各種服務可以從事件存儲中重播事件以計算其各自數(shù)據(jù)存儲的適當狀態(tài)。

> Event Sourcing by Md Kamaruzzaman
優(yōu)點:
- 為高度可擴展的系統(tǒng)提供原子性。
 - 實體的自動歷史記錄,包括時間旅行功能。
 - 松散耦合和事件驅動的微服務。
 
缺點:
- 從事件存儲中讀取實體變得具有挑戰(zhàn)性,通常需要額外的數(shù)據(jù)存儲(CQRS模式)
 - 系統(tǒng)的整體復雜性增加,通常需要域驅動設計。
 - 系統(tǒng)需要處理重復事件(冪等)或丟失事件。
 - 遷移事件模式變得具有挑戰(zhàn)性。
 
何時使用事件來源:
- 具有SQL數(shù)據(jù)庫的高度可擴展的事務系統(tǒng)。
 - 帶有NoSQL數(shù)據(jù)庫的事務系統(tǒng)。
 - 高度可擴展且具有彈性的微服務架構。
 - 典型的消息驅動或事件驅動系統(tǒng)(電子商務,預訂和預訂系統(tǒng))。
 
何時不使用事件來源:
- 具有SQL數(shù)據(jù)庫的低伸縮性事務系統(tǒng)。
 - 在簡單的微服務架構中,微服務可以同步交換數(shù)據(jù)(例如,通過API)。
 
啟用技術示例:
- 事件存儲:EventStoreDB,Apache Kafka,Confluent Cloud,AWS Kinesis,Azure事件中心,GCP發(fā)布/訂閱,Azure Cosmos DB,MongoDB,Cassandra。Amazon DynamoDB,
 - 框架:Lagom,Akka,Spring,akkatecture,Axon,Eventuate
 
命令查詢職責隔離(CQRS)
如果我們使用事件源,那么從事件存儲中讀取數(shù)據(jù)將變得充滿挑戰(zhàn)。要從數(shù)據(jù)存儲中獲取實體,我們需要處理所有實體事件。另外,有時我們對讀寫操作有不同的一致性和吞吐量要求。
在這種用例中,我們可以使用CQRS模式。在CQRS模式中,系統(tǒng)的數(shù)據(jù)修改部分(命令)與數(shù)據(jù)讀取(查詢)部分分開。CQRS模式有兩種形式:簡單和高級,這導致軟件工程師之間產(chǎn)生一些混淆。
以簡單的形式,不同的實體或ORM模型用于讀取和寫入,如下所示:

> CQRS (simple) by Md Kamaruzzaman
它有助于實施"單一責任原則"和"關注點分離",從而使設計更簡潔。
在其高級形式中,不同的數(shù)據(jù)存儲區(qū)用于讀取和寫入操作。高級CQRS與事件來源一起使用。根據(jù)使用情況,使用不同類型的寫入數(shù)據(jù)存儲和讀取數(shù)據(jù)存儲。寫入數(shù)據(jù)存儲區(qū)是"記錄系統(tǒng)",即整個系統(tǒng)的黃金來源。

> CQRS (advanced) by Md Kamaruzzaman
對于重讀應用程序或微服務體系結構,將OLTP數(shù)據(jù)庫(任何提供ACID事務保證的SQL或NoSQL數(shù)據(jù)庫)或分布式消息平臺用作寫存儲。對于繁重的寫程序(高寫可伸縮性和吞吐量),使用了水平可寫伸縮的數(shù)據(jù)庫(公共云全局數(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ù)從寫入存儲異步復制到讀取存儲。結果,讀存儲區(qū)滯后于寫存儲區(qū),并且最終保持一致。
優(yōu)點:
- 在事件驅動的微服務中更快地讀取數(shù)據(jù)。
 - 數(shù)據(jù)的高可用性。
 - 讀寫系統(tǒng)可以獨立擴展。
 
缺點:
- 讀取數(shù)據(jù)存儲弱一致性(最終一致性)
 - 系統(tǒng)的整體復雜性增加。貨運培訓CQRS可能會嚴重危害整個項目。
 
何時使用CQRS:
- 在使用事件源的高度可擴展的微服務體系結構中。
 - 在讀取數(shù)據(jù)需要查詢到多個數(shù)據(jù)存儲區(qū)的復雜域模型中。
 - 在讀寫操作具有不同負載的系統(tǒng)中。
 
何時不使用CQRS:
- 在微事件數(shù)量微不足道的微服務體系結構中,使用事件存儲快照來計算實體狀態(tài)是更好的選擇。
 - 在讀寫操作具有相似負載的系統(tǒng)中。
 
啟用技術示例:
- 寫存儲: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
如果您將微服務體系結構與每個微服務的數(shù)據(jù)庫一起使用,那么通過分布式事務管理一致性就具有挑戰(zhàn)性。您不能使用傳統(tǒng)的兩階段提交協(xié)議,因為它無法擴展(SQL數(shù)據(jù)庫)或不被支持(許多NoSQL數(shù)據(jù)庫)。
您可以將Saga模式用于Microservice Architecture中的分布式事務。Saga是一種舊模式,于1987年開發(fā),作為SQL數(shù)據(jù)庫中長期運行的數(shù)據(jù)庫事務的概念替代方案。但是,這種模式的現(xiàn)代變體對于分布式事務也非常有效。Saga模式是一個本地事務序列,其中每個事務在單個微服務中更新數(shù)據(jù)存儲中的數(shù)據(jù)并發(fā)布事件或消息。傳奇中的第一個事務由外部請求(事件或操作)啟動。一旦本地事務完成(數(shù)據(jù)存儲在數(shù)據(jù)存儲中,并且發(fā)布消息或事件),發(fā)布的消息/事件將觸發(fā)Saga中的下一個本地事務。

> Saga by Md Kamaruzzaman
如果本地事務失敗,則Saga執(zhí)行一系列補償事務,以撤消先前本地事務的更改。
Saga交易協(xié)調(diào)主要有兩種變體:
- 分散的協(xié)調(diào),每個微服務生成并收聽其他微服務的事件/消息,并決定是否應該采取措施。
 - 統(tǒng)籌協(xié)調(diào),協(xié)調(diào)器告訴協(xié)調(diào)的微服務哪些本地事務需要執(zhí)行。
 
優(yōu)點:
- 通過高度可擴展的或松散耦合的,事件驅動的微服務架構中的事務來提供一致性。
 - 通過使用沒有2PC支持的NoSQL數(shù)據(jù)庫的微服務體系結構中的事務來提供一致性。
 
缺點:
- 需要處理短暫故障,并應提供冪等性。
 - 難以調(diào)試,并且隨著微服務數(shù)量的增加,復雜性也隨之增加。
 
何時使用佐賀:
- 在使用事件源的高度可擴展的,松散耦合的微服務架構中。
 - 在使用分布式NoSQL數(shù)據(jù)庫的系統(tǒng)中。
 
什么時候不使用佐賀:
- 具有SQL數(shù)據(jù)庫的低伸縮性事務系統(tǒng)。
 - 在服務之間存在循環(huán)依賴性的系統(tǒng)中。
 
啟用技術示例:
- Axon,Eventuate,Narayana
 
前端的后端(BFF)
在現(xiàn)代業(yè)務應用程序開發(fā)中,尤其是在微服務體系結構中,前端和后端應用程序是分離的和獨立的服務。它們通過API或GraphQL連接。如果應用程序還具有Mobile App客戶端,則對Web和Mobile客戶端使用相同的后端微服務將成為問題。移動客戶端的API要求通常與Web客戶端不同,因為它們具有不同的屏幕大小,顯示,性能,能源和網(wǎng)絡帶寬。
后端的后端模式可用于每個UI都有為特定UI定制的單獨后端的場景。它還提供了其他優(yōu)勢,例如充當下游微服務的外觀,從而減少了UI與下游微服務之間的閑聊通信。同樣,在高度安全的情況下,下游微服務部署在DMZ網(wǎng)絡中,BFF用于提供更高的安全性。

> Backends for Frontends by Md Kamaruzzaman
優(yōu)點:
- BFF之間的關注點分離。我們可以針對特定的UI優(yōu)化它們。
 - 提供更高的安全性。
 - 減少UI與下游微服務之間的交流。
 
缺點:
- BFF之間的代碼重復。
 - 如果使用其他許多UI(例如,智能電視,Web,移動設備,臺式機),BFF的數(shù)量也會激增。
 - BFF不應包含任何業(yè)務邏輯,而應僅包含特定于客戶的邏輯和行為,因此需要仔細設計和實施。
 
何時將后端用于前端:
- 如果應用程序具有多個具有不同API要求的UI。
 - 如果出于安全原因在UI和下游微服務之間需要額外的一層。
 - 如果在UI開發(fā)中使用微前端。
 
何時不使用后端作為前端:
- 如果應用程序具有多個UI,但是它們使用相同的API。
 - 如果未在DMZ中部署核心微服務。
 
啟用技術示例:
- 任何后端框架(Node.js,Spring,Django,Laravel,F(xiàn)lask,Play等)都支持它。
 
API網(wǎng)關
在微服務架構中,UI通常與多個微服務連接。如果微服務是細粒度的(FaaS),則客戶端可能需要連接許多微服務,這變得很繁瑣且具有挑戰(zhàn)性。而且,服務(包括其API)可以發(fā)展。大型企業(yè)還希望擁有其他跨領域的問題(SSL終止,身份驗證,授權,限制,日志記錄等)。
解決這些問題的一種可能方法是使用API網(wǎng)關。API網(wǎng)關位于客戶端APP和后端微服務之間,并充當外觀。它可以用作反向代理,將客戶端請求路由到適當?shù)暮蠖宋⒎?。它還可以支持將客戶端請求的扇出擴展到多個微服務,然后將匯總的響應返回給客戶端。它還支持基本的跨領域關注。

> API Gateway by Md Kamaruzzaman
優(yōu)點:
- 提供前端和后端微服務之間的松散耦合。
 - 減少客戶端和微服務之間的往返呼叫次數(shù)。
 - 通過SSL終止,身份驗證和授權實現(xiàn)高安全性。
 - 集中管理的跨領域問題,例如日志記錄和監(jiān)視,節(jié)流,負載平衡。
 
缺點:
- 可能導致微服務架構中的單點故障。
 - 由于額外的網(wǎng)絡呼叫,延遲增加了。
 - 如果不進行擴展,它們很容易成為整個企業(yè)的瓶頸。
 - 額外的維護和開發(fā)成本。
 
何時使用API網(wǎng)關:
- 在復雜的微服務架構中,這幾乎是強制性的。
 - 在大型公司中,必須使用API網(wǎng)關來集中安全性和跨領域問題。
 
何時不使用API網(wǎng)關:
- 在安全性和中央管理不是最高優(yōu)先級的私人項目或小型公司中。
 - 如果微服務的數(shù)量很小。
 
啟用技術示例:
- Amazon API Gateway,Azure API管理,Apigee,Kong,WSO2 API管理器
 
扼殺者
如果要在棕地項目中使用微服務架構,則需要將舊版或現(xiàn)有的Monolithic應用程序遷移到微服務。將現(xiàn)有的大型生產(chǎn)單片式應用程序遷移到微服務中具有很大的挑戰(zhàn)性,因為這可能會破壞應用程序的可用性。
一種解決方案是使用Strangler模式。Strangler模式意味著通過逐步用新的微服務替換特定功能,將Monolithic應用程序逐步遷移到微服務架構。此外,新功能僅在微服務中添加,繞過了傳統(tǒng)的Monolithic應用程序。然后將Facade(API網(wǎng)關)配置為在舊版Monolith和微服務之間路由請求。一旦功能從Monolith遷移到微服務,F(xiàn)acade就會攔截客戶端請求并路由到新的微服務。一旦所有舊版Monolithic功能都已遷移,舊版Monolithic應用程序將被"勒死",即退役。

> Strangler by Md Kamaruzzaman
優(yōu)點:
- 將Monolithic應用程序安全遷移到微服務。
 - 遷移和新功能開發(fā)可以并行進行。
 - 遷移過程可以有自己的進度。
 
缺點:
- 在現(xiàn)有的Monolith和新的微服務之間共享數(shù)據(jù)存儲變得充滿挑戰(zhàn)。
 - 添加外觀(API網(wǎng)關)將增加系統(tǒng)延遲。
 - 端到端測試變得困難。
 
何時使用Strangler:
- 將大型后端單片應用程序增量遷移到微服務。
 
何時不使用Strangler:
- 如果后端整體組件較小,則批量替換是一個更好的選擇。
 - 如果客戶端對舊版Monolithic應用程序的請求無法被攔截。
 
推動技術:
- 帶有API網(wǎng)關的后端應用程序框架。
 
斷路器
在微服務體系結構中,微服務進行同步通信,微服務通常調(diào)用其他服務來滿足業(yè)務需求。由于瞬態(tài)故障(網(wǎng)絡連接速度慢,超時或時間不可用),對另一個服務的調(diào)用可能會失敗。在這種情況下,重試呼叫可以解決此問題。但是,如果存在嚴重問題(微服務完全失敗),則微服務將長時間不可用。在這種情況下,重試是沒有意義的,并且浪費了寶貴的資源(線程被阻塞,浪費了CPU周期)。同樣,一項服務的故障可能會導致整個應用程序級聯(lián)故障。在這種情況下,立即失敗是一種更好的方法。
對于此類用例,可以使用斷路器模式。微服務應通過代理來請求另一個微服務,該代理的工作方式類似于斷路器。代理應該計算最近發(fā)生的故障數(shù),并使用它來決定是允許操作繼續(xù)進行還是直接返回異常。

> Circuit Breaker by Md Kamaruzzaman
- 斷路器可以具有以下三種狀態(tài):
 - 已關閉:斷路器將請求發(fā)送到微服務,并計算給定時間段內(nèi)的故障數(shù)。如果在一定時間內(nèi)的故障數(shù)量超過閾值,則它將跳閘并進入"打開狀態(tài)"。
 - 打開:來自微服務的請求立即失敗,并返回異常。超時后,斷路器進入半開狀態(tài)。
 - 半開放式:僅允許來自微服務的有限數(shù)量的請求通過并調(diào)用該操作。如果這些請求成功,則斷路器將進入閉合狀態(tài)。如果任何請求失敗,則斷路器進入"打開"狀態(tài)。
 
優(yōu)點:
- 提高微服務架構的容錯性和彈性。
 - 停止將故障級聯(lián)到其他微服務。
 
缺點:
- 需要復雜的異常處理。
 - 記錄和監(jiān)視。
 - 應該支持手動重置。
 
何時使用斷路器:
- 在緊密耦合的微服務體系結構中,微服務進行同步通信。
 - 一個微服務是否依賴于多個其他微服務。
 
何時不使用斷路器:
- 松散耦合的,事件驅動的微服務架構。
 - 微服務是否不依賴于其他微服務。
 
推動技術:
- API網(wǎng)關,服務網(wǎng)格,各種斷路器庫(Hystrix,Reselience4J,Polly。
 
外部化配置
每個業(yè)務應用程序都有許多用于各種基礎結構的配置參數(shù)(例如,數(shù)據(jù)庫,網(wǎng)絡,連接的服務地址,憑據(jù),證書路徑)。同樣,在企業(yè)環(huán)境中,應用程序通常部署在各種運行時中(本地,開發(fā),生產(chǎn))。實現(xiàn)此目標的一種方法是通過內(nèi)部配置,這是一種致命的不良做法。由于很容易破壞生產(chǎn)憑據(jù),因此可能導致嚴重的安全風險。另外,配置參數(shù)的任何更改都需要重建應用程序。在微服務架構中,這一點尤為重要,因為我們可能擁有數(shù)百種服務。
更好的方法是外部化所有配置。結果,將構建過程與運行時環(huán)境分開。此外,由于生產(chǎn)配置文件僅在運行時或通過環(huán)境變量使用,因此將安全風險降到最低。
優(yōu)點:
- 生產(chǎn)配置不是代碼庫的一部分,因此可以最大程度地減少安全漏洞。
 - 無需重新構建即可更改配置參數(shù)。
 
缺點:
- 我們需要選擇一個支持外部化配置的框架。
 
何時使用外部化配置:
- 任何重要的生產(chǎn)應用程序都必須使用外部配置。
 
何時不使用外部化配置:
- 在概念發(fā)展的證明。
 
推動技術:幾乎所有企業(yè)級的現(xiàn)代框架都支持外部化配置。
消費者驅動的合同測試
在微服務架構中,通常由獨立的團隊開發(fā)許多微服務。這些微服務一起工作來滿足業(yè)務需求(例如,客戶請求),并且彼此同步或異步地通信。消費者微服務的集成測試具有挑戰(zhàn)性。通常,在這種情況下使用TestDouble可以進行更快,更便宜的測試。但是TestDouble通常并不代表真正的提供程序微服務。另外,如果提供者微服務更改了其API或消息,則TestDouble無法確認這一點。另一個選擇是進行端到端測試。雖然在生產(chǎn)之前必須進行端到端測試,但它脆弱,緩慢,昂貴,并且不能替代集成測試(測試金字塔)。
消費者驅動的合同測試可以在這方面為我們提供幫助。此處,消費者微服務所有者團隊編寫了一個測試套件,其中包含針對特定提供者微服務的請求和預期響應(用于同步通信)或預期消息(用于異步通信)。這些測試套件稱為顯式合同。對于提供商微服務,其使用者的所有合同測試套件都添加到了自動測試中。在執(zhí)行針對特定提供程序微服務的自動測試時,它將運行自己的測試,合同并驗證合同。通過這種方式,合同測試可以幫助以自動化的方式維護微服務通信的完整性。
優(yōu)點:
- 如果提供者意外更改了API或消息,則會在很短的時間內(nèi)自動找到它。
 - 更少的驚喜和更高的健壯性,尤其是包含大量微服務的企業(yè)應用程序。
 - 改善團隊自主權。
 
缺點:
- 由于合同測試可能使用完全不同的測試工具,因此需要進行額外的工作才能在合同商微服務中開發(fā)和集成合同測試。
 - 如果合同測試與實際服務消耗不匹配,則可能導致生產(chǎn)失敗。
 
何時使用消費者驅動的合同測試:
- 在大型企業(yè)業(yè)務應用程序中,通常,不同的團隊開發(fā)不同的服務。
 
何時不使用消費者主導的合同測試:
- 一個團隊開發(fā)所有微服務的相對簡單,較小的應用程序。
 - 提供者微服務是否相對穩(wěn)定且未處于積極開發(fā)中。
 
推動技術:
- 契約,郵遞員,Spring Cloud合同
 
結論
在現(xiàn)代的大型企業(yè)軟件開發(fā)中,微服務體系結構可以幫助擴展規(guī)模并帶來許多長期利益。但是微服務架構并不是可以在每個用例中使用的"銀彈"。如果在錯誤的應用程序類型中使用它,則微服務架構會帶來更多的麻煩。想要采用微服務體系結構的開發(fā)團隊應遵循一組最佳實踐,并使用一組可重復使用的,經(jīng)過嚴格實踐的設計模式。
微服務架構中最重要的設計模式是每個微服務的數(shù)據(jù)庫。實施此設計模式具有挑戰(zhàn)性,并且需要其他幾個緊密相關的設計模式(事件源,CQRS和Saga)。在具有多個客戶端(Web,移動,臺式機,智能設備)的典型業(yè)務應用程序中,客戶端與微服務之間的通信可能會比較混亂,可能需要具有附加安全性的中央控制。在這種情況下,前端的設計模式和API網(wǎng)關非常有用。同樣,斷路器模式可以極大地幫助處理此類應用程序中的錯誤情況。將舊的Monolithic應用程序遷移到微服務中具有很大的挑戰(zhàn)性,而Strangler模式可以幫助遷移。消費者驅動的合同測試是微服務集成測試的工具模式。同時,外部化配置是任何現(xiàn)代應用程序開發(fā)中的強制性模式。
該列表并不全面,并且取決于您的用例,您可能需要其他設計模式。但是此列表將為您提供有關微服務體系結構設計模式的出色介紹。















 
 
 












 
 
 
 