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

插: 前些天發(fā)現(xiàn)了一個(gè)巨牛的人工智能學(xué)習(xí)網(wǎng)站,通俗易懂,風(fēng)趣幽默,忍不住分享一下給大家镊绪。點(diǎn)擊跳轉(zhuǎn)到網(wǎng)站。
堅(jiān)持不懈洒忧,越努力越幸運(yùn)蝴韭,大家一起學(xué)習(xí)鴨~~~

獨(dú)享數(shù)據(jù)庫(Database per Microservice)

當(dāng)一家公司將大型單體系統(tǒng)替換成一組微服務(wù),首先要面臨的最重要決策是關(guān)于數(shù)據(jù)庫跑慕。單體架構(gòu)會(huì)使用大型中央數(shù)據(jù)庫万皿。即使轉(zhuǎn)移到微服務(wù)架構(gòu)許多架構(gòu)師仍傾向于保持?jǐn)?shù)據(jù)庫不變摧找。雖然有一些短期收益,但它卻是反模式的牢硅,特別是在大規(guī)模系統(tǒng)中蹬耘,微服務(wù)將在數(shù)據(jù)庫層嚴(yán)重耦合,整個(gè)遷移到微服務(wù)的目標(biāo)都將面臨失敿跤唷(例如综苔,團(tuán)隊(duì)授權(quán)、獨(dú)立開發(fā)等問題)位岔。

更好的方法是為每個(gè)微服務(wù)提供自己的數(shù)據(jù)存儲(chǔ)如筛,這樣服務(wù)之間在數(shù)據(jù)庫層就不存在強(qiáng)耦合。這里我使用數(shù)據(jù)庫這一術(shù)語來表示邏輯上的數(shù)據(jù)隔離抒抬,也就是說微服務(wù)可以共享物理數(shù)據(jù)庫杨刨,但應(yīng)該使用分開的數(shù)據(jù)結(jié)構(gòu)、集合或者表擦剑,這還將有助于確保微服務(wù)是按照領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的方法正確拆分的妖胀。

圖片

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

  • 數(shù)據(jù)由服務(wù)完全所有。

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

缺點(diǎn)

  • 服務(wù)間的數(shù)據(jù)共享變得更有挑戰(zhàn)性赚抡。

  • 在應(yīng)用范圍的保證 ACID 事務(wù)變得困難許多。

  • 細(xì)心設(shè)計(jì)如何拆分單體數(shù)據(jù)庫是一項(xiàng)極具挑戰(zhàn)的任務(wù)纠屋。

何時(shí)使用獨(dú)享數(shù)據(jù)庫

  • 在大型企業(yè)應(yīng)用程序中涂臣。

  • 當(dāng)團(tuán)隊(duì)需要完全把控微服務(wù)以實(shí)現(xiàn)開發(fā)規(guī)模擴(kuò)展和速度提升。

何時(shí)不宜使用獨(dú)享數(shù)據(jù)庫

  • 在小規(guī)模應(yīng)用中售担。

  • 如果是單個(gè)團(tuán)隊(duì)開發(fā)所有微服務(wù)赁遗。

可用技術(shù)示例

所有 SQL、 NoSQL 數(shù)據(jù)庫都提供數(shù)據(jù)的邏輯分離(例如族铆,單獨(dú)的表吼和、集合、結(jié)構(gòu)骑素、數(shù)據(jù)庫)。

延伸閱讀

微服務(wù)模式:獨(dú)享數(shù)據(jù)庫
https://microservices.io/patterns/data/database-per-service.html

分布式數(shù)據(jù)存儲(chǔ)
https://docs.microsoft.com/en-us/dotnet/architecture/cloud-native/distributed-data

事件源(Event Sourcing)

在微服務(wù)架構(gòu)中刚夺,特別使用獨(dú)享數(shù)據(jù)庫時(shí)献丑,微服務(wù)之間需要進(jìn)行數(shù)據(jù)交換。對(duì)于彈性高可伸縮的和可容錯(cuò)的系統(tǒng)侠姑,它們應(yīng)該通過交換事件進(jìn)行異步通信创橄。在這種情況,您可能希望進(jìn)行類似更新數(shù)據(jù)庫并發(fā)送消息這樣的原子操作莽红,如果在大數(shù)據(jù)量的分布式場(chǎng)景使用關(guān)系數(shù)據(jù)庫妥畏,您將無法使用兩階段鎖協(xié)議(2PL)邦邦,因?yàn)樗鼰o法伸縮。而 NoSQL 數(shù)據(jù)庫因?yàn)榇蠖嗖恢С謨呻A段鎖協(xié)議甚至無法實(shí)現(xiàn)分布式事務(wù)醉蚁。

