微服務架構設計模式
微服務架構設計模式
鏈接:https://pan.baidu.com/s/1hkVh2NWaAJGZQvc-y5f08A?pwd=0tcu?
提取碼:0tcu

編輯推薦
適讀人群 :本書的重點是架構和開發(fā),適合負責開發(fā)和交付軟件的任何人(例如開發(fā)人員、架構師、 CTO等)閱讀。示例代碼使用Java語言和Spring框架
本書由世界十大軟件架構師之一、微服務架構的先驅、Java開發(fā)者社區(qū)的意見領袖Chris Richardson親筆撰寫,旨在幫助架構師和程序員學會使用微服務架構成功開發(fā)應用程序。書中描述了如何解決我們將面臨的眾多架構設計挑戰(zhàn),包括如何管理分布式數(shù)據(jù),還介紹了如何將單體應用程序重構為微服務架構,涵蓋44個架構設計模式,系統(tǒng)解決服務拆分、事務管理、查詢和跨服務通信等難題。本書并不是鼓吹微服務架構的宣言,作者既介紹了微服務的原理、原則,又詳細講解了實際落地中的架構設計模式,將使你理解微服務架構、它的好處和弊端,以及應該何時使用微服務架構。本書將幫助你建立微服務的全局視野,并學會在紛繁復雜的情況下做出正確的架構選擇和取舍。
本書將教會你如何開發(fā)和部署生產(chǎn)級別的微服務架構應用。這套寶貴的架構設計模式建立在數(shù)十年的分布式系統(tǒng)經(jīng)驗之上,Chris還為開發(fā)服務添加了新的模式,并將它們組合成可在真實條件下可靠地擴展和執(zhí)行的系統(tǒng)。本書不僅僅是一個模式目錄,還提供了經(jīng)驗驅動的建議,以幫助你設計、實現(xiàn)、測試和部署基于微服務的應用程序。
本書包含:
●如何(以及為什么)使用微服務架構
●服務拆分的策略
●事務管理和查詢相關的模式
●高效的測試策略
●包括容器和Serverless在內(nèi)的部署模式
本書專為熟悉標準企業(yè)應用程序架構的開發(fā)人員編寫,使用Java語言和Spring框架編寫所有示例代碼。
內(nèi)容簡介
成功地開發(fā)基于微服務架構的應用軟件,需要掌握一系列全新的架構思想和實踐。在這本獨特的書籍中,世界十大軟件架構師之一、微服務架構先驅Chris Richardson收集、分類并解釋了44個架構設計模式,這些模式用來解決諸如服務拆分、事務管理、查詢和跨服務通信等難題。
本書的目標是讓架構師和程序員學會使用微服務架構成功開發(fā)應用程序。
書中不僅討論了微服務架構的好處,還描述了它們的弊端。讀者將掌握如何在使用單體架構和使用微服務架構之間做出正確的權衡。
【誰應該閱讀本書】
本書的重點是架構和開發(fā),適合負責開發(fā)和交付軟件的任何人(例如開發(fā)人員、架構師、CTO 等)閱讀。
本書側重于解釋微服務架構的設計模式和其他概念。無論讀者使用何種技術棧,我的目標都是讓你們可以輕松讀懂這本書。你只需要熟悉企業(yè)應用程序架構和設計的基礎知識即可。特別是,需要了解三層架構、Web 應用程序設計、關系型數(shù)據(jù)庫、使用消息和基于 REST 的進程間通信,以及應用程序安全性的基礎知識等概念。本書的代碼示例使用 Java 和 Spring 框架。為了充分利用它們,讀者應該對 Spring 框架有所了解。
【本書內(nèi)容安排】
本書由13章組成。
●第1章描述了所謂“單體地獄”的癥狀,當單體應用程序超出其架構時會出現(xiàn)這種問題,這可以通過采用微服務架構來規(guī)避。這一章還概述了微服務架構模式語言,這也是本書大部分內(nèi)容的主題。
●第2章解釋了為什么軟件架構很重要,描述了可用于將應用程序分解為服務集合的模式,并解釋了如何克服在此過程中遇到的各種障礙。
●第3章介紹了微服務架構中強大的進程間通信的幾種模式,解釋了為什么異步和基于消息的通信通常是最佳選擇。
●第4章介紹如何使用 Saga 模式維護服務間的數(shù)據(jù)一致性。Saga 是通過傳遞異步消息的方式進行協(xié)調(diào)的一系列本地事務。
●第5章介紹如何使用領域驅動設計(DDD)的聚合和領域事件等模式為服務設計業(yè)務邏輯。
●第6章以第5章為基礎,解釋了如何使用事件溯源模式開發(fā)業(yè)務邏輯,事件溯源模式是一種以事件為中心的設計思路,用來構建業(yè)務邏輯和持久化領域對象。
●第7章介紹如何使用API組合模式或命令查詢職責隔離(CQRS)模式,這兩個模式用來實現(xiàn)查詢分散在多個服務中的數(shù)據(jù)。
●第8章介紹了處理來自各種外部客戶端請求的外部 API 模式,例如移動應用程序、基于瀏覽器的 JavaScript 應用程序和第三方應用程序。
●第9章是關于微服務自動化測試技術的兩章中的第一章,介紹了重要的測試概念,例如測試金字塔,描述了測試套件中每種測試類型的相對比例,還展示了如何編寫構成測試金字塔基礎的單元測試。
●第10章以第9章為基礎,描述了如何在測試金字塔中編寫其他類型的測試,包括集成測試、消費者契約測試和組件測試等。
●第11章介紹了開發(fā)生產(chǎn)就緒服務的各個方面,包括安全性、外部化配置模式和服務可觀測性模式。服務可觀測性模式包括日志聚合、應用指標和分布式追蹤。
●第12章介紹了可用于部署服務的各種部署模式,包括虛擬機、容器和 Serverless 模式。還介紹了使用服務網(wǎng)格的好處,服務網(wǎng)格是在微服務架構中處理服務間通信的一個網(wǎng)絡軟件層。
●第13章介紹了如何通過采用絞殺者(Strangler)模式逐步將單體架構重構為微服務架構,絞殺者模式是指以服務形式實現(xiàn)新功能,從單體中提取模塊將其轉換為服務。
在學習這些章節(jié)的過程中,讀者將了解微服務架構的不同方面。
作者簡介
克里斯·理查森(Chris Richardson)
世界十大軟件架構師之一,《POJOS in Action》等技術名著的作者,也是著名開源項目 Cloud Foundry 和 Eventuate 的創(chuàng)始人。他的研究領域包括微服務架構設計、分布式數(shù)據(jù)管理、事件驅動的應用架構、領域驅動設計、持續(xù)交付、Spring 框架、Scala、NoSQL 數(shù)據(jù)庫等。
喻勇
在技術圈馳騁多年,曾擔任過微軟技術布道師,VMware Cloud Foundry生態(tài)建設負責人,并有幸引領了國內(nèi)容器技術的創(chuàng)業(yè)浪潮。目前定居加拿大,關注微服務架構、云原生應用等領域。
Chris與喻勇曾在VMware全球開發(fā)者關系團隊共事多年,現(xiàn)在他們合作為國內(nèi)企業(yè)客戶提供微服務相關的咨詢和培訓服務,他們的中文網(wǎng)站是:www.chrisrichardson.cn
精彩書評
“全面概述了團隊在轉向微服務時面臨的挑戰(zhàn),以及針對這些問題的、經(jīng)過行業(yè)檢驗的解決方案。”
——Tim Moore,Lightbend
“系統(tǒng)性地闡述了一個重要的架構領域?!?/p>
——Simeon Leyzerzon,Excelsior Software
“一本可靠的手冊,可以加快你遷移到這個基于云的現(xiàn)代架構的速度?!?/p>
——John Guthrie,Dell/EMC
“可幫你理解微服務方法并在現(xiàn)實生活中使用它?!?/p>
——Potito Coluccelli,Bizmatica Econocom
“喻勇翻譯的這本書是近幾年我所看到的眾多論述微服務架構書籍中好的一本。該書圍繞微服務的架構設計,深入淺出地介紹了微服務與SOA等其他架構的區(qū)別,軟件系統(tǒng)服務的拆分策略,微服務的同步和異步通信模式,如何使用微服務進行事務管理,如何在微服務架構中設計業(yè)務邏輯。同時詳細描述了微服務架構中的測試和生產(chǎn)部署策略。該書所總結出的架構經(jīng)驗對設計微服務架構有很好的指導作用,建議軟件研發(fā)人員認真研讀?!?/p>
——陳斌,易寶支付CTO
“這本書里,不僅有微服務領域已經(jīng)識別出來的問題、解決思路和解決方案,也有相應的代碼例子。這本書可以幫助微服務相關人員構建知行合一的能力……這是一本可以幫你在設計微服務架構時做出取舍的書,它能在你處理微服務相關問題“左右為難”的時候給你提供參考和建議。”
——蔡書,獨立顧問,PolarisTech聯(lián)合創(chuàng)始人
“書中既包含了微服務的原理、原則,又包含了實際落地中的架構設計模式;既包含可舉一反三的理念和概念,也包含類似領域驅動設計、Saga實現(xiàn)事務操作、CQRS構建事件驅動系統(tǒng)等具體可套用的范式……相信本書對于企業(yè)CIO推動公司數(shù)字化轉型戰(zhàn)略、軟件開發(fā)者提升自身技術架構功力,以及云原生愛好者以微服務切入新的云原生體系,都有著極其重要的實踐指導意義?!?/p>
——張鑫,才云科技CEO
目錄
●第1章逃離單體地獄/1
1.1邁向單體地獄的漫長旅程/2
1.1.1FTGO應用程序的架構/3
1.1.2單體架構的好處/4
1.1.3什么是單體地獄/4
1.2為什么本書與你有關/7
1.3你會在本書中學到什么/8
1.4拯救之道:微服務架構/8
1.4.1擴展立方體和服務/9
1.4.2微服務架構作為模塊化的一種形式/11
1.4.3每個服務都擁有自己的數(shù)據(jù)庫/12
1.4.4FTGO的微服務架構/12
1.4.5微服務架構與SOA的異同/14
1.5微服務架構的好處和弊端/15
1.5.1微服務架構的好處/15
1.5.2微服務架構的弊端/17
1.6微服務架構的模式語言/19
1.6.1微服務架構并不是“銀彈”/20
1.6.2模式和模式語言/21
1.6.3微服務架構的模式語言概述/24
1.7微服務之上:流程和組織/29
1.7.1進行軟件開發(fā)和交付的組織/30
1.7.2進行軟件開發(fā)和交付的流程/31
1.7.3采用微服務架構時的人為因素/32
●第2章服務的拆分策略/34
2.1微服務架構到底是什么/35
2.1.1軟件架構是什么,為什么它如此重要/35
2.1.2什么是架構的風格/37
2.1.3微服務架構是一種架構風格/40
2.2為應用程序定義微服務架構/43
2.2.1識別系統(tǒng)操作/45
2.2.2根據(jù)業(yè)務能力進行服務拆分/50
2.2.3根據(jù)子域進行服務拆分/53
2.2.4拆分的指導原則/54
2.2.5拆分單體應用為服務的難點/56
2.2.6定義服務API/59
●第3章微服務架構中的進程間通信/63
3.1微服務架構中的進程間通信概述/64
3.1.1交互方式/64
3.1.2在微服務架構中定義API/66
3.1.3API的演化/67
3.1.4消息的格式/69
3.2基于同步遠程過程調(diào)用模式的通信/70
3.2.1使用REST/71
3.2.2使用gRPC/74
3.2.3使用斷路器模式處理局部故障/75
3.2.4使用服務發(fā)現(xiàn)/78
3.3基于異步消息模式的通信/82
3.3.1什么是消息傳遞/83
3.3.2使用消息機制實現(xiàn)交互方式/84
3.3.3為基于消息機制的服務API創(chuàng)建API規(guī)范/86
3.3.4使用消息代理/87
3.3.5處理并發(fā)和消息順序/91
3.3.6處理重復消息/92
3.3.7事務性消息/93
3.3.8消息相關的類庫和框架/97
3.4使用異步消息提高可用性/99
3.4.1同步消息會降低可用性/99
3.4.2消除同步交互/101
●第4章使用Saga管理事務/106
4.1微服務架構下的事務管理/107
4.1.1微服務架構對分布式事務的需求/108
4.1.2分布式事務的挑戰(zhàn)/109
4.1.3使用Saga模式維護數(shù)據(jù)一致性/109
4.2Saga的協(xié)調(diào)模式/113
4.2.1協(xié)同式Saga/113
4.2.2編排式Saga/117
4.3解決隔離問題/121
4.3.1缺乏隔離導致的問題/122
4.3.2Saga模式下實現(xiàn)隔離的對策/123
4.4OrderService和CreateOrderSaga的設計/127
4.4.1OrderService類/128
4.4.2CreateOrderSaga的實現(xiàn)/129
4.4.3OrderCommandHandlers類/136
4.4.4OrderServiceConfiguration類/138
●第5章微服務架構中的業(yè)務邏輯設計/141
5.1業(yè)務邏輯組織模式/142
5.1.1使用事務腳本模式設計業(yè)務邏輯/143
5.1.2使用領域模型模式設計業(yè)務邏輯/144
5.1.3關于領域驅動設計/146
5.2使用聚合模式設計領域模型/146
5.2.1模糊邊界所帶來的問題/147
5.2.2聚合擁有明確的邊界/149
5.2.3聚合的規(guī)則/150
5.2.4聚合的顆粒度/152
5.2.5使用聚合設計業(yè)務邏輯/153
5.3發(fā)布領域事件/154
5.3.1為什么需要發(fā)布變更事件/154
5.3.2什么是領域事件/155
5.3.3事件增強/155
5.3.4識別領域事件/156
5.3.5生成和發(fā)布領域事件/157
5.3.6消費領域事件/161
5.4KitchenService的業(yè)務邏輯/162
5.5OrderService的業(yè)務邏輯/167
5.5.1Order聚合/169
5.5.2OrderService類/173
●第6章使用事件溯源開發(fā)業(yè)務邏輯/176
6.1使用事件溯源開發(fā)業(yè)務邏輯概述/177
6.1.1傳統(tǒng)持久化技術的問題/177
6.1.2什么是事件溯源/179
6.1.3使用樂觀鎖處理并發(fā)更新/186
6.1.4事件溯源和發(fā)布事件/186
6.1.5使用快照提升性能/188
6.1.6冪等方式的消息處理/189
6.1.7領域事件的演化/190
6.1.8事件溯源的好處/192
6.1.9事件溯源的弊端/193
6.2實現(xiàn)事件存儲庫/194
6.2.1EventuateLocal事件存儲庫的工作原理/195
6.2.2Eventuate的Java客戶端框架/198
6.3同時使用Saga和事件溯源/201
6.3.1使用事件溯源實現(xiàn)協(xié)同式Saga/203
6.3.2創(chuàng)建編排式Saga/203
6.3.3實現(xiàn)基于事件溯源的Saga參與方/205
6.3.4實現(xiàn)基于事件溯源的Saga編排器/208
●第7章在微服務架構中實現(xiàn)查詢/212
7.1使用API組合模式進行查詢/213
7.1.1findOrder()查詢操作/213
7.1.2什么是API組合模式/214
7.1.3使用API組合模式實現(xiàn)findOrder()查詢操作/215
7.1.4API組合模式的設計缺陷/216
7.1.5API組合模式的好處和弊端/219
7.2使用CQRS模式/220
7.2.1為什么要使用CQRS/220
7.2.2什么是CQRS/223
7.2.3CQRS的好處/226
7.2.4CQRS的弊端/227
7.3設計CQRS視圖/228
7.3.1選擇視圖存儲庫/229
7.3.2設計數(shù)據(jù)訪問模塊/230
7.3.3添加和更新CQRS視圖/232
7.4實現(xiàn)基于AWSDynamoDB的CQRS視圖/233
7.4.1OrderHistoryEventHandlers模塊/234
7.4.2DynamoDB中的數(shù)據(jù)建模和查詢設計/235
7.4.3OrderHistoryDaoDynamoDb類/239
●第8章外部API模式/244
8.1外部API的設計難題/245
8.1.1FTGO移動客戶端API的設計難題/246
8.1.2其他類型客戶端API的設計難題/248
8.2APIGateway模式/250
8.2.1什么是APIGateway模式/250
8.2.2APIGateway模式的好處和弊端/256
8.2.3以Netflix為例的APIGateway/257
8.2.4APIGateway的設計難題/258
8.3實現(xiàn)一個APIGateway/260
8.3.1使用現(xiàn)成的APIGateway產(chǎn)品或服務/261
8.3.2開發(fā)自己的APIGateway/262
8.3.3使用GraphQL實現(xiàn)APIGateway/269
●第9章微服務架構中的測試策略(上)/282
9.1微服務架構中的測試策略概述/284
9.1.1什么是測試/284
9.1.2微服務架構中的測試挑戰(zhàn)/289
9.1.3部署流水線/295
9.2為服務編寫單元測試/296
9.2.1為實體編寫單元測試/298
9.2.2為值對象編寫單元測試/299
9.2.3為Saga編寫單元測試/300
9.2.4為領域服務編寫單元測試/302
9.2.5為控制器編寫單元測試/303
9.2.6為事件和消息處理程序編寫單元測試/305
●第10章微服務架構中的測試策略(下)/308
10.1編寫集成測試/308
10.1.1針對持久化層的集成測試/311
10.1.2針對基于REST的請求/響應式交互的集成測試/312
10.1.3針對發(fā)布/訂閱式交互的集成測試/316
10.1.4針對異步請求/響應式交互的集成契約測試/320
10.2編寫組件測試/324
10.2.1定義驗收測試/325
10.2.2使用Gherkin編寫驗收測試/326
10.2.3設計組件測試/328
10.2.4為FTGO的OrderService編寫組件測試/330
10.3端到端測試/334
10.3.1設計端到端測試/335
10.3.2編寫端到端測試/335
10.3.3運行端到端測試/336
●第11章開發(fā)面向生產(chǎn)環(huán)境的微服務應用/338
11.1開發(fā)安全的服務/339
11.1.1傳統(tǒng)單體應用程序的安全性/340
11.1.2在微服務架構中實現(xiàn)安全性/343
11.2設計可配置的服務/349
11.2.1使用基于推送的外部化配置/350
11.2.2使用基于拉取的外部化配置/352
11.3設計可觀測的服務/353
11.3.1使用健康檢查API模式/355
11.3.2使用日志聚合模式/357
11.3.3使用分布式追蹤模式/358
11.3.4使用應用程序指標模式/361
11.3.5使用異常追蹤模式/364
11.3.6使用審計日志模式/365
11.4使用微服務基底模式開發(fā)服務/367
11.4.1使用微服務基底/368
11.4.2從微服務基底到服務網(wǎng)格/368
●第12章部署微服務應用/371
12.1部署模式:編程語言特定的發(fā)布包格式/374
12.1.1使用編程語言特定的發(fā)布包格式進行部署的好處/376
12.1.2使用編程語言特定的發(fā)布包格式進行部署的弊端/377
12.2部署模式:將服務部署為虛擬機/378
12.2.1將服務部署為虛擬機的好處/380
12.2.2將服務部署為虛擬機的弊端/380
12.3部署模式:將服務部署為容器/381
12.3.1使用Docker部署服務/383
12.3.2將服務部署為容器的好處/385
12.3.3將服務部署為容器的弊端/386
12.4使用Kubernetes部署FTGO應用程序/386
12.4.1什么是Kubernetes/386
12.4.2在Kubernetes上部署RestaurantService/389
12.4.3部署APIGateway/392
12.4.4零停機部署/393
12.4.5使用服務網(wǎng)格分隔部署與發(fā)布流程/394
12.5部署模式:Serverless部署/402
12.5.1使用AWSLambda進行Serverless部署/403
12.5.2開發(fā)Lambda函數(shù)/404
12.5.3調(diào)用Lambda函數(shù)/404
12.5.4使用Lambda函數(shù)的好處/405
12.5.5使用Lambda函數(shù)的弊端/406
12.6使用AWSLambda和AWSGateway部署RESTful服務/406
12.6.1AWSLambda版本的RestaurantService/407
12.6.2把服務打包為ZIP文件/411
12.6.3使用Serverless框架部署Lambda函數(shù)/412
●第13章微服務架構的重構策略/415
13.1重構到微服務需要考慮的問題/416
13.1.1為什么要重構單體應用/416
13.1.2絞殺單體應用/417
13.2將單體應用重構為微服務架構的若干策略/420
13.2.1將新功能實現(xiàn)為服務/420
13.2.2隔離表現(xiàn)層與后端/422
13.2.3提取業(yè)務能力到服務中/423
13.3設計服務與單體的協(xié)作方式/429
13.3.1設計集成膠水/430
13.3.2在服務和單體之間維持數(shù)據(jù)一致性/434
13.3.3處理身份驗證和訪問授權/438
13.4將新功能實現(xiàn)為服務:處理錯誤配送訂單/440
13.4.1DelayedDeliveryService的設計/441
13.4.2為DelayedDeliveryService設計集成膠水/442
13.5從單體中提取送餐管理功能/444
13.5.1現(xiàn)有的送餐管理功能/444
13.5.2DeliveryService概覽/446
13.5.3設計DeliveryService的領域模型/447
13.5.4DeliveryService集成膠水的設計/450
13.5.5修改FTGO單體使其能夠與DeliveryService交互/451
查看全部↓
前言/序言
【寫給中文版讀者的話】
7年前,我?guī)е鴮γ朗澈图夹g的熱情,開始了我的首次中國之旅。在那之前,我對中國的美食和軟件社區(qū)都知之甚少。7年之后,經(jīng)過多次中國之行,我對這兩者都有了深刻的認識:我愛上了地道的中國菜,也對中國的軟件開發(fā)者印象深刻。
2012年我首次訪問中國,參加我在VMware公司的同事Frank舉辦的幾場開發(fā)者會議。我一口氣在北京和上海做了好幾場演講,包括云計算、Cloud Foundry、Node.js、Spring、NoSQL數(shù)據(jù)庫,當然,還有微服務。我與2000多位參加會議的來賓討論Cloud Foundry,這次旅行讓我意識到中國開發(fā)者社區(qū)的規(guī)模和熱情,也讓我有機會品嘗了地道的中國菜。我甚至還忙里偷閑,在北京參加了一天中餐烹飪課程。
2013年,F(xiàn)rank再次邀請我來到北京,參加中國首場SpringOne大會,發(fā)表關于微服務和NoSQL的演講。這次旅行的亮點是訪問豆瓣和百度,這是我與中國科技公司的第一次近距離接觸。他們的規(guī)模和創(chuàng)新技術都給我留下了非常深刻的印象。在這次旅行中,我參觀了北京奧林匹克公園,回憶了曾在這里舉行的2008年北京奧運會開幕式。我也抓住機會,繼續(xù)“進修”中餐烹飪課程。