微服務架構設計模式 (Microservices Patterns: With examples in Java)
內容描述
成功地開發基於微服務架構的應用軟件,需要掌握一系列全新的架構思想和實踐。在這本獨特的書籍中,微服務架構的先驅、Java開發者社區的意見領袖Chris Richardson收集、分類並解釋了44個架構設計模式,這些模式可用來解決諸如服務拆分、事務管理、查詢和跨服務通信等難題。
本書將教會你如何開發和部署生產級別的微服務架構應用。這套寶貴的架構設計模式建立在數十年的分佈式系統經驗之上,Chris還為開發服務添加了新的模式,並將它們組合成可在真實條件下可靠地擴展和執行的系統。本書不僅僅是一個模式目錄,還提供了經驗驅動的建議,以幫助你設計、實現、測試和部署基於微服務的應用程序。
本書包含
如何(以及為什麽)使用微服務架構
服務拆分的策略
事務管理和查詢相關的模式
高效的測試策略
包括容器和Serverless在內的部署模式
本書專為熟悉標準企業應用程序架構的開發人員編寫,使用Java編寫所有示例代碼。
目錄大綱
目錄
寫給中文版讀者的話
譯者序
中文版序一
中文版序二
前言
引言
第1章逃離單體地獄/ 1
1.1邁向單體地獄的漫長旅程/ 2
1.1.1 FTGO應用程序的架構/ 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每個服務都擁有自己的數據庫/ 12
1.4.4 FTGO的微服務架構/ 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進行軟件開發和交付的組織/ 30
1.7.2進行軟件開發和交付的流程/ 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識別系統操作/ 45
2.2.2根據業務能力進行服務拆分/ 50
2.2.3根據子域進行服務拆分/ 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.3 API的演化/ 67
3.1.4消息的格式/ 69
3.2基於同步遠程過程調用模式的通信/ 70
3.2.1使用REST / 71
3.2.2使用gRPC / 74
3.2.3使用斷路器模式處理局部故障/ 75
3.2.4使用服務發現/ 78
3.3基於異步消息模式的通信/ 82
3.3.1什麼是消息傳遞/ 83
3.3.2使用消息機制實現交互方式/ 84
3.3.3為基於消息機制的服務API創建API規範/ 86
3.3.4使用消息代理/ 87
3.3.5處理並發和消息順序/ 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分佈式事務的挑戰/ 109
4.1.3使用Saga模式維護數據一致性/ 109
4.2 Saga的協調模式/ 113
4.2.1協同式Saga / 113
4.2.2編排式Saga / 117
4.3解決隔離問題/ 121
4.3.1缺乏隔離導致的問題/ 122
4.3. 2 Saga模式下實現隔離的對策/ 123
4.4 Order Service和Create Order Saga的設計/ 127
4.4.1 OrderService類/ 128
4.4.2 Create Order Saga的實現/ 129
4.4.3 OrderCommandHandlers類/ 136
4.4.4 OrderServiceConfiguration類/ 138
第5章微服務架構中的業務邏輯設計/ 141
5.1業務邏輯組織模式/ 142
5.1.1使用事務腳本模式設計業務邏輯/ 143
5.1.2使用領域模型模式設計業務邏輯/ 144
5.1.3關於領域驅動設計/ 146
5.2使用聚合模式設計領域模型/ 146
5.2.1模糊邊界所帶來的問題/ 147
5.2.2聚合擁有明確的邊界/ 149
5.2.3聚合的規則/ 150
5.2.4聚合的顆粒度/ 152
5.2.5使用聚合設計業務邏輯/ 153
5.3發布領域事件/ 154
5.3. 1為什麼需要發布變更事件/ 154
5.3.2什麼是領域事件/ 155
5.3.3事件增強/ 155
5.3.4識別領域事件/ 156
5.3.5生成和發布領域事件/ 157
5.3.6消費領域事件/ 161
5.4 Kitchen Service的業務邏輯/ 162
5.5 Order Service的業務邏輯/ 167
5.5 .1 Order聚合/ 169
5.5.2 OrderService類/ 173
第6章使用事件溯源開發業務邏輯/ 176
6.1使用事件溯源開發業務邏輯概述/ 177
6.1.1傳統持久化技術的問題/ 177
6.1.2什麼是事件溯源/ 179
6.1.3使用樂觀鎖處理並發更新/ 186
6.1.4事件溯源和發布事件/ 186
6.1.5使用快照提升性能/ 188
6.1.6冪等方式的消息處理/ 189
6.1.7領域事件的演化/ 190
6.1.8事件溯源的好處/ 192
6.1.9事件溯源的弊端/ 193
6.2實現事件存儲庫/ 194
6.2.1 Eventuate Local事件存儲庫的工作原理/ 195
6.2.2 Eventuate的Java客戶端框架/ 198
6.3同時使用Saga和事件溯源/ 201
6.3 .1使用事件溯源實現協同式Saga / 203
6.3.2創建編排式Saga / 203
6.3.3實現基於事件溯源的Saga參與方/ 205
6.3.4實現基於事件溯源的Saga編排器/ 208
第7章在微服務架構中實現查詢/ 212
7.1使用API組合模式進行查詢/ 213
7.1.1 findOrder()查詢操作/ 213
7.1.2什麼是API組合模式/ 214
7.1.3使用API組合模式實現findOrder()查詢操作/ 215
7.1.4 API組合模式的設計缺陷/ 216
7.1.5 API組合模式的好處和弊端/ 219
7.2使用CQRS模式/ 220
7.2.1為什麼要使用CQRS / 220
7.2.2什麼是CQRS / 223
7.2.3 CQRS的好處/ 226
7.2.4 CQRS的弊端/ 227
7.3設計CQRS視圖/ 228
7.3.1選擇視圖存儲庫/ 229
7.3. 2設計數據訪問模塊/ 230
7.3.3添加和更新CQRS視圖/ 232
7.4實現基於AWS DynamoDB的CQRS視圖/ 233
7.4.1 OrderHistoryEventHandlers模塊/ 234
7.4.2 DynamoDB中的數據建模和查詢設計/ 235
7.4. 3 OrderHistoryDaoDynamoDb類/ 239
第8章外部API模式/ 244
8.1外部API的設計難題/ 245
8.1.1 FTGO移動客戶端API的設計難題/ 246
8.1.2其他類型客戶端API的設計難題/ 248
8.2 API Gateway模式/ 250
8.2.1什麼是API Gateway模式/ 250
8.2.2 API Gateway模式的好處和弊端/ 256
8.2.3以Netflix為例的API Gateway / 257
8.2.4 API Gateway的設計難題/ 258
8.3實現一個API Gateway / 260
8.3.1使用現成的API Gateway產品或服務/ 261
8.3.2開發自己的API Gateway / 262
8.3.3使用GraphQL實現API Gateway / 269
第9章微服務架構中的測試策略(上) / 282
9.1微服務架構中的測試策略概述/ 284
9.1.1什麼是測試/ 284
9.1.2微服務架構中的測試挑戰/ 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針對發布/訂閱式交互的集成測試/ 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的Order Service編寫組件測試/ 330
10.3端到端測試/ 334
10.3.1設計端到端測試/ 335
10.3.2編寫端到端測試/ 335
10.3.3運行端到端測試/ 336
第11章開發麵向生產環境的微服務應用/ 338
11.1開發安全的服務/ 339
11.1.1傳統單體應用程序的安全性/ 340
11.1.2在微服務架構中實現安全性/ 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使用微服務基底模式開發服務/ 367
11.4.1使用微服務基底/ 368
11.4.2從微服務基底到服務網格/ 368
第12章部署微服務應用/ 371
12.1部署模式:編程語言特定的發布包格式/ 374
12.1.1使用編程語言特定的發布包格式進行部署的好處/ 376
12.1.2使用編程語言特定的發布包格式進行部署的弊端/ 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上部署Restaurant Service / 389
12.4.3部署API Gateway / 392
12.4.4零停機部署/ 393
12.4.5使用服務網格分隔部署與發布流程/ 394
12.5部署模式:Serverless部署/ 402
12.5.1使用AWS Lambda進行Serverless部署/ 403
12.5.2開發Lambda函數/ 404
12.5.3調用Lambda函數/ 404
12.5 .4使用Lambda函數的好處/ 405
12.5.5使用Lambda函數的弊端/ 406
12.6使用AWS Lambda和AWS Gateway部署RESTful服務/ 406
12.6.1 AWS Lambda版本的Restaurant Service / 407
12.6.2把服務打包為ZIP文件/ 411
12.6.3使用Serverless框架部署Lambda函數/ 412
第13章微服務架構的重構策略/ 415
13.1重構到微服務需要考慮的問題/ 416
13.1.1為什麼要重構單體應用/ 416
13.1.2絞殺單體應用/ 417
13.2將單體應用重構為微服務架構的若干策略/ 420
13.2.1將新功能實現為服務/ 420
13.2.2隔離表現層與後端/ 422
13.2.3提取業務能力到服務中/ 423
13.3設計服務與單體的協作方式/ 429
13.3.1設計集成膠水/ 430
13.3.2在服務和單體之間維持數據一致性/ 434
13.3.3處理身份驗證和訪問授權/ 438
13.4將新功能實現為服務:處理錯誤配送訂單/ 440
13.4.1 Delayed Delivery Service的設計/ 441
13.4.2為Delayed Delivery Service設計集成膠水/ 442
13.5從單體中提取送餐管理功能/ 444
13.5.1現有的送餐管理功能/ 444
13.5.2 Delivery Service概覽/ 446
13.5.3設計Delivery Service的領域模型/ 447
13.5.4 Delivery Service集成膠水的設計/ 450
13.5.5修改FTGO單體使其能夠與Delivery Service交互/ 451