在這些場(chǎng)景燃辖,可以基于事件的架構(gòu)使用事件源模式。在傳統(tǒng)數(shù)據(jù)庫中网棍,直接存儲(chǔ)的是業(yè)務(wù)實(shí)體的當(dāng)前“狀態(tài)”黔龟,而在事件源中任何“狀態(tài)”更新事件或其他重要事件都會(huì)被存儲(chǔ)起來,而不是直接存儲(chǔ)實(shí)體本身滥玷。這意味著業(yè)務(wù)實(shí)體的所有更改將被保存為一系列不可變的事件氏身。因?yàn)閿?shù)據(jù)是作為一系列事件存儲(chǔ)的,而非直接更新存儲(chǔ)惑畴,所以各項(xiàng)服務(wù)可以通過重放事件存儲(chǔ)中的事件來計(jì)算出所需的數(shù)據(jù)狀態(tài)蛋欣。

圖片

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

  • 為高可伸縮系統(tǒng)提供原子性操作。

  • 自動(dòng)記錄實(shí)體變更歷史如贷,包括時(shí)序回溯功能陷虎。

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

缺點(diǎn)

  • 從事件存儲(chǔ)中讀取實(shí)體成為新的挑戰(zhàn)倒得,通常需要額外的數(shù)據(jù)存儲(chǔ)(CQRS 模式)泻红。

  • 系統(tǒng)整體復(fù)雜性增加了,通常需要領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)霞掺。

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

  • 變更事件結(jié)構(gòu)成為新的挑戰(zhàn)。

何時(shí)使用事件源

  • 使用關(guān)系數(shù)據(jù)庫的菩彬、高可伸縮的事務(wù)型系統(tǒng)缠劝。

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

  • 彈性高可伸縮微服務(wù)架構(gòu)骗灶。

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

何時(shí)不宜使用事件源

  • 使用 SQL 數(shù)據(jù)庫的低可伸縮性事務(wù)型系統(tǒng)

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

可用技術(shù)示例

事件存儲(chǔ):EventStoreDB, Apache Kafka免都, Confluent Cloud锉罐, AWS Kinesis, Azure Event Hub绕娘, GCP Pub/Sub脓规, Azure Cosmos DB, MongoDB险领, Cassandra. Amazon DynamoDB

框架: Lagom侨舆, Akka秒紧, Spring, akkatecture挨下, Axon熔恢,Eventuate

延伸閱讀

事件驅(qū)動(dòng)
https://martinfowler.com/eaaDev/EventSourcing.html

事件驅(qū)動(dòng)模式-云設(shè)計(jì)模式
https://docs.microsoft.com/en-us/azure/architecture/patterns/event-sourcing

微服務(wù)模式:事件驅(qū)動(dòng)
https://microservices.io/patterns/data/event-sourcing.html

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

如果我們使用事件源,那么從事件存儲(chǔ)中讀取數(shù)據(jù)就變得困難了复颈。要從數(shù)據(jù)存儲(chǔ)中獲取實(shí)體绩聘,我們需要處理所有的實(shí)體事件。有時(shí)我們對(duì)讀寫操作還會(huì)有不同的一致性和吞吐量要求耗啦。

這種情況凿菩,我們可以使用 CQRS 模式。在該模式中帜讲,系統(tǒng)的數(shù)據(jù)修改部分(命令)與數(shù)據(jù)讀取部分(查詢)是分離的衅谷。而 CQRS 模式有兩種容易令人混淆的模式,分別是簡(jiǎn)單的和高級(jí)的似将。

在其簡(jiǎn)單形式中获黔,不同實(shí)體或 ORM 模型被用于讀寫操作,如下所示:

圖片

它有助于強(qiáng)化單一職責(zé)原則和分離關(guān)注點(diǎn)在验,從而實(shí)現(xiàn)更簡(jiǎn)潔的設(shè)計(jì)玷氏。

在其高級(jí)形式中,會(huì)有不同的數(shù)據(jù)存儲(chǔ)用于讀寫操作腋舌。高級(jí)的 CQRS 通常結(jié)合事件源模式盏触。根據(jù)不同情況,會(huì)使用不同類型的寫數(shù)據(jù)存儲(chǔ)和讀數(shù)據(jù)存儲(chǔ)块饺。寫數(shù)據(jù)存儲(chǔ)是“記錄的系統(tǒng)”赞辩,也就是整個(gè)系統(tǒng)的核心源頭。

圖片

對(duì)于讀頻繁的應(yīng)用程序或微服務(wù)架構(gòu)授艰,OLTP 數(shù)據(jù)庫(任何提供 ACID 事務(wù)保證的關(guān)系或非關(guān)系數(shù)據(jù)庫)或分布式消息系統(tǒng)都可以被用作寫存儲(chǔ)辨嗽。對(duì)于寫頻繁的應(yīng)用程序(寫操作高可伸縮性和大吞吐量),需要使用寫可水平伸縮的數(shù)據(jù)庫(如全球托管的公共云數(shù)據(jù)庫)淮腾。標(biāo)準(zhǔn)化的數(shù)據(jù)則保存在寫數(shù)據(jù)存儲(chǔ)中糟需。

