微服務(wù)架構(gòu)及其最重要的 10 個設(shè)計模式!
逆鋒起筆關(guān)注后回復(fù)編程pdf微服務(wù)架構(gòu)的設(shè)計模式
獨享數(shù)據(jù)庫(Database per Microservice)

數(shù)據(jù)由服務(wù)完全所有。
服務(wù)的開發(fā)團(tuán)隊之間耦合度降低。
服務(wù)間的數(shù)據(jù)共享變得更有挑戰(zhàn)性。
在應(yīng)用范圍的保證 ACID 事務(wù)變得困難許多。
細(xì)心設(shè)計如何拆分單體數(shù)據(jù)庫是一項極具挑戰(zhàn)的任務(wù)。
在大型企業(yè)應(yīng)用程序中。
當(dāng)團(tuán)隊需要完全把控微服務(wù)以實現(xiàn)開發(fā)規(guī)模擴(kuò)展和速度提升。
在小規(guī)模應(yīng)用中。
如果是單個團(tuán)隊開發(fā)所有微服務(wù)。
微服務(wù)模式:獨享數(shù)據(jù)庫
https://microservices.io/patterns/data/database-per-service.html
分布式數(shù)據(jù)存儲
https://docs.microsoft.com/en-us/dotnet/architecture/cloud-native/distributed-data
事件源(Event Sourcing)

為高可伸縮系統(tǒng)提供原子性操作。
自動記錄實體變更歷史,包括時序回溯功能。
松耦合和事件驅(qū)動的微服務(wù)。
從事件存儲中讀取實體成為新的挑戰(zhàn),通常需要額外的數(shù)據(jù)存儲(CQRS 模式)。
系統(tǒng)整體復(fù)雜性增加了,通常需要領(lǐng)域驅(qū)動設(shè)計。
系統(tǒng)需要處理事件重復(fù)(冪等)或丟失。
變更事件結(jié)構(gòu)成為新的挑戰(zhàn)。
使用關(guān)系數(shù)據(jù)庫的、高可伸縮的事務(wù)型系統(tǒng)。
使用 NoSQL 數(shù)據(jù)庫的事務(wù)型系統(tǒng)。
彈性高可伸縮微服務(wù)架構(gòu)。
典型的消息驅(qū)動或事件驅(qū)動系統(tǒng)(電子商務(wù)、預(yù)訂和預(yù)約系統(tǒng))。
使用 SQL 數(shù)據(jù)庫的低可伸縮性事務(wù)型系統(tǒng)
在服務(wù)可以同步交換數(shù)據(jù)(例如,通過 API)的簡單微服務(wù)架構(gòu)中。
事件驅(qū)動
https://martinfowler.com/eaaDev/EventSourcing.html
事件驅(qū)動模式-云設(shè)計模式
https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing
微服務(wù)模式:事件驅(qū)動
https://microservices.io/patterns/data/event-sourcing.html
命令和查詢職責(zé)分離(CQRS)


在事件驅(qū)動的微服務(wù)中數(shù)據(jù)讀取速度更快。
數(shù)據(jù)的高可用性。
讀寫系統(tǒng)可獨立擴(kuò)展。
讀數(shù)據(jù)存儲是弱一致性的(最終一致性)。
整個系統(tǒng)的復(fù)雜性增加了,混亂的 CQRS 會顯著危害整個項目。
在高可擴(kuò)展的微服務(wù)架構(gòu)中使用事件源。
在復(fù)雜領(lǐng)域模型中,讀操作需要同時查詢多個數(shù)據(jù)存儲。
在讀寫操作負(fù)載差異明顯的系統(tǒng)中。
在沒有必要存儲大量事件的微服務(wù)架構(gòu)中,用事件存儲快照來計算實體狀態(tài)是一個更好的選擇。
在讀寫操作負(fù)載相近的系統(tǒng)中。
寫存儲:EventStoreDB, Apache Kafka, Confluent Cloud, AWS Kinesis, Azure Event Hub, GCP Pub/Sub, Azure Cosmos DB, MongoDB, Cassandra. Amazon DynamoDB
讀存儲: Elastic Search, Solr, Cloud Spanner, Amazon Aurora, Azure Cosmos DB, Neo4j
框架: Lagom, Akka, Spring, akkatecture, Axon, Eventuate
bliki:CQRS
https://martinfowler.com/bliki/CQRS.html
CQRS模式 - Azure 架構(gòu)中心
https://docs.microsoft.com/en-us/azure/architecture/patterns/cqrs
微服務(wù)模式:命令和查詢職責(zé)分離(CQRS)
https://microservices.io/patterns/data/cqrs.html
Saga

