许多开发者掌握了Java、Spring Boot和MySQL等基础知识后,能够搭建一个简单的单体系统,但面对复杂系统的构建和管理时,往往感到迷茫和力不从心:对于高性能、高可用、高并发的分布式系统一头雾水,束手无策。本书首先介绍从单体架构到微服务架构的演化过程,帮助读者开阔技术视野。然后带领读者摆脱单体架构的束缚,深入领略集群、主从架构、分库分表、读写分离、微服务、API网关、NoSQL数据库、HDFS、分布式事务等分布式技术的无限魅力。此外,本书深入剖析了如何运用Kafka、RabbitMQ、RocketMQ等消息中间件和Elasticsearch搜索引擎来解耦应用,如何利用Docker、Kubernetes快速部署与隔离应用,以及如何借助冗余备份、高可用和异地多活策略保障系统稳定运行,让系统焕发新生。最后通过“支持5000万用户同时在线的短视频系统设计”和“日均订单量8000万的外卖系统设计”两个实际项目将理论与实践结合,向读者展示如何将这些技术应用于真实的生产环境中,提升实际项目中的技术能力。本书适合已经掌握Java、Spring Boot、MySQL等知识,能够开发一个简单的后端应用,却在单体系统的束缚中力不从心、对后续的技术学习感到迷茫、对复杂系统不知所措、迫切期待实现技术飞跃的读者。本书为他们提供了从简单到复杂的技术成长路径和解决方案。
已出版《Hadoop3.X大数据开发实战(视频教学版)》《Flink大数据分析实战》《Spark3.X大数据分析实战(视频教学版)》《企业级大数据项目实战:用户搜索行为分析系统从0到1》等图书,多本图书被多所高校选为教材。公众号"奋斗在IT” 的创办人。
第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