對(duì)搜索(例如 Apache Solr、Elasticsearch)或讀操作(KV 數(shù)據(jù)庫谷朝、文檔數(shù)據(jù)庫)進(jìn)行優(yōu)化的非關(guān)系數(shù)據(jù)庫常被用作讀存儲(chǔ)篮灼。許多情況會(huì)在需要 SQL 查詢的地方使用讀可伸縮的關(guān)系數(shù)據(jù)庫。非標(biāo)準(zhǔn)化和特殊優(yōu)化過的數(shù)據(jù)則保存在讀存儲(chǔ)中徘禁。

數(shù)據(jù)是從寫存儲(chǔ)異步復(fù)制到讀存儲(chǔ)中的,所以讀存儲(chǔ)和寫存儲(chǔ)之間會(huì)有延遲髓堪,但最終是一致的送朱。

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

  • 在事件驅(qū)動(dòng)的微服務(wù)中數(shù)據(jù)讀取速度更快娘荡。

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

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

缺點(diǎn)

  • 讀數(shù)據(jù)存儲(chǔ)是弱一致性的(最終一致性)炮沐。

  • 整個(gè)系統(tǒng)的復(fù)雜性增加了,混亂的 CQRS 會(huì)顯著危害整個(gè)項(xiàng)目回怜。

何時(shí)使用 CQRS

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

  • 在復(fù)雜領(lǐng)域模型中,讀操作需要同時(shí)查詢多個(gè)數(shù)據(jù)存儲(chǔ)藐唠。

  • 在讀寫操作負(fù)載差異明顯的系統(tǒng)中右钾。

何時(shí)不宜使用 CQRS

  • 在沒有必要存儲(chǔ)大量事件的微服務(wù)架構(gòu)中,用事件存儲(chǔ)快照來計(jì)算實(shí)體狀態(tài)是一個(gè)更好的選擇复旬。

  • 在讀寫操作負(fù)載相近的系統(tǒng)中垦缅。

可用技術(shù)示例

寫存儲(chǔ):EventStoreDB, Apache Kafka驹碍, Confluent Cloud壁涎, AWS Kinesis, Azure Event Hub志秃, GCP Pub/Sub怔球, Azure Cosmos DB, MongoDB浮还, Cassandra. Amazon DynamoDB

讀存儲(chǔ): 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

如果微服務(wù)使用獨(dú)享數(shù)據(jù)庫,那么通過分布式事務(wù)管理一致性是一個(gè)巨大的挑戰(zhàn)普泡。你無法使用傳統(tǒng)的兩階段提交協(xié)議播掷,因?yàn)樗床豢缮炜s(關(guān)系數(shù)據(jù)庫),要么不被支持(多數(shù)非關(guān)系數(shù)據(jù)庫)撼班。

但您還是可以在微服務(wù)架構(gòu)中使用 Saga 模式實(shí)現(xiàn)分布式事務(wù)歧匈。Saga 是 1987 年開發(fā)的一種古老模式,是關(guān)系數(shù)據(jù)庫中關(guān)于大事務(wù)的一個(gè)替代概念砰嘁。但這種模式的一種現(xiàn)代變種對(duì)分布式事務(wù)也非常有效件炉。Saga 模式是一個(gè)本地事務(wù)序列勘究,其每個(gè)事務(wù)在一個(gè)單獨(dú)的微服務(wù)內(nèi)更新數(shù)據(jù)存儲(chǔ)并發(fā)布一個(gè)事件或消息。Saga 中的首個(gè)事務(wù)是由外部請(qǐng)求(事件或動(dòng)作)初始化的斟冕,一旦本地事務(wù)完成(數(shù)據(jù)已保存在數(shù)據(jù)存儲(chǔ)且消息或事件已發(fā)布)口糕,那么發(fā)布的消息或事件則會(huì)觸發(fā) Saga 中的下一個(gè)本地事務(wù)。

圖片

如果本地事務(wù)失敗磕蛇,Saga 將執(zhí)行一系列補(bǔ)償事務(wù)來回滾前面本地事務(wù)的更改景描。

