第1章 为什么要用分布式9
1.1 JavaScript的单线程特性9
1.2 Node.js 速览13
1.3 Node.js的事件循环16
1.4 示例应用程序21
第2章 协议26
2.1 使用HTTP请求和响应27
2.2 使用GraphQL构建API外观39
2.3 使用gRPC进行RPC通信46
第3章 扩展54
3.1 集群模块54
3.2 使用HAProxy实现反向代理61
3.3 SLA和负载测试72
第4章 可观测性85
4.1 运行环境85
4.2 ELK与日志87
4.3 Graphite、StatsD和Grafana度量指标94
4.4 使用Zipkin进行分布式请求跟踪102
4.5 运行状况检查110
4.6 使用 Cabot 进行报警113
第5章 容器119
5.1 Docker简介121
5.2 容器化Node.js服务127
5.3 使用 Docker Compose进行基本编排135
5.4 内部Docker 注册表140
第6章 部署145
6.1 使用 Travis CI 构建流水线146
6.2 自动化测试151
6.3 部署Heroku162
6.4 模块、包和SemVer168
6.5 内部npm注册表179
第7章 容器编排184
7.1 Kubernetes 简介185
7.2 启动188
7.3 部署应用程序192
7.4 服务发现199
7.5 修改部署204
第8章 弹性210
8.1 Node.js 进程的终止210
8.2 构建无状态服务218
8.3 使用Memcached构建外部缓存224
8.4 数据库连接的弹性229
8.5 使用Knex进行Schema 迁移238
8.6 幂等性和消息传递弹性248
8.7 弹性测试255
第9章 分布式基元259
9.1 ID 生成问题259
9.2 Redis 简介262
9.3 Redis 操作263
9.4 寻求原子性272
9.5 事务274
9.6 Lua脚本276
第10章 安全性281
10.1 繁杂的代码库281
10.2 认识攻击面283
10.3 应用程序配置287
10.4 升级依赖项292
10.5 升级Node.js298
附录A 安装HAProxy303
附录B 安装Docker305
附录 C 安装Minikube和Kubectl307