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