Saga 事務(wù)協(xié)調(diào)管理主要有兩種形式:

  • 事件編排 Choreography:分散協(xié)調(diào),每個(gè)微服務(wù)生產(chǎn)并監(jiān)聽其他微服務(wù)的事件或消息然后決定是否執(zhí)行某個(gè)動(dòng)作秀撇。

  • 命令編排 Orchestration:集中協(xié)調(diào)超棺,由一個(gè)協(xié)調(diào)器告訴參與的微服務(wù)哪個(gè)本地事務(wù)需要執(zhí)行。

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

  • 為高可伸縮或松耦合的捌袜、事件驅(qū)動(dòng)的微服務(wù)架構(gòu)提供一致性事務(wù)说搅。

  • 為使用了不支持 2PC 的非關(guān)系數(shù)據(jù)庫的微服務(wù)架構(gòu)提供一致性事務(wù)。

缺點(diǎn)

  • 需要處理瞬時(shí)故障虏等,并且提供等冪性弄唧。

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

何時(shí)使用 Saga

  • 在使用了事件源的高可伸縮候引、松耦合的微服務(wù)中。

  • 在使用了分布式非關(guān)系數(shù)據(jù)庫的系統(tǒng)中敦跌。

何時(shí)不宜使用 Saga

  • 使用關(guān)系數(shù)據(jù)庫的低可伸縮性事務(wù)型系統(tǒng)澄干。

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

可用技術(shù)示例

Axon柠傍, Eventuate麸俘, Narayana

延伸閱讀

Saga分布式事務(wù)-Azure設(shè)計(jì)模式
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)

在現(xiàn)代商業(yè)應(yīng)用開發(fā),特別是微服務(wù)架構(gòu)中惧笛,前后端應(yīng)用是分離和獨(dú)立的服務(wù)从媚,它們通過 API 或 GraphQL 連接。如果應(yīng)用程序還有移動(dòng) App 客戶端患整,那么 Web 端和移動(dòng)客戶端使用相同的后端微服務(wù)就會(huì)出現(xiàn)問題拜效。因?yàn)橐苿?dòng)客戶端和 Web 客戶端有不同的屏幕尺寸、顯示屏各谚、性能紧憾、能耗和網(wǎng)絡(luò)帶寬,它們的 API 需求不同昌渤。

面向前端的后端模式適用于需要為特殊 UI 定制單獨(dú)后端的場(chǎng)景赴穗。它還提供了其他優(yōu)勢(shì),比如作為下游微服務(wù)的封裝,從而減少 UI 和下游微服務(wù)之間的頻繁通信般眉。此外加矛,在高安全要求的場(chǎng)景中,BFF 為部署在 DMZ 網(wǎng)絡(luò)中的下游微服務(wù)提供了更高的安全性煤篙。

[圖片上傳失敗...(image-4815c4-1625241631007)]

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

  • 分離 BFF 之間的關(guān)注點(diǎn),使得我們可以為具體的 UI 優(yōu)化他們毁腿。

  • 提供更高的安全性辑奈。

  • 減少 UI 和下游微服務(wù)之間頻繁的通信。

缺點(diǎn)

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

  • 大量的 BFF 用于其他用戶界面(例如鸠窗,智能電視,Web胯究,移動(dòng)端稍计,PC 桌面版)。

  • 需要仔細(xì)的設(shè)計(jì)和實(shí)現(xiàn)裕循,BFF 不應(yīng)該包含任何業(yè)務(wù)邏輯臣嚣,而應(yīng)只包含特定客戶端邏輯和行為。

何時(shí)使用 BFF

  • 如果應(yīng)用程序有多個(gè)含不同 API 需求的 UI剥哑。

  • 出于安全需要硅则,UI 和下游微服務(wù)之間需要額外的層。

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

何時(shí)不宜使用 BFF

  • 如果應(yīng)用程序雖有多個(gè) UI怎虫,但使用的 API 相同。

  • 如果核心微服務(wù)不是部署在 DMZ 網(wǎng)絡(luò)中困介。

可用技術(shù)示例

任何后端框架(Node.js大审,Spring,Django座哩,Laravel徒扶,F(xiàn)lask,Play八回,…)都能支持酷愧。

延伸閱讀

Sam Newman - 面向前端的后端
https://samnewman.io/patterns/architectural/bff/

面向前端的后端模式 - 云設(shè)計(jì)模式
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ù)架構(gòu)中,UI 通常連接多個(gè)微服務(wù)缠诅。如果微服務(wù)是細(xì)粒度的(FaaS) 溶浴,那么客戶端可能需要連接非常多的微服務(wù),這將變得繁雜和具有挑戰(zhàn)性管引。此外士败,這些服務(wù)包括它們的 API 還將不斷進(jìn)化。大型企業(yè)還希望能有其他橫切關(guān)注點(diǎn)(SSL 終止、身份驗(yàn)證谅将、授權(quán)漾狼、節(jié)流、日志記錄等)饥臂。

