
本书对如何采用Node.js及其生态工具进行微服务开发的最佳实践做了全面的介绍,内容包括对微服务架构基本概念及设计原则的讲解,以及如何采用Node.js搭配Seneca、PM2和Docker等现代化工具来构建、测试、监控以及部署轻量级微服务,同时也阐述了Node.js在微服务实践中所涉及的相关概念,并就微服务的优缺点、文档化、安全性以及可追溯性等主题进行了探讨。
前言 作为一本微服务入门的实践指南,本书采用了Node.js和以Seneca、PM2为主的现代框架来进行阐述。在各章中,我们将分别介绍如何利用最佳实践去设计、构建、测试以及部署微服务。此外,我们还会讨论另外一个有价值的课题——如何在设计系统时做出合理的妥协,来避免过度设计和确保技术方案与实际业务需求相匹配。 本书概述 第1章主要讲述微服务的基本概念,包括主要优点和一些缺点,本章内容是本书后续章节的基础。 第2章介绍了Node.js、Seneca和PM2。还讨论了Node.js应用的结构,以及如何通过PM2来运行应用。另外,我们还研究了一些Seneca与PM2的替代产品。 第3章主要讲述如何使用微服务来处理自然增长(计划之外的软件需求变更)。另外,我们还讨论了如何将单块应用分解成微服务。 第4章阐述了如何编写我们的第一个微服务程序。 第5章涉及了安全性与可追溯性,这是现代系统的两大重要特性,因为我们需要保证信息的安全与操作的可追溯性。在本章中,我们讨论了使用Seneca来保证安全性与可追溯性的方法。 第6章主要介绍了Node.js的两大主流测试框架——Mocha和Chai。同时使用Sinon来mock服务以及Swagger来为微服务进行文档化。 第7章使用PM2结合Keymetrics来监控微服务,使PM2的功能得到最大发挥。 第8章通过使用PM2,学习如何在不同环境下部署微服务,并通过单条命令管理应用的“生态系统”,从而减少微服务架构带来的开销。我们还将讨论Docker,它是一个应用容器引擎,可以部署包括Node应用在内的各种应用。 阅读本书的准备工作 为了能够完成本书的实践案例,需要预先安装Node.js、PM2(可以通过npm来安装),以及MongoDB。此外还需要一个编辑器,我个人选用了Atom,但是一般通用的编辑器都能满足需求。 本书的读者对象 本书适合具有一定Node.js经验,并且想要学习Seneca以及微服务知识的开发者。在本书中,有70%的内容是面向实践的(因此我们会编写大量代码),有30%是理论知识。基于编写的这些代码可以帮助读者将书中提到的模式应用到新的软件开发中去。 约定惯例 本书将会使用不同的书写风格来区分不同种类的信息。以下是这些风格的例子和它们的意义。 正文中的文本代码、数据库表名、文件夹名、文件名、文件扩展名、路径名、URL、用户输入和推特用户定位(Twitter handles)将会用代码体书写,如“我们知道输入参数是一个PaymentRequest实例”。 代码块则将会是这样的风格: public interface PaymentService { PaymentResponse processPayment(PaymentRequest request) throws MyBusinessException; } 如果希望向你强调代码块中的一部分,那么它们将会以粗体展示: function() { sinon.stub(Math, "random"); rollDice(); console.log(Math.random.calledWith()); }); after(function(){ Math.random.restore(); }); 任何命令行的输入和输出将是以下这样的: node index.js npm start 警告和关键提醒将会在这样的图标后出现。 小提示和小技巧将会在这样的图标后出现。 下载示例代码 你可以从http://www.broadview.com.cn下载所有已购买的博文视点书籍的示例代码文件。 勘误表 虽然我们已经尽力谨慎地确保内容的准确性,但错误仍然存在。如果你发现了书中的错误,包括正文和代码中的错误,请告诉我们,我们会非常感激你。这样,你不仅帮助了其他读者,也帮助我们改进后续的出版。如发现任何勘误,可以在博文视点网站相应图书的页面提交勘误信息。一旦你找到的错误被证实,你提交的信息就会被接受,我们的网站也会发布这些勘误信息。你可以随时浏览图书页面,查看已发布的勘误信息。
1 微服务架构 1 微服务应运而生 1 单块软件 2 现实世界中的微服务 2 面向微服务的架构 3 为什么面向微服务的架构更好 3 不足之处 3 关键设计原则 4 从组件到业务单元 5 智能的服务,愚蠢的通信管道 7 去中心化 8 技术对比 10 多微才是足够的微 10 关键的好处 11 弹性 11 可伸缩性 11 技术多样性 13 可替换性 14 独立性 15 SOA与微服务的比较 16 为什么选择Node.js 18 API聚合 18 展望Node.js 19 小结 20 2 基于Seneca和PM2构建Node.js微服务 21 选择Node.js的理由 21 安装Node.js、npm、Seneca和PM2 22 第一个程序——Hello World 25 Node.js的线程模型 27 模块化组织的最佳实践 27 微服务框架Seneca 32 实现控制反转 35 Seneca的模式匹配 35 PM2——Node.js的任务执行器 46 单线程应用及异常 46 PM2——业界标准的任务执行器 47 小结 52 3 从单块软件到微服务 53 首先,我们拥有一个单块软件 53 如何控制自然增长 54 多抽象才是过度抽象 57 微服务的出现 58 微服务的缺陷 64 分割单块软件 64 数据才是分割单块软件的主要问题 65 组织架构适配 66 小结 67 4 编写你的第一个Node.js微服务 69 微电子商务概览 69 商品管理服务——双重核心 71 获取商品信息 72 获取指定类别的商品 73 根据ID获取商品 74 添加商品 75 删除商品 75 编辑商品 76 整合各模块 76 集成Express与Seneca——如何创建REST API 81 邮件服务:一个常见的问题 82 如何发送邮件 82 接口定义 83 设置Mandrill 84 亲自动手在微服务中集成Mandrill 86 回退策略 91 订单管理服务 92 根据如何获取非本地数据来定义微服务 93 订单管理服务代码 95 UI——API聚合的产物 99 前端微服务的必要性 99 代码 99 服务降级——当出现非灾难性故障时 107 断路器 108 Seneca——一块使我们工作变得更容易的拼图 109 Seneca和promise 111 调试 115 小结 118 5 安全性和可追溯性 119 基础设施的逻辑安全 119 利用SSH来对通信加密 120 应用程序安全 122 保持安全方面的与时俱进来应对常见威胁 123 有效的代码审阅 131 可追溯性 132 日志 132 请求追踪 134 审计 135 HTTP状态码 136 小结 138 6 Node.js微服务的测试及文档化 140 功能性测试 141 自动化测试的金字塔 142 采用Node.js测试微服务 145 对微服务进行文档化 175 采用Swagger对API进行文档化 175 根据Swagger定义来生成项目 182 小结 184 7 微服务的监控 185 服务监控 185 采用PM2和Keymetrics进行监控 186 类人猿大军—来自Netflix的主动监控 201 吞吐量和性能降级 204 小结 206 8 微服务的部署 208 软件部署的一些概念 208 持续集成 209 持续交付 209 采用PM2进行部署 209 PM2中的“生态系统” 210 采用PM2来部署微服务 212 Docker——一种可用于软件交付的容器 213 组装容器 215 部署Node.js应用 221 将Docker容器的创建过程自动化 223 Node.js事件循环—入门容易精通难 225 Node.js应用的集群化 228 为应用增加负载均衡 233 NGINX的健康检查 238 小结 239
赵震一,一线攻城狮,曾涌入创业洪流,多年未有所成。现居杭州,就职于阿里巴巴。热爱技术,关注互联网与大数据,闲暇译一些技术文章,译有《RESTful Web APIs中文版》