事件編排 Choreography:分散協(xié)調(diào),每個微服務(wù)生產(chǎn)并監(jiān)聽其他微服務(wù)的事件或消息然后決定是否執(zhí)行某個動作。
命令編排 Orchestration:集中協(xié)調(diào),由一個協(xié)調(diào)器告訴參與的微服務(wù)哪個本地事務(wù)需要執(zhí)行。
為高可伸縮或松耦合的、事件驅(qū)動的微服務(wù)架構(gòu)提供一致性事務(wù)。
為使用了不支持 2PC 的非關(guān)系數(shù)據(jù)庫的微服務(wù)架構(gòu)提供一致性事務(wù)。
需要處理瞬時故障,并且提供等冪性。
難以調(diào)試,而且復(fù)雜性隨著微服務(wù)數(shù)量增加而增加。
在使用了事件源的高可伸縮、松耦合的微服務(wù)中。
在使用了分布式非關(guān)系數(shù)據(jù)庫的系統(tǒng)中。
使用關(guān)系數(shù)據(jù)庫的低可伸縮性事務(wù)型系統(tǒng)。
在服務(wù)間存在循環(huán)依賴的系統(tǒng)中。
Saga分布式事務(wù)-Azure設(shè)計模式
https://docs.microsoft.com/en-us/azure/architecture/reference-architectures/saga/saga
微服務(wù)模式:Sagas
https://microservices.io/patterns/data/saga.html
Saga 模式:微服務(wù)中的應(yīng)用程序事務(wù)
https://blog.couchbase.com/saga-pattern-implement-business-transactions-using-microservices-part/
面向前端的后端 (BFF)

分離 BFF 之間的關(guān)注點,使得我們可以為具體的 UI 優(yōu)化他們。
提供更高的安全性。
減少 UI 和下游微服務(wù)之間頻繁的通信。
BFF 之間代碼重復(fù)。
大量的 BFF 用于其他用戶界面(例如,智能電視,Web,移動端,PC 桌面版)。
需要仔細(xì)的設(shè)計和實現(xiàn),BFF 不應(yīng)該包含任何業(yè)務(wù)邏輯,而應(yīng)只包含特定客戶端邏輯和行為。
如果應(yīng)用程序有多個含不同 API 需求的 UI。
出于安全需要,UI 和下游微服務(wù)之間需要額外的層。
如果在 UI 開發(fā)中使用微前端。
如果應(yīng)用程序雖有多個 UI,但使用的 API 相同。
如果核心微服務(wù)不是部署在 DMZ 網(wǎng)絡(luò)中。
Sam Newman - 面向前端的后端
https://samnewman.io/patterns/architectural/bff/
面向前端的后端模式 - 云設(shè)計模式
https://docs.microsoft.com/en-us/azure/architecture/patterns/backends-for-frontends
微服務(wù)模式:API 網(wǎng)關(guān)模式
https://microservices.io/patterns/apigateway.html
API 網(wǎng)關(guān)

在前端和后端服務(wù)之間提供松耦合。
減少客戶端和微服務(wù)之間的調(diào)用次數(shù)。
通過 SSL 終端、身份驗證和授權(quán)實現(xiàn)高安全性。
集中管理的橫切關(guān)注點,例如,日志記錄和監(jiān)視、節(jié)流、負(fù)載平衡。
可能導(dǎo)致微服務(wù)架構(gòu)中的單點故障。
額外的網(wǎng)絡(luò)調(diào)用帶來的延遲增加。
如果不進(jìn)行擴(kuò)展,它們很容易成為整個企業(yè)應(yīng)用的瓶頸。
額外的維護(hù)和開發(fā)費用。
在復(fù)雜的微服務(wù)架構(gòu)中,它幾乎是必須的。
在大型企業(yè)中,API 網(wǎng)關(guān)是中心化安全性和橫切關(guān)注點的必要工具。
在安全和集中管理不是最優(yōu)先要素的私人項目或小公司中。
如果微服務(wù)的數(shù)量相當(dāng)少。
微服務(wù)模式:API 網(wǎng)關(guān)模式
https://microservices.io/patterns/apigateway.html
API 網(wǎng)關(guān)-Azure 架構(gòu)中心
https://docs.microsoft.com/en-us/azure/architecture/microservices/design/gateway
Strangler