一個(gè)解決這些問題的可行方法是使用 API 網(wǎng)關(guān)逊躁。API 網(wǎng)關(guān)位于客戶端 APP 和后端微服務(wù)之間充當(dāng) facade,它可以是反向代理隅熙,將客戶端請(qǐng)求路由到適當(dāng)?shù)暮蠖宋⒎?wù)稽煤。它還支持將客戶端請(qǐng)求扇出到多個(gè)微服務(wù),然后將響應(yīng)聚合后返回給客戶端囚戚。它還支持必要的橫切關(guān)注點(diǎn)酵熙。

圖片

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

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

  • 減少客戶端和微服務(wù)之間的調(diào)用次數(shù)驰坊。

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

  • 集中管理的橫切關(guān)注點(diǎn)拳芙,例如察藐,日志記錄和監(jiān)視、節(jié)流态鳖、負(fù)載平衡转培。

缺點(diǎn)

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

  • 額外的網(wǎng)絡(luò)調(diào)用帶來的延遲增加浆竭。

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

  • 額外的維護(hù)和開發(fā)費(fèi)用邦泄。

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

  • 在復(fù)雜的微服務(wù)架構(gòu)中删窒,它幾乎是必須的。

  • 在大型企業(yè)中顺囊,API 網(wǎng)關(guān)是中心化安全性和橫切關(guān)注點(diǎn)的必要工具肌索。

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

  • 在安全和集中管理不是最優(yōu)先要素的私人項(xiàng)目或小公司中。

  • 如果微服務(wù)的數(shù)量相當(dāng)少特碳。

可用技術(shù)示例

Amazon API 網(wǎng)關(guān)诚亚, Azure API 管理, Apigee午乓, Kong站宗, WSO2 API 管理器

延伸閱讀

微服務(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ùn)行中的項(xiàng)目中使用微服務(wù)架構(gòu),我們需要將遺留的或現(xiàn)有的單體應(yīng)用遷移到微服務(wù)益愈。將現(xiàn)有的大型在線單體應(yīng)用程序遷移到微服務(wù)是相當(dāng)有挑戰(zhàn)性的梢灭,因?yàn)檫@可能破壞應(yīng)用程序的可用性夷家。

一個(gè)解決方案是使用 Strangler 模式。Strangler 模式意味著通過使用新的微服務(wù)逐步替換特定功能敏释,將單體應(yīng)用程序增量地遷移到微服務(wù)架構(gòu)库快。此外,新功能只在微服務(wù)中添加钥顽,而不再添加到遺留的單體應(yīng)用中义屏。然后配置一個(gè) Facade (API 網(wǎng)關(guān))來路由遺留單體應(yīng)用和微服務(wù)間的請(qǐng)求。當(dāng)某個(gè)功能從單體應(yīng)用遷移到微服務(wù)蜂大,F(xiàn)acade 就會(huì)攔截客戶端請(qǐng)求并路由到新的微服務(wù)湿蛔。一旦遷移了所有的功能,遺留單體應(yīng)用程序就會(huì)被“扼殺(Strangler)”县爬,即退役。

圖片

*Md Kamaruzzaman *的 Strangler

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

  • 安全的遷移單體應(yīng)用程序到微服務(wù)添谊。

  • 可以并行地遷移已有功能和開發(fā)新功能财喳。

  • 遷移過程可以更好把控節(jié)奏。

缺點(diǎn)

  • 在現(xiàn)有的單體應(yīng)用服務(wù)和新的微服務(wù)之間共享數(shù)據(jù)存儲(chǔ)變得具有挑戰(zhàn)性斩狱。

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

  • 端到端測(cè)試變得困難。

何時(shí)使用 Strangler

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

何時(shí)不宜使用 Strangler

  • 如果后端單體應(yīng)用很小泌枪,那么全量替換會(huì)更好。

  • 如果無法攔截客戶端對(duì)遺留的單體應(yīng)用程序的請(qǐng)求秕岛。

可用技術(shù)示例

API 網(wǎng)關(guān)后端應(yīng)用框架碌燕。

延伸閱讀

bliki:StranglerFig 應(yīng)用程序
https://martinfowler.com/bliki/StranglerFigApplication.html

Strangler 模式 - 云設(shè)計(jì)模式
https://docs.microsoft.com/en-us/azure/architecture/patterns/strangler-fig

微服務(wù)模式:Strangler 應(yīng)用程序
https://microservices.io/patterns/refactoring/strangler-application.html

斷路器

在微服務(wù)架構(gòu)中,微服務(wù)通過同步調(diào)用其他服務(wù)來滿足業(yè)務(wù)需求继薛。服務(wù)調(diào)用會(huì)由于瞬時(shí)故障(網(wǎng)絡(luò)連接緩慢修壕、超時(shí)或暫時(shí)不可用) 導(dǎo)致失敗,這種情況重試可以解決問題遏考。然而慈鸠,如果出現(xiàn)了嚴(yán)重問題(微服務(wù)完全失敗)灌具,那么微服務(wù)將長(zhǎng)時(shí)間不可用青团,這時(shí)重試沒有意義且浪費(fèi)寶貴的資源(線程被阻塞,CPU 周期被浪費(fèi))咖楣。此外督笆,一個(gè)服務(wù)的故障還會(huì)引發(fā)整個(gè)應(yīng)用系統(tǒng)的級(jí)聯(lián)故障。這時(shí)快速失敗是一種更好的方法截歉。

