微服務設計(第2版)
[英]薩姆·紐曼(Sam Newman)
- 出版商: 人民郵電
- 出版日期: 2024-04-01
- 定價: $959
- 售價: 8.5 折 $815
- 語言: 簡體中文
- 頁數: 428
- ISBN: 7115638764
- ISBN-13: 9787115638762
-
相關分類:
Microservices 微服務、SOA
下單後立即進貨 (約2週~3週)
相關主題
商品描述
本書是系統架構領域標桿參考書的升級版,由業內資深專家薩姆·紐曼(Sam Newman)撰寫。 過去10年,隨著微服務的普及,大量組織從單體應用遷移到了微服務應用,分佈式系統變得愈加精細化,然而,這個過程中也出現了一系列問題。本書深入探討了構建、管理、擴展和演進微服務架構時需要考慮的方方面面。內容分為三部分:第一部分“基礎”(第1章~第4章),詳細闡述微服務背後的核心思想;第二部分“實現”(第5章~第13章),帶你轉向具體實現細節,通過各種技術和方法盡可能大程度地用好微服務;第三部分“人和組織”(第14章~第16章),具體闡述離開人和組織的支持,理念和技術將毫無意義。通過學習本書,你將深入瞭解對微服務的建模、集成、測試、部署和監控等方向新的解決方案。 第2版進行了全面更新:新增了微服務構建和部署、無服務器計算及雲原生應用等主題,擴充了進程間通信等內容。此外,新版貫穿了更多業界常見案例,提供了更多代碼示例,幫助大家落地微服務。
本書面向架構師、開發人員、測試人員和IT運維人員等各類對微服務感興趣的讀者。
作者簡介
[英]萨姆·纽曼(Sam Newman)
微服务先驱 · Thoughtworks前系统架构师 · 独立咨询师
深耕行业20多年,聚焦微服务、云和持续交付,致力于帮助企业更快速、可靠地交付软件,合作客户遍布全球。热销技术书作者,著有《微服务设计》《重构到微服务》。
目錄大綱
審讀致謝
專家推薦
推薦序一 | 肖然
推薦序二 | 沈劍
譯者序
前言
第一部分 基礎
第1章 追根問底微服務 3
1.1 微服務概述 3
1.2 微服務的關鍵概念 5
1.2.1 可獨立部署 5
1.2.2 圍繞業務領域建模 6
1.2.3 狀態自主 7
1.2.4 服務大小 7
1.2.5 靈活性 8
1.2.6 架構和組織的一致性 8
1.3 單體 11
1.3.1 單進程單體 12
1.3.2 模塊化單體 12
1.3.3 分佈式單體 13
1.3.4 單體和交付爭用 14
1.3.5 單體的優勢 14
1.4 技術能力 14
1.4.1 日誌聚合和分佈式追蹤 15
1.4.2 容器和Kubernetes 16
1.4.3 流技術 16
1.4.4 公有雲和無服務器技術 17
1.5 微服務的優勢 17
1.5.1 技術的異構性 17
1.5.2 健壯性 18
1.5.3 擴展性 19
1.5.4 部署的便捷性 20
1.5.5 組織協調 20
1.5.6 可組合性 20
1.6 微服務的痛點 20
1.6.1 開發者體驗 21
1.6.2 技術過載 21
1.6.3 成本 21
1.6.4 生成報表 22
1.6.5 監控和故障排除 23
1.6.6 安全 23
1.6.7 測試 23
1.6.8 延遲 23
1.6.9 數據一致性 24
1.7 我應該採用微服務嗎 24
1.7.1 不適用情況 24
1.7.2 適用情況 25
1.8 小結 26
第2章 微服務建模 27
2.1 MusicCorp簡介 27
2.2 合理劃分微服務邊界 28
2.2.1 信息隱藏 28
2.2.2 內聚 29
2.2.3 耦合 29
2.2.4 內聚和耦合的相互作用 30
2.3 耦合的類型 30
2.3.1 領域耦合 31
2.3.2 傳遞耦合 33
2.3.3 公共耦合 36
2.3.4 內容耦合 39
2.4 恰到好處的領域驅動設計 40
2.4.1 通用語言 40
2.4.2 聚合 41
2.4.3 限界上下文 43
2.4.4 將聚合及限界上下文映射到微服務 45
2.4.5 事件風暴 46
2.5 DDD在微服務環境中的應用案例 47
2.6 領域邊界的替代方法 48
2.6.1 易變性 48
2.6.2 數據 49
2.6.3 技術 50
2.6.4 組織 51
2.7 混合模型和例外 53
2.8 小結 53
第3章 拆分大單體 54
3.1 明確目標 54
3.2 增量遷移 55
3.3 單體並不是威脅 55
3.4 先拆分什麽 56
3.5 按層拆分 58
3.5.1 代碼優先 58
3.5.2 數據優先 59
3.6 有用的拆分模式 60
3.6.1 絞殺者模式 60
3.6.2 並行運行模式 61
3.6.3 功能開關模式 61
3.7 拆分數據庫的註意事項 61
3.7.1 性能 61
3.7.2 數據完整性 63
3.7.3 事務 63
3.7.4 工具 64
3.7.5 報表數據庫 64
3.8 小結 65
第4章 微服務間通信模式 66
4.1 從進程內到進程間 66
4.1.1 性能 66
4.1.2 接口變更 67
4.1.3 錯誤處理 67
4.2 進程內的通信技術:選擇眾多 69
4.3 微服務間的通信模式 69
4.4 同步阻塞模式 70
4.4.1 優點 71
4.4.2 缺點 71
4.4.3 適用情況 71
4.5 異步非阻塞模式 73
4.5.1 優點 73
4.5.2 缺點 74
4.5.3 適用情況 75
4.6 共享數據模式 75
4.6.1 實現 75
4.6.2 優點 76
4.6.3 缺點 76
4.6.4 適用情況 77
4.7 請求–響應模式 77
4.7.1 實現:同步與異步 78
4.7.2 適用情況 80
4.8 事件驅動模式 80
4.8.1 實現 82
4.8.2 事件 82
4.8.3 適用情況 85
4.9 謹慎行事 85
4.10 小結 87
第二部分 實現
第5章 實現微服務間通信 91
5.1 尋找理想的技術 91
5.1.1 輕松實現向後兼容 91
5.1.2 明確你的接口 91
5.1.3 保持API的技術中立 92
5.1.4 簡化提供給消費者的服務 92
5.1.5 隱藏內部實現細節 92
5.2 技術選型 92
5.2.1 遠程過程調用 93
5.2.2 REST 96
5.2.3 GraphQL 99
5.2.4 消息代理 101
5.3 序列化格式 104
5.3.1 文本格式 104
5.3.2 二進制格式 105
5.4 模式 105
5.4.1 結構性破壞和語義性破壞 106
5.4.2 是否應該使用模式 106
5.5 處理微服務間的變更 107
5.6 避免破壞性變更 107
5.6.1 擴展式更改 108
5.6.2 兼容的消費者 108
5.6.3 合適的技術 109
5.6.4 顯式接口 109
5.6.5 盡早發現破壞性變更 110
5.7 管理破壞性變更 111
5.7.1 同步部署 111
5.7.2 共存不兼容的微服務版本 111
5.7.3 模擬舊接口 112
5.7.4 推薦的方法 113
5.7.5 社會契約 114
5.7.6 追蹤使用情況 114
5.7.7 極端措施 114
5.8 DRY和微服務架構中的代碼復用風險 115
5.9 服務發現 117
5.9.1 域名系統 117
5.9.2 動態服務註冊 118
5.9.3 不要忘記人類 120
5.10 服務網格和API網關 120
5.10.1 API 網關 121
5.10.2 服務網格 123
5.10.3 其他協議 126
5.11 文檔服務 126
5.11.1 顯式模式 126
5.11.2 自描述系統 127
5.12 小結 129
第6章 工作流 131
6.1 數據庫事務 131
6.1.1 ACID事務 131
6.1.2 還是ACID事務,但缺乏原子性支持嗎 132
6.2 分佈式事務:兩階段提交 134
6.3 分佈式事務:只需說“不” 136
6.4 Saga 137
6.4.1 Saga故障模式 138
6.4.2 實現Saga 142
6.4.3 Saga與分佈式事務 146
6.5 小結 147
第7章 構建 148
7.1 持續集成簡介 148
7.1.1 你真的在實踐持續集成嗎 149
7.1.2 分支模型 149
7.2 構建流水線和持續交付 151
7.2.1 工具 152
7.2.2 權衡與環境 153
7.2.3 構建製品 153
7.3 將源代碼和構建映射到微服務 155
7.3.1 一個巨大的代碼庫,一次巨大的構建 155
7.3.2 多代碼庫 156
7.3.3 單一代碼庫 159
7.3.4 我會使用哪種方式 163
7.4 小結 164
第8章 部署 165
8.1 從邏輯到物理 165
8.1.1 多實例 166
8.1.2 數據庫 167
8.1.3 環境 170
8.2 微服務部署原則 172
8.2.1 隔離執行 172
8.2.2 專註於自動化 175
8.2.3 基礎設施即代碼 176
8.2.4 零停機部署 176
8.2.5 期望狀態管理 177
8.3 部署選項 179
8.3.1 物理機 180
8.3.2 虛擬機 180
8.3.3 容器 182
8.3.4 應用容器 186
8.3.5 平臺即服務(PaaS) 187
8.3.6 函數即服務(FaaS) 188
8.4 哪種部署方式適合你 193
8.5 Kubernetes與容器編排 195
8.5.1 容器編排案例 195
8.5.2 Kubernetes概念的簡化視圖 196
8.5.3 多租戶和聯邦 198
8.5.4 雲原生計算基金會 200
8.5.5 平臺和可移植性 200
8.5.6 Helm、Operator與CRD 201
8.5.7 Knative 201
8.5.8 未來 202
8.5.9 你應該使用它嗎 202
8.6 漸進式交付 203
8.6.1 分離部署與發布 203
8.6.2 漸進式交付 204
8.6.3 功能開關 204
8.6.4 金絲雀發布 204
8.6.5 並行運行 205
8.7 小結 206
第9章 測試 207
9.1 測試類型 207
9.2 測試範圍 209
9.2.1 單元測試 210
9.2.2 服務測試 211
9.2.3 端到端測試 212
9.2.4 權衡 212
9.3 實現服務測試 213
9.3.1 mock還是打樁 213
9.3.2 更智能的打樁服務 214
9.4 微妙的端到端測試 215
9.4.1 脆弱的測試 216
9.4.2 誰來寫測試 217
9.4.3 測試應該運行的時間 218
9.4.4 大量的堆積 219
9.4.5 元版本 219
9.4.6 缺乏獨立可測試性 219
9.5 應該放棄端到端測試嗎 220
9.5.1 契約測試和消費者驅動的契約 220
9.5.2 一點補充 222
9.6 開發者體驗 223
9.7 從預發布環境測試到生產環境測試 223
9.7.1 生產環境測試的類型 224
9.7.2 確保生產環境測試的安全性 224
9.7.3 平均故障間隔時間和平均修復時間的權衡 225
9.8 跨功能測試 225
9.8.1 性能測試 226
9.8.2 健壯性測試 227
9.9 小結 227
第10章 從監控到可觀測性 229
10.1 混亂、恐慌和困惑 229
10.2 單個微服務,單個服務器 230
10.3 單個微服務,多個服務器 231
10.4 多個微服務,多個服務器 232
10.5 可觀測性與監控 233
10.6 構建可觀測性的組件 234
10.6.1 日誌聚合 235
10.6.2 指標聚合 241
10.6.3 分佈式追蹤 243
10.6.4 我們做得如何 245
10.6.5 警報 247
10.6.6 語義監控 250
10.6.7 生產環境測試 251
10.7 標準化 253
10.8 選擇工具 253
10.8.1 大眾化 253
10.8.2 易於集成 253
10.8.3 提供上下文 254
10.8.4 實時性 254
10.8.5 恰如其分 254
10.9 機器專家 255
10.10 起點 255
10.11 小結 256
第11章 安全 258
11.1 核心原則 259
11.1.1 最小權限原則 259
11.1.2 深度防禦 259
11.1.3 自動化 261
11.1.4 在交付過程中構建安全性 261
11.2 五大網絡安全功能 262
11.2.1 身份識別 262
11.2.2 保護 263
11.2.3 檢測 263
11.2.4 響應 263
11.2.5 恢復 264
11.3 應用安全的基礎 264
11.3.1 憑證 264
11.3.2 打補丁 269
11.3.3 備份 271
11.3.4 重建 271
11.4 隱式信任與零信任 272
11.4.1 隱式信任 272
11.4.2 零信任 273
11.4.3 這是個範圍 273
11.5 數據保護 275
11.5.1 傳輸中的數據 275
11.5.2 靜態數據 277
11.6 身份驗證和鑒權 279
11.6.1 服務間驗證 279
11.6.2 用戶的身份驗證 279
11.6.3 常見的單點登錄實現 280
11.6.4 單點登錄網關 281
11.6.5 細粒度鑒權 282
11.6.6 混淆代理人問題 282
11.6.7 中心化上游鑒權 284
11.6.8 去中心化鑒權 284
11.6.9 JWT 284
11.7 小結 287
第12章 彈性 288
12.1 彈性介紹 288
12.1.1 健壯性 289
12.1.2 可恢復性 290
12.1.3 優雅的可擴展性 290
12.1.4 持續適應性 290
12.1.5 代入微服務架構 291
12.2 故障無處不在 291
12.3 多少才算多 292
12.4 功能降級 293
12.5 穩定性模式 293
12.5.1 超時 295
12.5.2 重試 297
12.5.3 艙壁 297
12.5.4 斷路器 298
12.5.5 隔離 300
12.5.6 冗餘 301
12.5.7 中間件 301
12.5.8 冪等 302
12.6 分散風險 303
12.7 CAP定理 304
12.7.1 犧牲一致性 305
12.7.2 犧牲可用性 305
12.7.3 犧牲分區容錯性 306
12.7.4 AP還是CP 306
12.7.5 全部和全不並不是二選一 306
12.7.6 現實世界 307
12.8 混沌工程 307
12.8.1 演練日 308
12.8.2 生產實驗 308
12.8.3 超越健壯性 309
12.9 問責 309
12.10 小結 310
第13章 擴展性 312
13.1 擴展性的4個維度 312
13.1.1 縱向擴容 313
13.1.2 橫向復制 314
13.1.3 數據分區 317
13.1.4 功能拆分 320
13.2 組合模型 322
13.3 從小處著手 323
13.4 緩存 324
13.4.1 用於提高性能 324
13.4.2 用於提高擴展性 325
13.4.3 用於提高健壯性 325
13.4.4 將緩存設置在哪裡 325
13.4.5 讓緩存失效 329
13.4.6 緩存的黃金法則 333
13.4.7 新鮮度與優化程度 333
13.4.8 緩存中毒:一個需要警惕的故事 334
13.5 自動擴展 334
13.6 重新出發 335
13.7 小結 336
第三部分 人和組織
第14章 用戶界面 339
14.1 邁向數字化 339
14.2 集中所有權模型 340
14.3 業務流團隊 342
14.3.1 共享專家 343
14.3.2 確保一致性 343
14.3.3 持續應對技術的挑戰 344
14.4 單體前端模式 345
14.5 微前端模式 346
14.5.1 實施視角 346
14.5.2 應用時機 346
14.6 基於頁面的拆分模式 347
14.7 基於部件的拆分模式 349
14.7.1 實施視角 350
14.7.2 應用時機 352
14.8 約束 353
14.9 中心聚合網關模式 353
14.9.1 歸屬權 355
14.9.2 不同類型的用戶界面 355
14.9.3 熱點問題 356
14.9.4 應用時機 357
14.10 服務於前端的後端模式 357
14.10.1 如何確定BFF的數量 358
14.10.2 BFF如何應對復用問題 361
14.10.3 BFF在桌面Web和更多場景中的應用 363
14.10.4 應用時機 364
14.11 GraphQL 364
14.12 模式的混合應用 366
14.13 小結 366
第15章 組織結構 367
15.1 低耦合組織結構 367
15.2 康威定律 368
15.3 團隊規模 370
15.4 理解康威定律 370
15.5 小團隊,大組織 371
15.6 關註團隊自治 372
15.7 強所有權與集體所有權 373
15.7.1 強所有權 373
15.7.2 集體所有權 374
15.7.3 團隊層面與組織層面 375
15.7.4 模式之間的平衡 375
15.8 賦能團隊 376
15.8.1 實踐社區 377
15.8.2 平臺 378
15.9 共享微服務 380
15.9.1 難以劃分 380
15.9.2 跨領域的變更 380
15.9.3 交付瓶頸 381
15.10 內部開源 381
15.10.1 核心提交者的作用 382
15.10.2 成熟度 382
15.10.3 工具支撐 382
15.11 可插拔式模塊化微服務 382
15.12 孤兒服務 387
15.13 案例研究:Real Estate網站 387
15.14 地域分佈 388
15.15 逆康威定律 389
15.16 人 390
15.17 小結 391
第16章 演進式架構師 392
16.1 名字的意義 392
16.2 什麽是軟件架構 394
16.3 讓改變成為可能 395
16.4 架構師的可演進願景 395
16.5 定義系統邊界 396
16.6 一種社會結構 398
16.7 宜居性 399
16.8 原則方法 400
16.8.1 戰略目標 400
16.8.2 原則 400
16.8.3 實踐 401
16.8.4 原則與實踐相結合 401
16.8.5 一個真實的例子 401
16.9 演進式架構 402
16.10 業務流組織中的架構 403
16.11 組建團隊 405
16.12 必要標準 405
16.12.1 可監控性 405
16.12.2 接口 406
16.12.3 架構安全性 406
16.13 治理並鋪路 406
16.13.1 榜樣的力量 407
16.13.2 定製的微服務模板 407
16.13.3 將鋪好的路規模化 408
16.14 技術債務 408
16.15 異常處理 409
16.16 小結 409
後記:全景概述 411
參考資料 421
術語表 425