分佈式系統實戰派 — 從簡單系統到復雜系統

張偉洋

  • 出版商: 電子工業
  • 出版日期: 2024-11-01
  • 定價: $648
  • 售價: 8.5$551
  • 語言: 簡體中文
  • 頁數: 392
  • ISBN: 7121490439
  • ISBN-13: 9787121490439
  • 下單後立即進貨 (約4週~6週)

買這商品的人也買了...

相關主題

商品描述

許多開發者掌握了Java、Spring Boot和MySQL等基礎知識後,能夠搭建一個簡單的單體系統,但面對復雜系統的構建和管理時,往往感到迷茫和力不從心:對於高性能、高可用、高並發的分佈式系統一頭霧水,束手無策。本書首先介紹從單體架構到微服務架構的演化過程,幫助讀者開闊技術視野。然後帶領讀者擺脫單體架構的束縛,深入領略集群、主從架構、分庫分表、讀寫分離、微服務、API網關、NoSQL數據庫、HDFS、分佈式事務等分佈式技術的無限魅力。此外,本書深入剖析瞭如何運用Kafka、RabbitMQ、RocketMQ等消息中間件和Elasticsearch搜索引擎來解耦應用,如何利用Docker、Kubernetes快速部署與隔離應用,以及如何借助冗餘備份、高可用和異地多活策略保障系統穩定運行,讓系統煥發新生。最後通過“支持5000萬用戶同時在線的短視頻系統設計”和“日均訂單量8000萬的外賣系統設計”兩個實際項目將理論與實踐結合,向讀者展示如何將這些技術應用於真實的生產環境中,提升實際項目中的技術能力。本書適合已經掌握Java、Spring Boot、MySQL等知識,能夠開發一個簡單的後端應用,卻在單體系統的束縛中力不從心、對後續的技術學習感到迷茫、對復雜系統不知所措、迫切期待實現技術飛躍的讀者。本書為他們提供了從簡單到復雜的技術成長路徑和解決方案。

目錄大綱