在這種情況胖腾,可以使用斷路器模式挽救。一個(gè)微服務(wù)通過代理請(qǐng)求另一個(gè)微服務(wù),其工作原理類似于電氣斷路器咸作,代理通過統(tǒng)計(jì)最近發(fā)生的故障數(shù)量锨阿,并使用它來決定是繼續(xù)請(qǐng)求還是簡(jiǎn)單的直接返回異常。

圖片

*Md Kamaruzzaman *的斷路器

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

  • 關(guān)閉:斷路器將請(qǐng)求路由到微服務(wù)记罚,并統(tǒng)計(jì)給定時(shí)段內(nèi)的故障數(shù)量墅诡,如果超過閾值,它就會(huì)觸發(fā)并進(jìn)入打開狀態(tài)桐智。

  • 打開:來自微服務(wù)的請(qǐng)求會(huì)快速失敗并返回異常末早。在超時(shí)后,斷路器進(jìn)入半開啟狀態(tài)说庭。

  • 半開:只有有限數(shù)量的微服務(wù)請(qǐng)求被允許通過并進(jìn)行調(diào)用然磷。如果這些請(qǐng)求成功,斷路器將進(jìn)入閉合狀態(tài)刊驴。如果任何請(qǐng)求失敗姿搜,斷路器則會(huì)進(jìn)入開啟狀態(tài)。

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

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

  • 阻止引發(fā)其他微服務(wù)的級(jí)聯(lián)故障舅柜。

缺點(diǎn)

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

  • 日志和監(jiān)控躲惰。

  • 應(yīng)該支持人工復(fù)位致份。

何時(shí)使用斷路器

  • 在微服務(wù)間使用同步通信的緊耦合的微服務(wù)架構(gòu)中。

  • 如果微服務(wù)依賴多個(gè)其他微服務(wù)础拨。

何時(shí)不宜使用斷路器

  • 松耦合氮块、事件驅(qū)動(dòng)的微服務(wù)架構(gòu)。

  • 如果微服務(wù)不依賴于其他微服務(wù)诡宗。

可用技術(shù)示例

API 網(wǎng)關(guān)雇锡,服務(wù)網(wǎng)格,各種斷路器庫(Hystrix僚焦, Reselience4J锰提, Polly)。

延伸閱讀

bliki:斷路器
https://martinfowler.com/bliki/CircuitBreaker.html

斷路器模式 - 云設(shè)計(jì)模式
https://docs.microsoft.com/en-us/azure/architecture/patterns/circuit-breaker

微型服務(wù)模式:斷路器
https://microservices.io/patterns/reliability/circuit-breaker.html

外部化配置

每個(gè)業(yè)務(wù)應(yīng)用都有許多用于各種基礎(chǔ)設(shè)施的配置參數(shù)(例如芳悲,數(shù)據(jù)庫立肘、網(wǎng)絡(luò)、連接的服務(wù)地址名扛、憑據(jù)谅年、證書路徑)。此外在企業(yè)應(yīng)用程序通常部署在各種運(yùn)行環(huán)境(Local肮韧、 Dev融蹂、 Prod)中旺订,實(shí)現(xiàn)這些的一個(gè)方法是通過內(nèi)部配置。這是一個(gè)致命糟糕實(shí)踐超燃,它會(huì)導(dǎo)致嚴(yán)重的安全風(fēng)險(xiǎn)区拳,因?yàn)樯a(chǎn)憑證很容易遭到破壞。此外意乓,配置參數(shù)的任何更改都需要重新構(gòu)建應(yīng)用程序樱调,這在在微服務(wù)架構(gòu)中會(huì)更加嚴(yán)峻,因?yàn)槲覀兛赡軗碛袛?shù)百個(gè)服務(wù)届良。

更好的方法是將所有配置外部化笆凌,使得構(gòu)建過程與運(yùn)行環(huán)境分離,生產(chǎn)的配置文件只在運(yùn)行時(shí)或通過環(huán)境變量使用士葫,從而最小化了安全風(fēng)險(xiǎn)乞而。

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

  • 生產(chǎn)配置不屬于代碼庫,因而最小化了安全漏洞慢显。

  • 修改配置參數(shù)不需要重新構(gòu)建應(yīng)用程序晦闰。

缺點(diǎn)

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

何時(shí)使用外部化配置

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