安全的遷移單體應(yīng)用程序到微服務(wù)。
可以并行地遷移已有功能和開發(fā)新功能。
遷移過程可以更好把控節(jié)奏。
在現(xiàn)有的單體應(yīng)用服務(wù)和新的微服務(wù)之間共享數(shù)據(jù)存儲變得具有挑戰(zhàn)性。
添加 Facade (API 網(wǎng)關(guān))將增加系統(tǒng)延遲。
端到端測試變得困難。
將大型后端單體應(yīng)用程序的增量遷移到微服務(wù)。
如果后端單體應(yīng)用很小,那么全量替換會更好。
如果無法攔截客戶端對遺留的單體應(yīng)用程序的請求。
bliki:StranglerFig 應(yīng)用程序
https://martinfowler.com/bliki/StranglerFigApplication.html
Strangler 模式 - 云設(shè)計模式
https://docs.microsoft.com/en-us/azure/architecture/patterns/strangler-fig
微服務(wù)模式:Strangler 應(yīng)用程序
https://microservices.io/patterns/refactoring/strangler-application.html
斷路器

關(guān)閉:斷路器將請求路由到微服務(wù),并統(tǒng)計給定時段內(nèi)的故障數(shù)量,如果超過閾值,它就會觸發(fā)并進(jìn)入打開狀態(tài)。
打開:來自微服務(wù)的請求會快速失敗并返回異常。在超時后,斷路器進(jìn)入半開啟狀態(tài)。
半開:只有有限數(shù)量的微服務(wù)請求被允許通過并進(jìn)行調(diào)用。如果這些請求成功,斷路器將進(jìn)入閉合狀態(tài)。如果任何請求失敗,斷路器則會進(jìn)入開啟狀態(tài)。
提高微服務(wù)架構(gòu)的容錯性和彈性。
阻止引發(fā)其他微服務(wù)的級聯(lián)故障。
需要復(fù)雜的異常處理。
日志和監(jiān)控。
應(yīng)該支持人工復(fù)位。
在微服務(wù)間使用同步通信的緊耦合的微服務(wù)架構(gòu)中。
如果微服務(wù)依賴多個其他微服務(wù)。
松耦合、事件驅(qū)動的微服務(wù)架構(gòu)。
如果微服務(wù)不依賴于其他微服務(wù)。
bliki:斷路器
https://martinfowler.com/bliki/CircuitBreaker.html
斷路器模式 - 云設(shè)計模式
https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker
微型服務(wù)模式:斷路器
https://microservices.io/patterns/reliability/circuit-breaker.html
外部化配置
生產(chǎn)配置不屬于代碼庫,因而最小化了安全漏洞。
修改配置參數(shù)不需要重新構(gòu)建應(yīng)用程序。
我們需要選擇一個支持外部化配置的框架。
任何重要的生產(chǎn)應(yīng)用程序都必須使用外部化配置。
在驗證概念的開發(fā)中。
微服務(wù)模式:外部化配置
https://microservices.io/patterns/externalized-configuration.html
一次構(gòu)建,到處運(yùn)行:外部化你的配置
https://reflectoring.io/externalize-configuration/
消費端驅(qū)動的契約測試
如果提供程序意外更改 API 或消息,可以被快速的自動發(fā)現(xiàn)。
更少意外、更健壯,特別是包含大量微服務(wù)的企業(yè)應(yīng)用程序。
改善團(tuán)隊自主性。
需要額外的工作來開發(fā)和集成微服務(wù)服務(wù)端的契約測試,因為他們可能使用完全不同的測試工具。
如果契約測試與真實服務(wù)情況不匹配,將可能導(dǎo)致生產(chǎn)故障。
在大型企業(yè)業(yè)務(wù)應(yīng)用程序中,通常由不同的團(tuán)隊開發(fā)不同服務(wù)。
所有微服務(wù)由同一團(tuán)隊負(fù)責(zé)開發(fā)的小型簡單的應(yīng)用程序。
如果服務(wù)端微服務(wù)是相對穩(wěn)定的,并且不處在活躍的開發(fā)狀態(tài)。
需求驅(qū)動契約:一種服務(wù)演進(jìn)模式
https://martinfowler.com/articles/consumerDrivenContracts.html
微服務(wù)模式:服務(wù)集成契約測試
https://microservices.io/patterns/testing/service-integration-contract-test.html
什么是消費端驅(qū)動的契約測試?
https://pactflow.io/what-is-consumer-driven-contract-testing/
總結(jié)
逆鋒起筆是一個專注于程序員圈子的技術(shù)平臺,你可以收獲最新技術(shù)動態(tài)、最新內(nèi)測資格、BAT等大廠大佬的經(jīng)驗、增長自身、學(xué)習(xí)資料、職業(yè)路線、賺錢思維,微信搜索逆鋒起筆關(guān)注!
這是我看過關(guān)于微服務(wù)架構(gòu)最好的文章
小團(tuán)隊真的適合引入Spring Cloud微服務(wù)嗎?
項目實戰(zhàn) Spring Boot視頻教程 微服務(wù)整合Mybatis

