首页>参考读物>计算机科学与技术>软件与程序设计

Node.js实战:分布式系统中的后端服务开发
作者 : [美]托马斯·亨特二世(Thomas Hunter II) 著
译者 : 郭笑鹏 译
出版日期 : 2021-11-08
ISBN : 978-7-111-69449-6
定价 : 149.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 315
开本 : 16
原书名 : Distributed Systems with Node.js
原出版社: O'Reilly Media, Inc.
属性分类: 店面
包含CD : 无CD
绝版 : 未绝版
图书简介

Node.js是一个基于Chrome V8引擎的JavaScript运行时环境,使用了高效、轻量级的事件驱动、非阻塞 I/O 模型,让JavaScript 运行在服务端的开发平台。本书主要介绍基于Node.js构建企业级后端服务,内容涉及Node.js和JavaScript的特性介绍、通信协议、扩展、可观测性、Docker容器、部署、容器编排、应用程序容错、分布式单元、应用程序安全性等内容。本书不是面向 Node.js新手的,适用于拥有Node.js 实战经验且熟练掌握JavaScript的开发人员。读完本书,你会了解在生产环境中运行 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版本,其底层实现对你来说是黑箱。无论如何,通过学习分布式后端服务栈不同层级的工具,你将更容易理解可能遇到的其他技术栈。
排版约定
本书中使用以下排版约定:
斜体(Italic)
表示新的术语、URL、电子邮件地址、文件名和文件扩展名。
等宽字体(Constant width)
用于程序清单,以及段落中的程序元素,例如变量名、函数名、数据库、 数据类型、环境变量、语句以及关键字。
等宽粗体(Constant width bold)
表示应由用户直接输入的命令或其他文本。
等宽斜体(Constant width italic)
表示应由用户提供的值或通过上下文确定的值替换的文本。
表示提示或建议。
表示一般性说明。
表示警告或注意。
示例代码
可以从https://github.com/tlhunter/distributed-node下载补充材料(示例代码、练习、勘误等)。
这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O’Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O’Reilly的示例代码则需要获得许可。引用本书的示例代码来回答问题也不需要许可,将本书中的很大一部分示例代码放到自己的产品文档中则需要获得许可。
非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处的形式包含书名、作者、出版社和ISBN,例如:
Distributed Systems with Node.js,作者Thomas Hunter II,由O’Reilly出版,书号978-1-492-07729-9
如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permissions@oreilly.com联系我们。
O’Reilly在线学习平台(O’Reilly Online Learning)
40多年来,O’Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问https://www.oreilly.com。
如何联系我们
对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。
美国:
O’Reilly Media,Inc.
1005 Gravenstein Highway North
Sebastopol,CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
要询问技术问题或对本书提出建议,请发送电子邮件至bookquestions@oreilly.com。
本书配套网站https://oreil.ly/dist-nodejs上列出了勘误表、示例以及其他信息。
关于书籍、课程、会议和新闻的更多信息,请访问我们的网站http://www.oreilly.com。
我们在Facebook上的地址:http://facebook.com/oreilly。
我们在Twitter上的地址:http://twitter.com/oreillymedia。
我们在YouTube上的地址:http://www.youtube.com/oreillymedia。
致谢
本书之所以能成功出版,要感谢以下人士提供的详细技术审校:
Fernando Larra?aga (@xabadu)
Fernando Larra?aga是一名工程师和开源贡献者。他多年来一直引领着南美和美国的JavaScript社区及Node.js社区。他目前是Square的高级软件工程师,在其他科技公司(如Twilio和Groupon)任职期间,他一直在开发企业级Node.js,并扩展数百万名用户使用的Web应用程序,时间长达7年。
Bryan English (@bengl)
Bryan English是一名开源JavaScript和Rust程序员,曾从事大型企业系统、仪器仪表和应用程序安全方面的工作。目前,他是 Datadog 的高级开源软件工程师。自Node.js诞生后不久,他就在专业和个人项目中使用它。他也是Node.js的核心合作者,并通过多个不同的工作组以多种方式为Node.js做出了贡献。
Julián Duque (@julian_duque)
Julián Duque是社区领袖、公共演说家、JavaScript/Node.js的倡导者,以及Node.js官方合作者(荣誉教授)。目前,他在Salesforce Heroku担任高级开发人员,协助组织 JSConf 和NodeConf Colombia,此外他还为组织JSConf México和MedellinJS (哥伦比亚最大的JavaScript用户群,拥有5000多名注册成员)贡献了一份力量。他也热衷于教育并一直通过不同的社区研讨会、专业培训活动和在线平台(如Platzi)教授软件开发基础知识、JavaScript和Node.js。
我还要特别感谢那些给我提供指导和反馈的人:Dan Shaw (@dshaw)、Brad Vogel
(@BradVogel)、Matteo Collina (@matteocollina)、Matt Ranney (@mranney)和Rich Trott (@trott)。

上架指导

计算机\Web开发

封底文字