何時(shí)不宜使用外部化配置

  • 在驗(yàn)證概念的開發(fā)中。

可用技術(shù)示例

幾乎所有企業(yè)級(jí)的現(xiàn)代框架都支持外部化配置跪妥。

延伸閱讀

微服務(wù)模式:外部化配置
https://microservices.io/patterns/externalized-configuration.html

一次構(gòu)建鞋喇,到處運(yùn)行:外部化你的配置
https://reflectoring.io/externalize-configuration/

消費(fèi)端驅(qū)動(dòng)的契約測(cè)試

在微服務(wù)架構(gòu)中,通常有許多有不同團(tuán)隊(duì)開發(fā)的微服務(wù)眉撵。這些微型服務(wù)協(xié)同工作來滿足業(yè)務(wù)需求(例如侦香,客戶請(qǐng)求),并相互進(jìn)行同步或異步通信纽疟。消費(fèi)端微服務(wù)的集成測(cè)試具有挑戰(zhàn)性罐韩,通常用 TestDouble 以獲得更快、更低成本的測(cè)試運(yùn)行污朽。但是 TestDouble 通常并不能代表真正的微服務(wù)提供者散吵,而且如果微服務(wù)提供者更改了它的 API 或 消息,那么 TestDouble 將無法確認(rèn)這些蟆肆。另一種選擇是進(jìn)行端到端測(cè)試矾睦,盡管它在生產(chǎn)之前是強(qiáng)制性的,但卻是脆弱的炎功、緩慢的枚冗、昂貴的且不能替代集成測(cè)試(Test Pyramid)。

在這方面消費(fèi)端驅(qū)動(dòng)的契約測(cè)試可以幫助我們蛇损。在這里赁温,負(fù)責(zé)消費(fèi)端微服務(wù)的團(tuán)隊(duì)針對(duì)特定的服務(wù)端微服務(wù)坛怪,編寫一套包含了其請(qǐng)求和預(yù)期響應(yīng)(同步)或消息(異步)的測(cè)試套件,這些測(cè)試套件稱為顯式的約定股囊。對(duì)于微服務(wù)服務(wù)端袜匿,將其消費(fèi)端所有約定的測(cè)試套件都添加到其自動(dòng)化測(cè)試中。當(dāng)特定服務(wù)端微服務(wù)的自動(dòng)化測(cè)試執(zhí)行時(shí)毁涉,它將一起運(yùn)行自己的測(cè)試和約定的測(cè)試并進(jìn)行驗(yàn)證沉帮。通過這種方式,契約測(cè)試可以自動(dòng)的幫助維護(hù)微服務(wù)通信的完整性贫堰。

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

  • 如果提供程序意外更改 API 或消息穆壕,可以被快速的自動(dòng)發(fā)現(xiàn)。

  • 更少意外其屏、更健壯喇勋,特別是包含大量微服務(wù)的企業(yè)應(yīng)用程序。

  • 改善團(tuán)隊(duì)自主性偎行。

缺點(diǎn)

  • 需要額外的工作來開發(fā)和集成微服務(wù)服務(wù)端的契約測(cè)試川背,因?yàn)樗麄兛赡苁褂猛耆煌臏y(cè)試工具。

  • 如果契約測(cè)試與真實(shí)服務(wù)情況不匹配蛤袒,將可能導(dǎo)致生產(chǎn)故障熄云。

何時(shí)使用需求驅(qū)動(dòng)的契約測(cè)試

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

何時(shí)不宜使用消費(fèi)端驅(qū)動(dòng)的契約測(cè)試

  • 所有微服務(wù)由同一團(tuán)隊(duì)負(fù)責(zé)開發(fā)的小型簡(jiǎn)單的應(yīng)用程序缴允。

  • 如果服務(wù)端微服務(wù)是相對(duì)穩(wěn)定的,并且不處在活躍的開發(fā)狀態(tài)珍德。

可用技術(shù)示例

Pact练般, Postman, Spring Cloud Contract

延伸閱讀

需求驅(qū)動(dòng)契約:一種服務(wù)演進(jìn)模式
https://martinfowler.com/articles/consumerDrivenContracts.html

微服務(wù)模式:服務(wù)集成契約測(cè)試
https://microservices.io/patterns/testing/service-integration-contract-test.html

什么是消費(fèi)端驅(qū)動(dòng)的契約測(cè)試锈候?
https://pactflow.io/what-is-consumer-driven-contract-testing/

總結(jié)

