图书简介:
第2版前言
目 录
第1章 高性能架构 001
1.1 软件架构 001
1.2 软件的质量 002
1.3 高性能概述 004
1.4 软件性能指标 005
1.4.1 吞吐量 005
1.4.2 并发数 005
1.4.3 平均响应时间 006
1.4.4 可靠性指标 007
1.5 性能指标之间的关系 007
1.5.1 并发数对吞吐量的影响 007
1.5.2 并发数对平均响应时间的影响 009
1.5.3 平均响应时间对并发数的影响 010
1.5.4 可靠性指标与其他指标的关系 011
1.6 高性能架构总结 011
第2章 分流设计 012
2.1 内容分发网络 012
2.1.1 内容分发网络的结构 013
2.1.2 内容分发网络的原理 014
2.2 多地址直连 017
2.3 反向代理 018
第3章 服务并行设计 022
3.1 并行与并发 022
3.2 集群系统 023
3.2.1 无状态的节点集群 024
3.2.2 单一服务节点集群 024
3.2.3 信息共享的节点集群 026
3.2.4 信息一致的节点集群 027
3.3 分布式系统 028
3.4 微服务系统 030
第4章 运算并发设计 032
4.1 多进程 032
4.2 多线程 033
4.2.1 线程的状态及转换 033
4.2.2 多线程的应用场景 034
4.2.3 多线程的创建 035
4.2.4 线程池 039
4.2.5 多线程资源协作 042
4.2.6 多线程进度协作 048
4.3 多协程 060
4.4 运算并发总结 062
第5章 输入输出设计 064
5.1 概念梳理 064
5.1.1 同步与异步 064
5.1.2 阻塞与非阻塞 065
5.2 IO模型 066
5.3 IO模型的层级关系 068
5.4 阻塞式IO模型 068
5.5 非阻塞式IO模型 070
5.6 信号驱动式IO模型 071
5.7 复用式IO模型 071
5.8 异步式IO模型 074
5.9 输入输出模型总结 077
第6章 数据库设计与优化 078
6.1 数据库设计概述 078
6.2 关系型数据库设计 079
6.2.1 设计范式介绍 080
6.2.2 反范式设计 087
6.3 索引原理与优化 088
6.3.1 索引的原理 088
6.3.2 索引生效分析 092
6.3.3 索引的使用 094
6.3.4 索引的利弊 099
6.4 数据库引擎 100
6.5 数据库锁 101
6.5.1 乐观锁 101
6.5.2 悲观锁 102
6.6 死锁 103
6.7 事务 105
6.7.1 事务并发导致的问题 105
6.7.2 事务隔离级别 107
6.7.3 自建事务 109
6.8 巨量数据的优化 110
6.8.1 表分区 110
6.8.2 分库分表 113
6.8.3 读写分离 115
6.9 数据库中间件 118
第7章 非关系型数据库 120
7.1 键值数据库 121
7.1.1 Redis概述 121
7.1.2 数据类型与对应操作 121
7.1.3 应用场景 132
7.2 文档数据库 132
7.2.1 Elasticsearch概述 133
7.2.2 Elasticsearch的使用 135
7.3 宽列存储数据库 139
7.4 图数据库 142
7.5 面向对象数据库 144
?
第8章 缓存设计 148
8.1 缓存的收益 148
8.2 缓存的键与值 149
8.2.1 缓存的键 149
8.2.2 缓存的值 153
8.3 缓存的更新机制 155
8.3.1 时效性更新机制 155
8.3.2 主动更新机制 156
8.4 缓存的清理机制 159
8.4.1 时效式清理 160
8.4.2 数目阈值式清理 160
8.4.3 非强引用式清理 164
8.4.4 清理策略使用实践 166
8.5 缓存的风险点 167
8.5.1 缓存穿透 167
8.5.2 缓存雪崩 168
8.5.3 缓存击穿 168
8.5.4 缓存预热 169
8.6 缓存的位置 169
8.6.1 客户端缓存 171
8.6.2 静态缓存 173
8.6.3 服务缓存 174
8.6.4 数据库缓存 174
8.7 写缓存 175
8.7.1 写缓存的收益问题 175
8.7.2 写缓存实践 176
第9章 可靠性设计 178
9.1 软件可靠性概述 178
9.2 软件可靠性指标 179
9.2.1 失效概率 179
9.2.2 失效强度 179
9.2.3 失效率 179
9.3 模块连接方式与可靠性 180
9.3.1 串联系统的可靠性 180
9.3.2 并联系统的可靠性 180
9.3.3 冗余系统的可靠性 180
9.3.4 模块连接方式的可靠性讨论 181
9.4 软件失效模型 181
9.5 可靠性设计 182
9.5.1 消除单点依赖 182
9.5.2 化串联为并联 183
9.5.3 采用集群 183
第10章 应用保护 185
10.1 应用保护概述 185
10.2 应用保护方案 186
10.2.1 降级 186
10.2.2 熔断 188
10.2.3 隔离 188
10.2.4 限流 190
10.2.5 恢复 195
10.2.6 应用保护方案小结 196
10.3 Hystrix 196
10.3.1 运行原理 196
10.3.2 运行设置 198
10.3.3 命令参数 200
10.3.4 使用举例 203
第11章 前端高性能 218
11.1 前端工作分析 218
11.1.1 前端加载过程 218
11.1.2 前端性能分析 219
11.2 资源下载优化 221
11.2.1 资源压缩 221
11.2.2 减少请求 222
11.2.3 资源缓存 227
11.3 页面解析优化 231
11.3.1 顺应解析流程 231
11.3.2 应用新型前端框架 232
11.4 懒加载 232
11.5 预操作 233
第12章 架构设计理论 234
12.1 软件架构风格 234
12.1.1 管道过滤器架构风格 235
12.1.2 面向对象架构风格 235
12.1.3 基于组件的架构风格 236
12.1.4 事件驱动架构风格 236
12.1.5 分层架构风格 236
12.1.6 C/S架构风格 237
12.1.7 三层C/S架构风格 237
12.1.8 B/S架构风格 238
12.2 软件生命周期 239
12.2.1 需求阶段 240
12.2.2 模型设计 241
12.2.3 概要设计 241
12.2.4 详细设计 242
12.2.5 质量指标设计 242
12.2.6 方案预研 243
12.2.7 软件开发 243
第13章 高性能架构实践 244
13.1 需求概述 244
13.2 权限系统的相关理论 246
13.2.1 权限模型 247
13.2.2 访问控制方式 252
13.3 模型设计 252
13.3.1 模型调研 253
13.3.2 模型应用 253
13.4 概要设计 259
13.5 数据层详细设计 262
13.5.1 RBAC数据表的范式设计 262
13.5.2 RBAC数据表的反范式设计 263
13.5.3 RBAC数据表的最终设计 265
13.5.4 MatrixAuth管理类数据表设计 266
13.5.5 MatrixAuth的数据层结构 268
13.6 缓存详细设计 268
13.7 服务端详细设计 269
13.7.1 数据源动态切换 270
13.7.2 数据冗余的一致性保证 271
13.7.3 服务端的操作接口 271
13.8 客户端详细设计 272
13.8.1 可控角色的权限验证 273
13.8.2 自由角色的权限验证 274
13.8.3 用户信息、角色关联信息推送 275
13.9 MatrixAuth项目实践总结 275
13.9.1 MatrixAuth的高性能设计 276
13.9.2 需求完成度分析 277
13.9.3 MatrixAuth的使用简介 277
展开
第2版前言
转眼间,本书第1版已经发行三年多了。期间,书籍收到了不错的反响,多次登上畅销榜并发行了繁体版。作为作者,我很是欣慰,也感谢大家对本书的认可。
在此期间,出版社和我也收到了不少反馈,了解到许多高校将本书作为教材,许多学生和编程初学者将本书作为架构入门书籍。出版社也联系我编写本书的第2版。针对以上情况,本书第2版主要进行了如下两点更新。
首先,为方便高校师生获取书籍示例代码,第2版提供下面两种免费下载途径:
示例代码的开源项目:https://github.com/yeecode/PerformanceDemo
我的主页:https://yeecode.top
其次,为了帮助学生、编程初学者更容易地理解软件架构与高性能开发方面的知识,第2版对非关系型数据库、应用保护框架等内容进行了更详细的介绍,并附带具体的实践指导。
在第2版即将付印之际,我还是想回顾下几年前我为什么要写作本书。
当时,我已经出版了《通用源码阅读指导书——MyBatis源码详解》一书,向大家分享源码阅读相关的知识和技巧。书籍面市后,收到了不错的反响,有的读者表示学到了许多编程知识,有的读者表示理解透彻了MyBatis的源码,有的读者表示终于迈入了源码阅读的大门。这让我感觉每个坐在计算机前十指连弹的夜都是值得的。
然而,我也发现很多开发者在进行软件架构设计时缺乏体系化思维,于是,只能在试错、总结中不断摸索提升,痛苦而缓慢,并且这种提升方式容易留下知识盲区。但是,这些都很难通过源码阅读来补足。
于是,当时的我决定写一本体系化的架构书籍。书籍中不仅要包含理论知识、实践技巧、工程方案,更要将这些知识体系化地连接起来,以帮助大家建立一个完备的知识体系。
这就是几年前我写作本书的原因。后来,本书第1版在2021年年初上市。
在书中,我们将从“高性能架构”这一点出发,体系化地介绍高性能架构相关的各个方面。
书中涉及很多理论知识,我尽量通过示例使它们简单易懂;书中有很多架构技巧,我尽量通过总结使它们清晰明了。本书的最后,还会以书中的架构体系为依据,融会贯通开发一套高性能的分布式权限系统。
从理论知识,到架构技巧,再到项目实践,本书力求给出一套完整的知识体系,指引大家完成高性能系统的架构设计。
经过这次第2版的更新后,本书的内容进一步扩充,共13章,整体结构如下。
第1章介绍了高性能和架构这两个概念,包括高性能所代表的具体指标,架构的具体含义和主要内容。
第2章介绍了分流设计,即如何使用内容分发网络、多地址直连、反向代理等手段将用户的请求分散到不同的系统上,从而降低每个系统的并发数。
第3章介绍了与服务并行相关的设计。首先介绍了并行与并发的概念;然后在此基础上介绍了集群系统、分布式系统、微服务系统,包括各类系统的特点、实现难点等。服务并行设计能够进一步将系统内的请求进行分流,从而提升系统性能。
第4章介绍了多进程、多线程、多协程等运算并发手段,并给出了相应的示例。尤其是对常见的多线程进行了深入的介绍,包括线程的状态转换、应用场景、使用方法、协作方法等。运算并发设计,能够显著提升系统的并发能力。
第5章介绍了输入输出设计。首先介绍了IO的分类维度、层级;然后详细介绍了常见的5种IO模型,包括这些模型之间的演化逻辑,并给出了这些模型的实际使用示例。
第6章介绍了数据库设计与优化手段。从最基本的关系型数据库设计开始,介绍了关系型数据库的设计范式、反范式。在此基础上,本章介绍了各类索引的原理、使用条件,以及各类锁的特点、死锁的产生与解除、事务及其隔离级别等。本章最后还介绍了面向巨量存储数据时数据库该如何优化。
第7章介绍各类非关系型数据库,包括键值数据库、文档数据库、宽列存储数据库、图数据库、面向对象数据库,并对常用的数据库Redis和Elasticsearch进行了详细的讲解。
第8章介绍了缓存设计的方法和技巧。这一章从缓存的收益说起,推导提升缓存收益的方法。然后,在此基础上,本章给出了提升缓存收益的具体实施手段,包括缓存要素的设计、更新机制的设计、清理机制的设计、风险点的处理、位置的设计等。最后,本章介绍了写缓存的收益计算和实践方案。
第9章介绍了系统可靠性设计的相关知识。首先介绍了可靠性的概念与具体的衡量指标,然后在此基础上介绍了提升系统可靠性的手段。这一章将帮助我们构建高可靠性的系统。
第10章介绍了应用保护的基础知识和实践手段,并深入剖析了Hystrix框架的原理与使用方法。这些知识和手段能提升应用在突发状况下的工作状况。
第11章介绍了前端高性能的相关知识。这是一个相对独立的章节,首先分析了前端工作过程中的性能关键点,然后针对这些关键点给出了前端性能优化的手段。本章具有较强的概括性和指导性。
第12章介绍了架构设计中软件架构设计风格和软件生命周期这两个方面的基本知识。这些知识将指导我们体系化地进行软件架构设计工作。
第13章是一个项目实践章节。该章以前面各章介绍的高性能架构知识为依据,完整地开展了一个高性能软件系统的架构工作,包括理论推导、模型设计、概要设计、详细设计等各个环节,向读者展示了一个完整的高性能架构过程。该章节的内容能帮助读者学会如何在实践中灵活运用前面各章的知识。
本书力求理论联系实践,既给出了高性能架构的相关理论与推导,又给出了具体的实施策略与技巧,还通过项目实践完成了一个高性能软件的架构设计。希望大家在阅读本书后能够建立高性能架构的完整知识体系。
本书的写作出版经历了很长的过程,从规划到研究,从初稿到终稿,从编辑到印刷,从几年前的第1版到现在的第2版。在这个过程中,我要感谢许多人。期间,我得到了领导的大力支持和鼓励,得到了国内外学术及工程领域多位专家的指导。性能领域的资深专家童庭坚百忙中审阅了书籍初稿,并为本书初版作序。在本书资料收集、图片绘制等方面,崔宝顺老师贡献颇多。电子工业出版社的众多编辑也为本书倾力付出。谢谢!
在本书第2版的筹备和写作过程中,家中也迎来了聪明可爱、萌气十足的小宝宝。
以此书献给进进小朋友,祝他健康快乐成长。
易哥
2024年8月于上海
展开