从初创公司到世界500强,大多数公司都喜欢使用Node.js来构建高性能的后端服务。工程师对Node.js有很高的评价,因为它有容易理解的API和大家熟悉的语法。在全球最大的包存储库的强力支持下,Node.js的生态必将更加繁荣。
在本书中,作者证明了Node.js在构建可观察、可扩展且有弹性的服务方面与传统的企业平台一样适用。中高级Node.js开发人员会发现,他们可以将应用程序代码和现代服务栈的各个层面结合起来。
通过学习本书,你可以:
? 了解为什么要运行多个相同的Node.js服务副本。
? 根据业务场景选择恰当的协议。
? 调整应用程序容器以便在生产环境中运行。
? 跟踪分布式系统中的错误,以确定哪个服务出错。
? 通过将工作转移给反向代理来简化应用程序代码并提高性能。
? 构建数据面板来监视服务运行状况和数据吞吐量。
? 了解在企业环境中操作时需要使用多种工具的原因。
“ 本书是市面上少有的Node应用程序扩展手册,它正是我们工程师所需要的。”
——Brad Vogel
Mixmax的联合创始人
兼首席技术官
“ 我喜欢这本书,它对产品最佳实践的介绍让我受益匪浅。”
——Julián Duque
Heroku的Developer Advocate
“ 这是一本学习使用Node.js构建可扩展应用程序的必读书籍。”
——Jacopo Daeli
GoDaddy的首席工程师
Thomas Hunter II已让Node.js在数十个企业中大放光彩,他现在在为一家致力于让Node.js更加安全的公司工作。他曾在数个关于Node.js和JavaScript的会议上发表讲话,并获得了JSNSD/JSNAD认证,同时他还是NodeSchool SF的组织者之一。

图书序言

在过去的10年里,Node.js 已经从新生事物脱胎换骨成应用程序事实上的平台。在此期间,我有机会帮助成千上万名世界各地的 Node.js 开发者认识自己,并找到前进的方向。我们已经在很多方面看到了Node.js 的应用成果,甚至有人用 Node.js 构建了一个基础的可引导操作系统。
在旧金山举办的SFNode大会上,一位明星级演讲者吸引了大多数人的目光。没错,他就是托马斯·亨特二世(Thomas Hunter II),本书的作者。虽然Node.js 无所不能,但有些工作特别受益于使用Node.js完成。在当今这个“万物云为先”的世界,分布式系统已成为大多数系统的常态。从本书和作者在世界各地的演讲中,我真切地感受到实用主义才是最重要的。本书介绍了大量的经验,手把手指导你搭建分布式系统。
JavaScript 语言让开发人员能够很方便地进行开发。它没有什么前置条件和环境限制,而且代码实例也并不复杂,手写代码比自动生成的代码更容易理解。Node.js 使用JavaScript 作为开发语言简直是神来之笔。Node的创建者Ryan Dahl希望使用Node创建应用服务器比使用其他语言快一个数量级。结果超出了我们的想象。Node.js大道至简,它让你能够以10年前根本不可能存在的方式进行创建、验证和创新。
在接触Node.js 之前,我是一名全栈开发人员,使用JavaScript构建简单的页面交互和验证表单,或者使用Java提供API和后端服务。我不得不花费大量的时间来把JavaScript数据转换成 Java 需要的对象格式。我和 Node.js 真是相见恨晚,借助它,我终于可以在客户端和服务器上一起高效地迭代开发了。我破釜沉舟,卖掉了房子搬到旧金山,完全沉浸在Node.js的海洋里。
我使用 Node.js 构建了数据聚合系统、社交媒体平台、视频聊天网站等。然后,我帮助Netflix、PayPal、沃尔玛甚至NASA学习如何有效地使用这个平台。人们很少在JavaScript API 方面感到困惑,反倒经常在异步编程模型上栽跟头。如果你不了解正在使用的语言,那谈何学以致用呢?异步编程要求你更像计算机系统而非连续操作的单线程脚本。这种异步行为是一个好的分布式系统的核心。
当托马斯让我审校本书的时候,我注意到可扩展性部分是从概述集群模块开始的。我当即将其标记为重点章节。创建集群是为了实现单个实例的并发性,它可以向系统内的单个端口公开。我曾见过Node.js 新手在假设可以并发的情况下创建应用,因此也想到了或许集群正是他们所需要的。在分布式系统中,实例级别的并发通常是浪费时间。幸运的是,托马斯和我达成了共识。
因此,如果你是Node.js 开发人员和分布式系统开发人员,请花点时间了解其中的限制和优势。Node.js 在 I/O 方面的性能无出其右。我曾经见过旧服务下线并用Node.js的实现替代时出现了下游服务阻塞问题。Node.js系统充当了下游服务的自然限速器。只需添加一个简单的Node.js代理即可修复大多数问题。
使用 Node.js 开发能够节省你很多时间,你可以用这些时间来尝试更多的事情。不要怕,大胆实践。分布式系统允许我们在服务等级隔离和封装逻辑,之后再用负载均衡来验证整个系统的性能。尽信书不如无书,真知来源于实践。
愿你能分享所学。

Dan Shaw(@dshaw)
Node.js 公司 NodeSource 的创始人兼CTO,Node.js布道者

图书目录

序言1
前言3
第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

教学资源推荐
作者: Behrouz A. Forouzan;Richard F. Gilberg
作者: Steven S.Muchnick
作者: 史涯晴 贺汛 编著
参考读物推荐
作者: 杨洁 郭占鑫 刘康 熊谱翔 著
作者: David Carlson
作者: 康博创作室
作者: 孙杰 山金孝 张亮 张婷婷 著