在現(xiàn)代大規(guī)模企業(yè)軟件開發(fā)中薄料,微服務(wù)架構(gòu)能夠幫助開發(fā)擴(kuò)展規(guī)模并帶來很多長(zhǎng)期收益。但是微服務(wù)架構(gòu)并不是隨處可用的銀彈泵琳,如果應(yīng)用在錯(cuò)誤的應(yīng)用程序類型摄职,微服務(wù)架構(gòu)將弊大于利。希望采用微服務(wù)架構(gòu)的開發(fā)團(tuán)隊(duì)?wèi)?yīng)該遵循最佳實(shí)踐获列,并使用一系列可重用的琳钉、久經(jīng)錘煉的設(shè)計(jì)模式。

微服務(wù)架構(gòu)中至關(guān)重要的設(shè)計(jì)模式是獨(dú)享數(shù)據(jù)庫蛛倦。實(shí)現(xiàn)這種設(shè)計(jì)模式具有挑戰(zhàn)性歌懒,需要其他幾種密切相關(guān)的設(shè)計(jì)模式(事件驅(qū)動(dòng)、 CQRS溯壶、 Saga)來支持及皂。在具有多個(gè)客戶端(Web甫男、 Mobile、 Desktop验烧、 Smart Devices)的典型業(yè)務(wù)應(yīng)用程序中板驳,客戶端和微服務(wù)之間的通信量可能是很大的,并且需要統(tǒng)一的安全控制碍拆,在這種情況面向前端的后端API 網(wǎng)關(guān)的設(shè)計(jì)非常有用若治。此外,斷路器模式可以大大地幫助應(yīng)對(duì)這類應(yīng)用程序的錯(cuò)誤處理場(chǎng)景感混。遷移遺留的單體應(yīng)用到微服務(wù)是極具挑戰(zhàn)性的端幼,而 Strangler 模式可以幫助做到這點(diǎn)。消費(fèi)端驅(qū)動(dòng)的契約測(cè)試是微服務(wù)集成測(cè)試的基礎(chǔ)模式弧满。另外外部化配置是任何現(xiàn)代化應(yīng)用程序開發(fā)中的一種必備模式婆跑。

這個(gè)系列并不全面,在實(shí)際情況中您可能需要其他的設(shè)計(jì)模式庭呜,但這個(gè)系列能為您提供一個(gè)關(guān)于微服務(wù)架構(gòu)設(shè)計(jì)模式的極好介紹滑进。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市募谎,隨后出現(xiàn)的幾起案子扶关,更是在濱河造成了極大的恐慌,老刑警劉巖数冬,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件节槐,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吉执,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門地来,熙熙樓的掌柜王于貴愁眉苦臉地迎上來戳玫,“玉大人,你說我怎么就攤上這事未斑」舅蓿” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵蜡秽,是天一觀的道長(zhǎng)府阀。 經(jīng)常有香客問我,道長(zhǎng)芽突,這世上最難降的妖魔是什么试浙? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮寞蚌,結(jié)果婚禮上田巴,老公的妹妹穿的比我還像新娘钠糊。我一直安慰自己,他們只是感情好壹哺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布抄伍。 她就那樣靜靜地躺著,像睡著了一般管宵。 火紅的嫁衣襯著肌膚如雪截珍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天箩朴,我揣著相機(jī)與錄音岗喉,去河邊找鬼。 笑死隧饼,一個(gè)胖子當(dāng)著我的面吹牛沈堡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燕雁,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼诞丽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了拐格?” 一聲冷哼從身側(cè)響起僧免,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捏浊,沒想到半個(gè)月后懂衩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡金踪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年浊洞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胡岔。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡法希,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靶瘸,到底是詐尸還是另有隱情苫亦,我是刑警寧澤,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布怨咪,位于F島的核電站屋剑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏诗眨。R本人自食惡果不足惜唉匾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匠楚。 院中可真熱鬧肄鸽,春花似錦卫病、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至逮诲,卻和暖如春帜平,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背梅鹦。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工裆甩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人齐唆。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓嗤栓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親箍邮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子茉帅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 翻譯自https://microservices.io/patterns/data/database-per-se...
    TinyThing閱讀 624評(píng)論 0 0
  • 前不久,Java Code Geeks發(fā)表了一篇文章锭弊,分析單體應(yīng)用與微服務(wù)的優(yōu)缺點(diǎn)堪澎。近日,該網(wǎng)站又發(fā)表了一篇文章味滞,...
    生活的探路者閱讀 939評(píng)論 0 0
  • 表情是什么樱蛤,我認(rèn)為表情就是表現(xiàn)出來的情緒。表情可以傳達(dá)很多信息剑鞍。高興了當(dāng)然就笑了昨凡,難過就哭了。兩者是相互影響密不可...
    Persistenc_6aea閱讀 124,418評(píng)論 2 7
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險(xiǎn)厭惡者蚁署,不喜歡去冒險(xiǎn)便脊,但是人生放棄了冒險(xiǎn),也就放棄了無數(shù)的可能形用。 ...
    yichen大刀閱讀 6,038評(píng)論 0 4