本書從軟件結(jié)構(gòu)的發(fā)展歷史入手,通過一個(gè)簡(jiǎn)單的例子,描述了分布式架構(gòu)的特性和存在的問題,并圍繞這些問題展開了分析和實(shí)踐。書中從為什么、是什么、怎么辦這三個(gè)方面,分別講解了分布式應(yīng)用服務(wù)的拆分、分布式調(diào)用、分布式協(xié)同、分布式計(jì)算、分布式存儲(chǔ)、分布式資源管理和調(diào)度、高性能與可用性以及指標(biāo)與監(jiān)控等內(nèi)容,基本涵蓋了分布式技術(shù)的要點(diǎn)。讀者既可以按照邏輯聯(lián)系從前往后看,也可以只閱讀感興趣的章節(jié)。
1.3 年持續(xù)打磨,總結(jié) 20 年架構(gòu)經(jīng)驗(yàn),全網(wǎng)閱讀量60萬+;
2.內(nèi)容涉及拆分、調(diào)用、協(xié)同、計(jì)算、存儲(chǔ)、調(diào)度、Gao性能和可用性、指標(biāo)與監(jiān)控等;
3.按照“為什么→ 是什么 → 怎么辦”的思路介紹;
4.圖文并茂,全書包含300多張圖片。
崔皓
資深架構(gòu)師,10 年分布式架構(gòu)經(jīng)驗(yàn)。曾任惠普技術(shù)專家。樂于分享,撰寫了很多熱門技術(shù)文章,閱讀量超過 60 萬。
第 1章 分布式架構(gòu)設(shè)計(jì)的特征與問題 1
1.1 架構(gòu)設(shè)計(jì)的演進(jìn)過程 1
1.1.1 應(yīng)用與數(shù)據(jù)一體模式 1
1.1.2 應(yīng)用與數(shù)據(jù)分離模式 2
1.1.3 緩存與性能的提升 3
1.1.4 服務(wù)器集群處理并發(fā) 4
1.1.5 數(shù)據(jù)庫讀寫分離 5
1.1.6 反向代理和CDN 6
1.1.7 分布式數(shù)據(jù)庫與分表分庫 9
1.1.8 業(yè)務(wù)拆分 10
1.1.9 分布式與微服務(wù) 11
1.2 一個(gè)簡(jiǎn)單的例子:分布式架構(gòu)的組成 13
1.2.1 架構(gòu)概述與分層 13
1.2.2 客戶端與CDN 15
1.2.3 接入層 16
1.2.4 應(yīng)用層 17
1.2.5 存儲(chǔ)層 23
1.3 分布式架構(gòu)的特征 26
1.4 分布式架構(gòu)的問題 27
1.4.1 分布式架構(gòu)的邏輯結(jié)構(gòu)圖 27
1.4.2 應(yīng)用服務(wù)拆分 28
1.4.3 分布式調(diào)用 29
1.4.4 分布式協(xié)同 29
1.4.5 分布式計(jì)算 30
1.4.6 分布式存儲(chǔ) 30
1.4.7 分布式資源管理與調(diào)度 31
1.4.8 高性能與可用性 31
1.4.9 指標(biāo)與監(jiān)控 31
1.5 本書的閱讀方式 32
1.6 總結(jié) 33
第 2章 分布式應(yīng)用服務(wù)的拆分 34
2.1 起因與概念 34
2.2 拆分思路 36
2.3 模型結(jié)構(gòu) 38
2.3.1 通用語言 38
2.3.2 領(lǐng)域、子域和限界上下文 39
2.3.3 實(shí)體和值類型 41
2.3.4 聚合和聚合根 45
2.3.5 領(lǐng)域事件 46
2.4 分析業(yè)務(wù)需求形成應(yīng)用服務(wù) 48
2.4.1 分析業(yè)務(wù)流程 49
2.4.2 抽取領(lǐng)域?qū)ο蠛蜕删酆稀?1
2.4.3 劃定限界上下文 53
2.5 領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)分層 54
2.5.1 分層的概述與原則 54
2.5.2 分層的內(nèi)容 56
2.5.3 分層的總結(jié) 57
2.5.4 服務(wù)內(nèi)部的分層調(diào)用與服務(wù)間的調(diào)用 58
2.5.5 把分層映射到代碼結(jié)構(gòu) 60
2.5.6 代碼分層示例 65
2.6 總結(jié) 70
第3章 分布式調(diào)用 71
3.1 負(fù)載均衡 71
3.1.1 負(fù)載均衡分類 72
3.1.2 負(fù)載均衡算法 83
3.2 API 網(wǎng)關(guān) 85
3.2.1 API 網(wǎng)關(guān)的定義 85
3.2.2 API 網(wǎng)關(guān)的服務(wù)定位 87
3.2.3 API 網(wǎng)關(guān)的技術(shù)原理 88
3.3 服務(wù)注冊(cè)與發(fā)現(xiàn) 90
3.3.1 服務(wù)注冊(cè)與發(fā)現(xiàn)的概念和原理 91
3.3.2 服務(wù)注冊(cè)中心的可用性 92
3.3.3 服務(wù)注冊(cè)中心的服務(wù)保存 92
3.4 服務(wù)間的遠(yuǎn)程調(diào)用 92
3.4.1 RPC 調(diào)用過程 93
3.4.2 RPC 動(dòng)態(tài)代理 94
3.4.3 RPC 序列化 97
3.4.4 協(xié)議編碼 98
3.4.5 網(wǎng)絡(luò)傳輸 99
3.4.6 Netty 實(shí)現(xiàn) RPC 104
3.5 總結(jié) 116
第4章 分布式協(xié)同 117
4.1 分布式系統(tǒng)的特性與互斥問題 117
4.1.1 集中互斥算法 118
4.1.2 基于許可的互斥算法 120
4.1.3 令牌環(huán)互斥算法 122
4.2 分布式鎖 124
4.2.1 分布式鎖的由來和定義 125
4.2.2 通過Redis緩存實(shí)現(xiàn)分布式鎖 126
4.2.3 通過ZooKeeper 實(shí)現(xiàn)分布式鎖 129
4.2.4 分布式分段加鎖 132
4.3 分布式事務(wù) 133
4.3.1 ACID 理論 134
4.3.2 CAP 理論 135
4.3.3 BASE 理論 137
4.3.4 DTP 模型 139
4.3.5 分布式事務(wù) 2PC 解決方案 141
4.3.6 分布式事務(wù) TCC 解決方案 143
4.4 分布式選舉 146
4.4.1 Bully 算法 147
4.4.2 Raft 算法 150
4.4.3 ZAB 算法 154
4.5 ZooKeeper——分布式系統(tǒng)的實(shí)踐 157
4.5.1 從一個(gè)簡(jiǎn)單的例子開始 157
4.5.2 Znode 的原理與使用 158
4.5.3 Watcher 原理與使用 159
4.5.4 Version 的原理與使用 162
4.5.5 會(huì)話的原理與使用 164
4.5.6 服務(wù)群組 166
4.6 總結(jié) 169
第5章 分布式計(jì)算 171
5.1 MapReduce 模式 171
5.1.1 MapReduce 的策略和理念 171
5.1.2 MapReduce 的體系結(jié)構(gòu) 173
5.1.3 MapReduce 的工作流程 175
5.1.4 MapReduce 的應(yīng)用實(shí)例 178
5.2 Stream 模式 180
5.2.1 Stream 模式的處理過程及特點(diǎn) 181
5.2.2 Storm 的體系結(jié)構(gòu)與工作原理 182
5.2.3 Storm 的并發(fā)機(jī)制 185
5.2.4 Stream Grouping 188
5.2.5 Storm 集群架構(gòu) 191
5.3 總結(jié) 193
第6章 分布式存儲(chǔ) 195
6.1 數(shù)據(jù)存儲(chǔ)面臨的問題以及解決思路 195
6.1.1 RAID 磁盤陣列 196
6.1.2 分布式存儲(chǔ)的組成要素 199
6.2 分布式數(shù)據(jù)庫 200
6.2.1 分表分庫 200
6.2.2 主從復(fù)制 205
6.2.3 數(shù)據(jù)擴(kuò)容 213
6.3 分布式緩存 216
6.3.1 緩存分片算法 217
6.3.2 Redis 集群方案 221
6.3.3 緩存節(jié)點(diǎn)之間的通信 222
6.3.4 請(qǐng)求分布式緩存的路由 223
6.3.5 緩存節(jié)點(diǎn)的擴(kuò)展和收縮 226
6.3.6 緩存故障的發(fā)現(xiàn)和恢復(fù) 228
6.4 總結(jié) 230
第7章 分布式資源管理和調(diào)度 231
7.1 分布式資源調(diào)度的由來與過程 231
7.1.1 資源調(diào)度可以解決什么問題 232
7.1.2 資源調(diào)度過程 234
7.2 資源劃分和調(diào)度策略 237
7.2.1 Linux Container 資源是如何劃分的 237
7.2.2 任務(wù)與資源如何匹配 244
7.3 分布式調(diào)度架構(gòu) 249
7.3.1 中央式調(diào)度器 250
7.3.2 兩級(jí)調(diào)度器 253
7.3.3 共享狀態(tài)調(diào)度器 259
7.4 Kubernetes——資源調(diào)度的實(shí)踐 262
7.4.1 Kubernetes 架構(gòu)概述 263
7.4.2 從一個(gè)例子開始 264
7.4.3 kubectl 和 API Server 264
7.4.4 controller manager、Scheduler 和 kubelet 268
7.4.5 Service 和 kubelet 271
7.5 總結(jié) 277
第8章 高性能與可用性 278
8.1 緩存的應(yīng)用 278
8.1.1 處處皆緩存 279
8.1.2 動(dòng)靜分離 280
8.1.3 HTTP 緩存 284
8.1.4 CDN 緩存 288
8.1.5 DNS 結(jié)構(gòu)與訪問流程 289
8.1.6 負(fù)載均衡實(shí)現(xiàn)動(dòng)態(tài)緩存 292
8.1.7 進(jìn)程內(nèi)緩存 296
8.1.8 分布式進(jìn)程緩存 304
8.2 可用性 306
8.2.1 請(qǐng)求限流 306
8.2.2 服務(wù)降級(jí) 314
8.2.3 服務(wù)熔斷 319
8.3 總結(jié) 328
第9章 指標(biāo)與監(jiān)控 329
9.1 為什么需要監(jiān)控系統(tǒng) 329
9.2 監(jiān)控系統(tǒng)的指標(biāo) 330
9.3 創(chuàng)建監(jiān)控系統(tǒng)的步驟 332
9.4 監(jiān)控系統(tǒng)的分類 333
9.4.1 日志類監(jiān)控 333
9.4.2 調(diào)用鏈監(jiān)控 339
9.4.3 度量類監(jiān)控:LSM Tree 和 LevelDB 350
9.5 監(jiān)控系統(tǒng)的分層 355
9.6 Zabbix 實(shí)現(xiàn)監(jiān)控系統(tǒng) 356
9.6.1 Zabbix 構(gòu)建監(jiān)控系統(tǒng)過程 357
9.6.2 Zabbix 架構(gòu)的安裝和配置 358
9.6.3 Zabbix 監(jiān)控方式 364
9.7 Prometheus 實(shí)現(xiàn)監(jiān)控系統(tǒng) 369
9.7.1 Prometheus 系統(tǒng)架構(gòu) 369
9.7.2 時(shí)間序列與 Metric 數(shù)據(jù)模型 370
9.7.3 Exporter 采集數(shù)據(jù)與服務(wù)發(fā)現(xiàn) 372
9.7.4 報(bào)警規(guī)則的定義和報(bào)警路由的分發(fā) 374
9.8 總結(jié) 378
第 10章 架構(gòu)設(shè)計(jì)思路和要點(diǎn) 379
10.1 架構(gòu)設(shè)計(jì)思維方式 379
10.1.1 架構(gòu)師的設(shè)計(jì)模型 379
10.1.2 過程設(shè)計(jì)模型 383
10.1.3 協(xié)作式設(shè)計(jì)模型 386
10.1.4 擴(kuò)展立方設(shè)計(jì)模型 389
10.2 重構(gòu)與測(cè)試 391
10.2.1 代碼重構(gòu) 391
10.2.2 性能測(cè)試與壓力測(cè)試 395
10.3 學(xué)習(xí)與發(fā)展 401
10.3.1 思維方式 401
10.3.2 學(xué)習(xí)提升 402
10.3.3 職業(yè)發(fā)展 403
10.4 總結(jié) 405