第1篇 後端體系架構認知
-
第1章 從單體架構到微服務架構的演變過程 2
▲1.1 什麽是單體架構 2
1.1.1 一張圖看懂單體架構 2
1.1.2 單體架構的優、缺點 3
▲1.2 從單體架構到集群架構——多台機器協同工作 5
1.2.1 一張圖看懂集群架構 5
1.2.2 擴展系統——水平擴展和垂直擴展 6
1.2.3 動態調整集群規模——彈性伸縮 7
1.2.4 實現故障轉移——借助心跳檢測 8
1.2.5 數據庫讀寫分離——提高系統性能 11
1.2.6 分佈式數據庫與分庫分表——將大數據拆為小數據 12
▲1.3 從集群架構到微服務架構——精細拆分業務 14
1.3.1 一張圖看懂微服務架構 14
1.3.2 微服務架構的核心特性 16
1.3.3 微服務架構與單體架構的區別 17
1.3.4 為什麽企業選擇微服務架構 18
1.3.5 微服務架構的基本組件 19
1.3.6 設計微服務架構需要考慮的關鍵點 20
▲1.4 微服務架構與分佈式架構 21
1.4.1 一張圖看懂分佈式架構與微服務架構 22
1.4.2 什麽是分佈式架構 23
1.4.3 微服務架構與分佈式架構的區別 23
1.4.4 在分佈式系統中微服務是如何工作的 25
▲1.5 從單體架構到微服務架構的遷移——讓系統更穩定 27
1.5.1 遷移到微服務架構需要考慮的因素 28
1.5.2 遷移到微服務架構的步驟 29
-
第2章 幾張圖瞭解後端系統 31
▲2.1 一張圖看懂整個後端系統架構 31
2.1.1 CDN(內容分發網絡) 32
2.1.2 負載均衡器 33
2.1.3 API網關 35
2.1.4 分佈式數據庫集群 38
2.1.5 分佈式消息集群 40
2.1.6 分佈式緩存集群 41
2.1.7 分佈式文件集群 44
2.1.8 分佈式搜索集群 46
2.1.9 服務配置與管理 48
2.1.10 服務註冊與發現 49
2.1.11 服務治理與監控 51
2.1.12 服務追蹤 52
▲2.2 一張圖看懂分佈式架構的組成 53
▲2.3 一張圖看懂本書的核心內容 55
-
第3章 微服務間的交互 60
▲3.1 為何微服務間需要交互 60
3.1.1 對比單體應用與微服務應用的交互模式 60
3.1.2 在電商系統中,用戶下單業務的服務交互流程 63
3.1.3 【實戰】基於Spring Cloud實現服務之間的交互 64
▲3.2 微服務間的通信方式——同步通信與異步通信 71
3.2.1 什麽是同步通信 71
3.2.2 同步通信在電商系統中的痛點 72
3.2.3 【實戰】基於Spring Cloud實現簡單的同步通信 73
3.2.4 什麽是異步通信 75
3.2.5 異步通信的實現方式1——消息隊列 77
3.2.6 異步通信的實現方式2——事件驅動 78
3.2.7 【實戰】基於Spring Boot實現異步通信 79
▲3.3 服務間的通信協議——從HTTP到gRPC 82
3.3.1 HTTP、REST和RESTful流行的主要原因 83
3.3.2 RESTful設計的痛點及解決辦法 84
3.3.3 【實戰】基於Spring Boot搭建一個RESTful產品信息服務 85
3.3.4 為何越來越多企業選擇gRPC 87
3.3.5 gRPC在電商系統中的應用 88
3.3.6 對比gRPC與HTTP 88
3.3.7 【實戰】從零搭建gRPC服務 89
-
第2篇 分佈式技術專項
-
第4章 分佈式系統的通信機制 96
▲4.1 分佈式系統組件之間是如何通信的 96
4.1.1 RPC的工作原理 96
4.1.2 【實戰】基於RPC遠程獲取用戶信息 97
4.1.3 消息傳遞的工作原理 98
4.1.4 【實戰】使用RabbitMQ進行消息傳遞 98
4.1.5 Socket網絡通信的工作原理 100
4.1.6 Socket網絡通信在電商系統中的應用 102
4.1.7 【實戰】基於Socket實現網絡通信 102
▲4.2 分佈式系統中的時鐘、事件與一致性 104
4.2.1 物理時鐘與邏輯時鐘 105
4.2.2 邏輯時鐘的代表Lamport時鐘——事件排序工具 106
4.2.3 【實戰】使用Lamport時鐘對事件進行排序 107
4.2.4 【實戰】使用Vector時鐘跟蹤事件因果關系 111
▲4.3 CAP定理——三者不可兼得 114
4.3.1 CAP定理基礎 114
4.3.2 網絡分區 115
4.3.3 CAP定理在電商系統中的應用 116
4.3.4 高並發系統中一致性與可用性的權衡 119
4.3.5 提高高並發系統可用性的策略 121
-
第5章 分佈式數據庫 122
▲5.1 分佈式存儲的原理 122
5.1.1 一張圖看清分佈式存儲與傳統存儲的區別 122
5.1.2 數據分片與數據副本——分散讀寫負載 123
5.1.3 一致性哈希算法——定位數據所在的節點 125
5.1.4 【實戰】在電商系統中使用一致性哈希算法 127
5.1.5 數據恢復與自動故障轉移——節點出現故障時的處理方案 130
▲5.2 分佈式關系數據庫 130
5.2.1 分佈式關系數據庫的優缺點 131
5.2.2 【實戰】對電商系統進行分庫分表 131
5.2.3 主從復制的工作原理 134
5.2.4 【實戰】配置主從復制 135
5.2.5 在數據增長時無縫擴容數據庫 138
▲5.3 分佈式NoSQL數據庫 139
5.3.1 主流的NoSQL數據庫 140
5.3.2 MongoDB基礎 140
5.3.3 【實戰】操作MongoDB中的商品信息 142
5.3.4 Redis基礎 143
5.3.5 【實戰】使用Redis緩存和檢索用戶的瀏覽歷史 145
5.3.6 Cassandra基礎 147
5.3.7 【實戰】使用Cassandra存儲和分析溫度傳感器數據 149
5.3.8 NoSQL的查詢優化 150
▲5.4 防範常見的數據庫安全問題 156
5.4.1 未授權訪問 156
5.4.2 數據泄露 157
5.4.3 SQL註入攻擊 157
▲5.5 分佈式數據庫的數據遷移 158
5.5.1 數據遷移的流程 158
5.5.2 數據遷移的常見問題及解決方法 159
5.5.3 【實戰】將MySQL中的訂單表數據遷移到MongoDB 162

