本書從分布式系統(tǒng)的基礎(chǔ)概念講起,逐步深入分布式系統(tǒng)中間件進階實戰(zhàn),并在最后結(jié)合一個大型項目案例進行講解,重點介紹了使用Spring Cloud框架整合各種分布式組件的過程,讓讀者不但可以系統(tǒng)地學(xué)習(xí)分布式中間件的相關(guān)知識,而且還能對業(yè)務(wù)邏輯的分析思路、實際應(yīng)用開發(fā)有更為深入的理解。
全書共分12章,前3個章節(jié)是學(xué)習(xí)分布式系統(tǒng)架構(gòu)的準(zhǔn)備階段。第1章開篇部分,講解演進過程中分布式系統(tǒng)是如何出現(xiàn)的;第2章Spring部分,講解如何搭建目前流行的Spring Boot和Spring Cloud框架;第3章容器部分,講解目前最流行的Docker容器技術(shù)和Kubernetes容器編排工具;第4章~第8章深入講解消息中間件RocketMQ的相關(guān)知識,理論與實戰(zhàn)并存;第9章將深入RocketMQ底層,探索閱讀源碼的樂趣,掌握精通RocketMQ的同時學(xué)會閱讀源碼的方法;第10章和第11章講解分布式系統(tǒng)中必須考慮的問題:分布式事務(wù)與分布式鎖;第12章以一個電商系統(tǒng)業(yè)務(wù)為例,讓讀者體驗一個項目從無到有的過程,并學(xué)以致用。
本書內(nèi)容由淺入深、結(jié)構(gòu)清晰、實例豐富、通俗易懂、實用性強,適合需要全方位學(xué)習(xí)分布式中間件相關(guān)技術(shù)
的人員,也適合培訓(xùn)學(xué)校作為培訓(xùn)教材,還可作為大、中專院校相關(guān)專業(yè)的教學(xué)參考書。
劉猛,Java架構(gòu)師,目前任職于聯(lián)仁健康JAVA高級工程師,負責(zé)架構(gòu)設(shè)計,包括系統(tǒng)架構(gòu)設(shè)計、前端布局開發(fā)(JS原生或者Vue.js框架均可)、大數(shù)據(jù)可視化開發(fā)(Echarts)、JAVA后臺接口開發(fā)(Spring Cloud框架)、整個項目策劃與交付。曾先后為南京海泰醫(yī)療、北京嘉和美康、北京聯(lián)仁健康、中國移動云設(shè)計項目等。
第1章 走進分布式系統(tǒng) 1
1.1 分布式系統(tǒng)簡介 2
1.1.1 分布式系統(tǒng)的架構(gòu)演變過程 2
1.1.2 分布式系統(tǒng)的特性 6
1.1.3 分布式系統(tǒng)帶來的問題 6
1.2 分布式中間件簡介 7
1.2.1 什么是分布式中間件 7
1.2.2 常用的分布式中間件 8
1.3?小結(jié)?8
第2章 Spring微服務(wù)實戰(zhàn) 9
2.1 Spring Boot實戰(zhàn) 10
2.1.1 什么是Spring Boot 10
2.1.2 創(chuàng)建Spring Boot項目 10
2.1.3 實戰(zhàn):Spring Boot定時訪問數(shù)據(jù)庫 13
2.2 Spring Cloud實戰(zhàn) 18
2.2.1 什么是Spring Cloud 18
2.2.2 從電商系統(tǒng)看Spring Cloud基本架構(gòu) 18
2.2.3 實戰(zhàn):動手搭建Spring Cloud電商項目 22
2.3 小結(jié) 33
第3章 容器技術(shù)簡介 34
3.1 Docker簡介 35
3.1.1 什么是Docker 35
3.1.2 動手安裝Docker環(huán)境 36
3.1.3 Docker鏡像常用命令 37
3.1.4 Docker容器常用命令 39
3.1.5 Dockerfile介紹 42
3.1.6 實戰(zhàn):Docker打包Spring Boot項目 45
3.2 Kubernetes簡介 49
3.2.1 什么是Kubernetes 49
3.2.2 動手搭建Kubernetes集群 51
3.2.3 實戰(zhàn):Kubernetes部署Spring Boot項目 55
3.3 小結(jié) 57
第4章 消息中間件概述 58
4.1 消息中間件簡介 59
4.1.1 同步的概念 59
4.1.2 異步調(diào)用 60
4.1.3 什么是消息中間件 60
4.2 消息中間件的作用 61
4.2.1 異步化提升性能 61
4.2.2 降低耦合度 62
4.2.3 流量削峰 63
4.3 常見的消息中間件 64
4.3.1 ActiveMQ 64
4.3.2 RabbitMQ 65
4.3.3 RocketMQ 66
4.3.4 Kafka 67
4.4 RocketMQ的基本架構(gòu) 69
4.4.1 RocketMQ是如何承受高并發(fā)的 69
4.4.2 RocketMQ如何存儲大量消息數(shù)據(jù) 69
4.4.3 RocketMQ是如何處理宕機的 70
4.4.4 如何知道我該訪問哪個Broker 71
4.5 電商系統(tǒng)面臨的技術(shù)挑戰(zhàn) 72
4.5.1 再談電商系統(tǒng)業(yè)務(wù)流程 72
4.5.2 退款與取消支付流程 74
4.5.3 大數(shù)據(jù)團隊帶來的技術(shù)挑戰(zhàn) 75
4.6 小結(jié) 75
第5章 NameServer 76
5.1 NameServer概述 77
5.2 NameServer與其他組件的交互流程 77
5.2.1 Broker如何向NameServer注冊信息 77
5.2.2 系統(tǒng)如何從NameServer獲取信息 79
5.2.3 NameServer如何感知到Broker宕機 79
5.2.4 系統(tǒng)如何感知到Broker宕機 80
5.3 小結(jié) 81
第6章 RocketMQ的高可用 82
6.1 Broker的主從架構(gòu) 83
6.1.1 Master Broker與Slave Broker之間的消息同步 83
6.1.2 Master Broker與Slave Broker的讀寫分離 83
6.1.3 Master Broker與Slave Broker的宕機處理 84
6.1.4 Dledger實現(xiàn)RocketMQ的高可用 85
6.2 Dledger的自動切換原理 85
6.2.1 使用Dledger技術(shù)替換CommitLog 85
6.2.2 Dledger怎么選舉Leader 86
6.2.3 Dledger的數(shù)據(jù)同步機制 87
6.3 其他消息中間件的高可用 87
6.3.1 RabbitMQ的高可用 88
6.3.2 Kafka的高可用 89
6.4?實戰(zhàn)——部署一個RocketMQ集群?91
6.4.1 單機快速部署 91
6.4.2 使用三臺機器部署NameServer 92
6.4.3 使用三臺機器部署B(yǎng)roker 93
6.4.4 補充說明實踐中的問題 94
6.5 實戰(zhàn)——RocketMQ的可視化監(jiān)控管理 95
6.5.1 部署可視化監(jiān)控工具 95
6.5.2 如何使用控制臺 95
6.6 實戰(zhàn)——RocketMQ的生產(chǎn)環(huán)境參數(shù)調(diào)整 97
6.6.1 OS內(nèi)核參數(shù)調(diào)整 97
6.6.2 JVM參數(shù)調(diào)整 98
6.6.3 RocketMQ參數(shù)調(diào)整 98
6.7 小結(jié) 99
第7章 生產(chǎn)者與消費者 100
7.1 發(fā)送模式與消費模式 101
7.1.1 RocketMQ的發(fā)送模式 101
7.1.2 RocketMQ的消費模式 104
7.2 生產(chǎn)者發(fā)送消息的底層原理 105
7.2.1 什么是MessageQueue 106
7.2.2 生產(chǎn)者發(fā)送消息存入哪個MessageQueue 107
7.2.3 如果Broker發(fā)生故障怎么辦 107
7.3 Broker的持久化 108
7.3.1 CommitLog 108
7.3.2 MessageQueue是如何存儲的 109
7.3.3 寫入CommitLog的性能探索 110
7.3.4 同步刷盤和異步刷盤 110
7.4 消費者獲取消息的底層原理 111
7.4.1 消費者組 111
7.4.2 集群模式和廣播模式 112
7.4.3 MessageQueue與消費者的關(guān)系 113
7.4.4 Push模式和Pull模式 113
7.4.5 Broker如何讀取消息返回給消費者 114
7.5 實戰(zhàn)——使用代碼來操作RocketMQ 115
7.5.1 原生代碼實現(xiàn) 115
7.5.2 Spring Boot實現(xiàn) 116
7.6 實戰(zhàn)——對RocketMQ集群進行壓測 121
7.6.1 壓測的指標(biāo) 122
7.6.2 動手實踐壓測 122
7.7 小結(jié) 126
第8章 RocketMQ的實際問題與解決方案 127
8.1 消息是怎么丟失的 128
8.1.1 引入訂單業(yè)務(wù) 128
8.1.2 訂單系統(tǒng)推送消息過程中會丟失消息嗎 129
8.1.3 MQ接收到消息后,自己會把消息弄丟嗎 129
8.1.4 積分系統(tǒng)消費到了消息就能保證消息的不丟失了嗎 130
8.2 RocketMQ消息丟失解決方案:事務(wù)消息 131
8.2.1 half消息機制 131
8.2.2 half消息的流程分析 132
8.3 RocketMQ消息丟失解決方案:同步刷盤+手動提交 134
8.3.1 Broker的消息丟失解決方案 135
8.3.2 Consumer的消息丟失解決方案 135
8.3.3 消息零丟失方案的優(yōu)缺點分析 136
8.4 探索RocketMQ的重復(fù)消費和亂序問題 136
8.4.1 為什么會重復(fù)消費 137
8.4.2 消息重試、延時消息、死信隊列 138
8.4.3 消息亂序 139
8.5 實戰(zhàn):RocketMQ高級功能代碼實現(xiàn) 140
8.5.1 事務(wù)消息代碼實現(xiàn) 140
8.5.2 順序消息代碼實現(xiàn) 145
8.5.3 消息過濾代碼實現(xiàn) 149
8.5.4 延時消息代碼實現(xiàn) 150
8.6 小結(jié) 152
第9章 走進RocketMQ底層 153
9.1 開啟源碼閱讀之路 154
9.1.1 RocketMQ源碼結(jié)構(gòu)介紹 154
9.1.2 啟動NameServer與Broker 156
9.1.3 測試生產(chǎn)消息和消費消息 159
9.2 NameServer源碼解析 160
9.2.1 NameServer的啟動與配置的加載 160
9.2.2 NameServer網(wǎng)絡(luò)通信的初始化 166
9.2.3 NameServer中Netty是如何啟動的 168
9.3 Broker源碼解析 173
9.3.1 Broker的啟動 173
9.3.2 BrokerController的創(chuàng)建與初始化 177
9.3.3 Broker如何向NameServer注冊 188
9.3.4 NameServer如何接收Broker的請求 198
9.4 Producer與Consumer源碼解析 205
9.4.1 Producer與NameServer的通信 205
9.4.2 Producer與Broker的通信 207
9.4.3 Broker的同步刷盤與異步刷盤 211
9.4.4 Consumer的創(chuàng)建與啟動 213
9.5 小結(jié) 215
第10章 分布式事務(wù) 216
10.1 ACID與隔離級別 217
10.1.1 事務(wù)的ACID 217
10.1.2 事務(wù)的隔離級別 218
10.1.3 MySQL是如何實現(xiàn)可重復(fù)讀的 218
10.2 業(yè)內(nèi)分布式事務(wù)方案介紹 219
10.2.1 CAP理論與BASE理論 219
10.2.2 XA規(guī)范與2PC/3PC分布式事務(wù) 220
10.2.3 TCC分布式方案 222
10.2.4 可靠消息最終一致性方案 223
10.3 實戰(zhàn):分布式事務(wù)框架Seata 224
10.3.1 Seata原理介紹 224
10.3.2 Seata Server的部署 224
10.3.3 Seata的代碼實現(xiàn) 226
10.4 小結(jié) 227
第11章 分布式鎖 228
11.1 分布式鎖簡介 229
11.1.1 單機系統(tǒng)下的鎖 229
11.1.2 分布式鎖 229
11.2 Zookeeper實現(xiàn)分布式鎖 230
11.2.1 Zookeeper實現(xiàn)分布式鎖的原理 230
11.2.2 實戰(zhàn):使用Curator實現(xiàn)分布式鎖 231
11.3 Redis實現(xiàn)分布式鎖 233
11.3.1 Redis實現(xiàn)分布式鎖的原理 233
11.3.2 實戰(zhàn):使用Redisson實現(xiàn)分布式鎖 234
11.4 小結(jié) 236
第12章 電商網(wǎng)站系統(tǒng)案例實戰(zhàn) 237
12.1 項目業(yè)務(wù)分析 238
12.1.1 下單業(yè)務(wù) 238
12.1.2 支付業(yè)務(wù) 238
12.2 基礎(chǔ)技術(shù)架構(gòu)與表結(jié)構(gòu)設(shè)計 240
12.2.1 技術(shù)選型 240
12.2.2 Spring Cloud Alibaba框架搭建 240
12.2.3 數(shù)據(jù)庫表結(jié)構(gòu)設(shè)計 249
12.3 下單業(yè)務(wù)開發(fā) 252
12.3.1 下單接口定義 252
12.3.2 下單接口實現(xiàn)類定義 255
12.3.3 注冊中心Nacos搭建 258
12.3.4 引入Dubbo框架 260
12.3.5 訂單接口實現(xiàn)類開發(fā) 264
12.3.6 使用RocketMQ實現(xiàn)失敗補償機制 272
12.4 支付業(yè)務(wù)開發(fā) 278
12.4.1 支付接口定義 278
12.4.2 創(chuàng)建支付訂單 278
12.4.3 支付回調(diào)接口 279
12.4.4 消息的消費 281
12.5 網(wǎng)關(guān)服務(wù)的完善 282
12.5.1 網(wǎng)關(guān)服務(wù)的搭建 282
12.5.2 測試網(wǎng)關(guān)服務(wù) 284
12.6 小結(jié) 285