适读人群 :拥有了Node.js的实战经验且能熟练使用JavaScript 从初创公司到世界500强,大多数公司都喜欢使用Node.js来构建高性能的后端服务。工程师对Node.js有很高的评价,因为它有容易理解的API和大家熟悉的语法。在全球大的包存储库的强力支持下,Node.js的生态必将更加繁荣。
在本书中,作者证明了Node.js在构建可观察、可扩展且有弹性的服务方面与传统的企业平台一样适用。中高级Node.js开发人员会发现,他们可以将应用程序代码和现代服务的各个层面结合起来。
【通过学习本书,你可以:】
了解为什么要运行多个相同的Node.js服务副本。
根据业务场景选择恰当的协议。
调整应用程序容器以便在生产环境中运行。
跟踪分布式系统中的错误,以确定哪个服务出错。
通过将工作转移给反向代理来简化应用程序代码并提高性能。
构建数据面板来监视服务运行状况和数据吞吐量。
了解在企业环境中操作时需要使用多种工具的原因。
在旧金山的 NodeSchool 和 Ann Arbor 的 PHP MySQL 工作组工作的这几年间,我一直致力于教授别人编程。到目前为止,我已经教授过数百名学生。教学通常都是从安装和配置所需的软件开始。接下来,我会用一小段代码和大段的语言向学生们解释程序的运行原理,学生们只需“点击”即可。当代码运行起来时,学生们总是特别开心,就像在游戏里习得了新技能一样。
我的目标就是让读者通过本书重现那种激动人心的感觉。在本书中,你将发现许多实际操作的示例,在这些示例中,你可以在开发机上运行各种备份服务,然后使用示例Node.js应用程序代码与它们交互。书中同时伴随着大量的原理解释和小问题,足以充分满足你的好奇心。
在阅读本书的过程中,你将安装并运行许多不同的服务,并且对于每一个服务,你都将编写与它们交互的Node.js应用程序代码。本书着重强调了这些交互,并没有把重心放在分析代码上。
JavaScript 是一种很强大的语言,它能够同时开发前端和后端应用。这便于我们避开外围技术,把全部精力都投入语言学习中。许多人认为只有使用Java或.NET等传统企业平台的工程师才会熟悉这些技术,但其实JavaScript工程师也能够受益于拥有第一手的技术经验。
【读者对象】
本书不会教你如何使用 Node.js。你应该已经拥有了 Node.js 的实战经验且能熟练使用JavaScript。也就是说,本书确实涵盖了一些与 Node.js 和 JavaScript 相关的鲜为人知的高级概念,如“JavaScript的单线程特性”和“Node.js事件循环”。你还应该熟悉HTTP的基础知识,至少使用过一个数据库来持久化状态,并知道在运行的Node.js进程中维护状态是多么容易但又多么危险。
也许你已经在一家拥有运行后端服务的基础设施的公司工作,并且渴望了解它是如何工作的以及你的Node.js应用程序如何从中受益。或者,你有一个作为副业项目运行的 Node.js
应用程序,并且已经厌倦了它的崩溃情况。你甚至可能是一家初创公司的CTO,并决心满足不断增长的用户群的需求。如果这些情况听起来很熟悉,那么本书很适合你。
【目标】
Node.js通常用于构建前端Web应用程序。本书不涉及任何与前端开发或浏览器相关的主题。本书的目标是让你将后端Node.js服务与各种支持现代分布式系统的服务集成在一起。
当你读完本书的时候,你就会了解在生产环境中运行 Node.js 服务所需的许多技术。例如,部署和扩展应用程序需要什么,如何使服务有冗余性和故障弹性,如何与其他分布式进程进行可靠的通信以及如何观察应用程序的运行状况。
当然,仅仅通过阅读本书就想成为专家不太现实。本书并未涉及调优、分片和将可扩展的 ELK 服务部署到生产环境中所需的操作。不过,你将了解如何运行本地的 ELK 实例,如何从 Node.js 服务向它发送日志,以及如何创建一个可视化数据面板来查看服务的运行状况(参见4.2节)。
本书也许并未涵盖你公司使用的所有技术。虽然第7章讨论了 Kubernetes(一种编排应用程序代码部署的技术),但你的公司可能使用不同的解决方案,比如Apache Mesos。还有一种情况是你所用的是云环境中的Kubernetes版本,其底层实现对你来说是黑箱。无论如何,通过学习分布式后端服务栈不同层级的工具,你将更容易理解可能遇到的其他技术栈。
【示例代码】
可以从https://github.com/tlhunter/distributed-node下载补充材料(示例代码、练习、勘误等)。
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O’Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O’Reilly的示例代码则需要获得许可。引用本书的示例代码来回答问题也不需要许可,将本书中的很大一部分示例代码放到自己的产品文档中则需要获得许可。
第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