-
第6章 典型的分佈式存儲系統 165
▲6.1 HDFS——Hadoop分佈式文件系統 165
6.1.1 HDFS的架構 165
6.1.2 HDFS數據的存儲與復制 168
6.1.3 HDFS中的數據讀取/寫入流程 169
6.1.4 【實戰】使用HDFS 170
6.1.5 【實戰】使用命令行操作HDFS文件 172
6.1.6 HDFS如何確保數據的高可用性 175
▲6.2 HBase——分佈式列式存儲數據庫 176
6.2.1 HBase與傳統關系數據庫的區別 176
6.2.2 HBase的數據模型及架構 177
6.2.3 HBase的存儲原理 180
6.2.4 HBase的高可用機制與故障恢復機制 182
6.2.5 【實戰】部署HBase 183
6.2.6 【實戰】使用命令行操作HBase表數據 185
6.2.7 【實戰】優化HBase的性能 187
▲6.3 Elasticsearch——分佈式實時搜索和分析引擎 194
6.3.1 Elasticsearch的基本概念 194
6.3.2 Elasticsearch存儲海量數據的原理——分片和副本 195
6.3.3 Elasticsearch的集群架構和文檔的讀寫原理 196
6.3.4 【實戰】搭建Elasticsearch高性能搜索引擎 198
6.3.5 【實戰】使用Elasticsearch索引與查詢商品數據 200
6.3.6 【實戰】使用Elasticsearch分析用戶購買行為 201
6.3.7 【實戰】使用Elasticsearch實時排名熱門商品 203
6.3.8 Elasticsearch是如何管理JVM堆內存的 204
6.3.9 通過緩存提高Elasticsearch的查詢效率 205
6.3.10 【實戰】使用Kibana可視化查詢Elasticsearch數據 207
6.3.11 【實戰】使用Head監控Elasticsearch集群 209
6.3.12 【實戰】使用Java遠程操作Elasticsearch員工信息 212
-
第7章 分佈式事務——確保分佈式系統中的數據一致性 218
▲7.1 什麽是分佈式事務 218
7.1.1 三張圖看懂分佈式事務 218
7.1.2 分佈式事務面臨的挑戰及應對策略 220
▲7.2 分佈式事務的提交機制——兩階段提交與三階段提交 221
7.2.1 兩階段提交的工作原理 221
7.2.2 兩階段提交帶來的問題——死鎖和性能瓶頸 222
7.2.3 三階段提交的工作原理 223
7.2.4 對比三階段提交與兩階段提交 224
▲7.3 Saga模式——長事務的解決方案 225
7.3.1 一張圖看懂Saga模式 225
7.3.2 在電商系統中實現Saga模式 226
7.3.3 【實戰】確保Saga模式下的數據一致性 228
▲7.4 分佈式事務的其他解決方案 232
7.4.1 TCC模式——解決復雜業務中跨表和跨庫資源鎖定問題 232
7.4.2 最大努力通知模式——確保數據的最終一致性 235
7.4.3 可靠消息最終一致性策略——確保接收消息的可靠性 237
▲7.5 分佈式事務的企業級應用 238
7.5.1 亞馬遜、谷歌、阿裡巴巴如何處理分佈式事務 238
7.5.2 阿裡巴巴Seata框架的工作原理 239
▲7.6 分佈式鎖——解決分佈式系統中的並發控制問題 241
7.6.1 ZooKeeper的集群架構和數據模型 241
7.6.2 ZooKeeper的觀察者模式 243
7.6.3 分佈式鎖的實現方式及工作原理 244
7.6.4 【實戰】利用ZooKeeper實現分佈式鎖 245
-
第8章 消息中間件——分佈式系統中的異步通信利器 248
▲8.1 為什麽需要消息中間件 248
8.1.1 一張圖看懂消息中間件 248
8.1.2 【實戰】解決分佈式系統中的通信、解耦、流量調節問題 249
▲8.2 Kafka——分佈式流處理中間件 254
8.2.1 利用“放雞蛋”的例子快速瞭解Kafka 254
8.2.2 Kafka的集群架構 255
8.2.3 Kafka處理海量消息的原理 256
8.2.4 【實戰】構建一個分佈式、高性能的Kafka集群 258
▲8.3 RabbitMQ——高可用的消息隊列系統 260
8.3.1 RabbitMQ的工作原理 260
8.3.2 RabbitMQ在電商系統中的應用 262
8.3.3 【實戰】使用RabbitMQ實現電商系統的用戶通知功能 263
▲8.4 RocketMQ——低延遲、高可靠性的分佈式消息中間件 265
8.4.1 RocketMQ消息通信模式1——發布/訂閱模式 265
8.4.2 【實戰】使用RocketMQ實現用戶行為分析 266
8.4.3 RocketMQ消息通信模式2——點對點模式 268
8.4.4 【實戰】使用RocketMQ實現物流跟蹤 269
▲8.5 根據業務需求選擇合適的消息中間件 271
▲8.6 在微服務中利用消息中間件實現事件驅動 273
▲8.7 在分佈式存儲和計算中使用消息中間件 274
8.7.1 【實戰】進行分佈式系統的數據同步和復制 274
8.7.2 【實戰】用消息中間件和日誌收集工具進行日誌處理 275
8.7.3 【實戰】構建一個搜索引擎用戶行為分析系統 278
-
第3篇 高可用與數據安全策略
-
第9章 冗餘備份——數據的備份和容災策略 284
▲9.1 兩張圖看懂冗餘備份 284
▲9.2 選擇合適的冗餘備份策略 286
9.2.1 【實戰】熱備、冷備和溫備在電商系統中的應用 286
9.2.2 【實戰】通過數據冗餘和應用冗餘應對流量激增 291
9.2.3 【實戰】利用RAID技術實現磁盤冗餘,提高數據可靠性 293
9.2.4 【實戰】基於AWS S3服務實現跨地域的冗餘備份 295
▲9.3 在生產環境中進行冗餘備份 296
9.3.1 【實戰】在大規模數據中心中實施冗餘備份 296
9.3.2 【實戰】在雲存儲環境中實施備份技術 298
9.3.3 【實戰】在系統故障時利用備份數據進行快速恢復 300
-
第10章 高可用與異地多活——提高系統的穩定性和故障恢復能力 302
▲10.1 一張圖看懂高可用 302
▲10.2 設計一個高可用架構 303
10.2.1 識別和加固單點故障點 303
10.2.2 【實戰】通過添加冗餘組件來提高系統的可用性 305
10.2.3 【實戰】在高並發場景下,使用“限流”防止系統崩潰 306
10.2.4 【實戰】在高並發場景下,使用“熔斷”防止服務雪崩 316
10.2.5 【實戰】在高並發場景下,使用“降級”應對性能瓶頸 319
▲10.3 利用容器化技術部署和管理項目 323
10.3.1 什麽是Docker 323
10.3.2 【實戰】利用Docker快速部署電商系統的商品服務 324
10.3.3 什麽是Kubernetes 325
10.3.4 在項目開發中,何時用Docker,何時用Kubernetes 327
10.3.5 【實戰】利用Kubernetes管理電商系統的各個服務 328
▲10.4 【實戰】大型在線游戲的高可用策略 330
10.4.1 負載均衡與集群化 330
10.4.2 數據冗餘與備份 330
10.4.3 容災與故障恢復 331
10.4.4 無縫更新與維護 331
▲10.5 異地多活——多地區數據中心的部署策略 334
10.5.1 一張圖看懂異地多活 334
10.5.2 異地多活與高可用、容災的關系 337
-
第4篇 分佈式系統項目設計
-
第11章 【項目實戰】支持5000萬用戶同時在線的短視頻系統設計 340
▲11.1 業務分析 340
11.1.1 需求分析 340
11.1.2 業務流程分析 341
▲11.2 架構設計 341
▲11.3 存儲設計 343
11.3.1 使用MySQL存儲視頻元數據 343
11.3.2 使用MongoDB存儲視頻標簽數據 344
11.3.3 使用Redis存儲視頻緩存數據 345
11.3.4 使用Elasticsearch存儲視頻索引數據 346
11.3.5 實現MySQL與Elasticsearch的數據同步 350
11.3.6 使用HBase和HDFS存儲視頻文件 352
▲11.4 利用CDN提升視頻訪問速度 354
▲11.5 利用編碼技術優化視頻帶寬 355
▲11.6 視頻個性化推薦設計 356
11.6.1 數據收集與預處理 357
11.6.2 特徵提取與用戶畫像構建 358
-
第12章 【項目實戰】日均訂單量8000萬的外賣系統設計 363
▲12.1 業務需求 363
▲12.2 微服務架構設計 364
▲12.3 數據庫選擇與設計 365
▲12.4 緩存設計 366
12.4.1 使用Redis和Memcached緩存數據 366
12.4.2 構建外賣系統的緩存架構 368
▲12.5 外賣員派單系統設計 369
12.5.1 實時更新外賣員的地理位置 369
12.5.2 設計外賣員派單算法 372