随着前端技术的迅速发展和 Node.js 技术的不断成熟,微服务架构也成为了现在很火热的技术热点。微服务架构利用很多小型应用来协作完成业务,这些小型应用可以独立发布,运行和扩展。其中每个微服务都是一种轻量级的独立应用,可以通过网络调用其他应用程序进行通信。
在微服务中,每一个服务都有自己的 HTTP API 接口,因此,我们需要一个能够快速、高效地构建 HTTP API 的框架。Fastify 就是一个这样的框架,它是一个高效、低开销、且可扩展的 web 框架,对开发者而言非常友好,这也是它成为很多团队开发微服务的一个很好的选择。
在本文中,我们将学习如何使用 Fastify 框架来构建现代化的 Node.js 微服务,并提供示例代码和实用技巧。
准备工作
在开始构建 Fastify 微服务之前,我们需要确认一些必要的安装和配置,同时需要熟悉几个核心概念。
安装 Node.js
首先,我们需要在开发环境中安装 Node.js,你可以前往 https://nodejs.org/ 官网下载并安装最新版本的 Node.js。
初始化项目
接下来,我们需要创建一个新的文件夹来存放我们的项目,并在其中初始化一个新的 Node.js 项目。我们可以在该文件夹下运行以下命令:
npm init -y
安装 Fastify
当我们已经有了一个初始化的项目之后,我们需要安装 Fastify 并且开始进行项目的构建。运行以下命令行:
npm install fastify
熟悉 Fastify 核心概念
在开始构建微服务之前,你需要熟悉 Fastify 核心概念,包括路由器、中间件、请求和响应等。当你已经掌握这些基础知识后,我们就可以开始构建自己的微服务了。
构建微服务
现在我们已经完成了必要的准备工作,接下来让我们开始构建微服务。
创建基础应用
我们开始创建一个基础的 Fastify 应用,用于测试我们的路由、中间件和插件。我们可以创建一个 index.js
文件,然后编写以下代码:
-- -------------------- ---- ------- ----- ------- - -------------------- ---------------- ----- ----- ------ -- - ------ - ------ ------- - -- -------------------- ----- -------- -- - -- ----- ----- --- ------------------- --------- -- ------------ --
这段代码定义了两个路由(/
和/ping
),我们可以将其启动,查看 Fastify 是否可以使用并监听来自规定端口的请求:
node index.js
当你能看到 Server listening on http://:::3000
的信息时,表示你的服务已经运行起来并且可以成功接受连接。访问 http://localhost:3000 可以看到你的 hello world 值。
添加路由器
添加路由器可以帮我们维护所有的路由信息,这样读者可以通过阅读一个中心的路由器地方来理解整个应用的逻辑。我们可以将路由信息全部到一个路由文件里面,这个文件命名为 routes.js
。接下来编写下面的代码:
module.exports = async function (fastify, opts) { fastify.get('/', async function (req, reply) { reply.send({ hello: 'world' }) }) fastify.get('/ping', async function (req, reply) { reply.send('pong') }) }
我们要修改下 index.js
文件以便于把路由信息全部在 routes.js
文件处理:
const fastify = require('fastify')() fastify.register(require('./routes')) fastify.listen(3000, (err, address) => { if (err) throw err console.log(`Server listening on ${address}`) })
这里是一个重要的细部差别,我们之前在路由方法前缀上面提起过函数方法签名 async (req, reply) => {}
。如果你试图在路由配置对象传递里面使用此方法签名,Fastify 可能会导致错误出现。所以我们要指定此签名为异步函数。这里我们现在相当于只定义了 two routes 处理程序,并且说明了我们正在使用 routes.js
文件来管理所有路由。但这还不够,我们需要在 routes.js
文件里面添加更多的代码来让它更有用和可重用。
添加示例路由
在 routes.js
文件中,我们可以添加示例路由来学习使用中间件、路由选项和验证。在这里,我们将例子路由加入到 /websocket
和 /websocket/json
上面:
-- -------------------- ---- ------- -------------- - ----- -------- --------- ----- - ---------------- ----- -------- ----- ------ - ------------ ------ ------- -- -- -------------------- ----- -------- ----- ------ - ------------------ -- ------------------------- - ---------- ---- -- ------------ ---- -- - ------------------------------- ------- -- - ----------------------------- ------------ -- -- ------------------------------ - -------------- ----- --------- ------ -- - -- ----------------------- --- ---------- - ------------------------------ ----- --------- -- ---------- - -- ---------- ----- ------- - ------------ - --------- - ----- -------- - - - -- ------------ ---- -- - ------------------------------- ------- -- - --------------------------------------- ----- -------- --------- ------------------ --- -- -- -
以上 websocket
和 websocket/json
两个路由使用了 Fastify 的 websocket
工具,它使得连接到 Websocket 然后处理那个连接是很容易的。路由结构变得一致并且 Websocket codes 得到了提取。在第二个路由上面,我们还添加了 preValidation
钩子,该钩子在路由验证之前执行,我们这个地方使用钩子来验证一个 socket 在请求之前被传递过来。
添加异常处理
在任何大型的应用程序中,异常处理都是必须的一步,否则某些用户所做的操作将会引起全局错误,可能会导致应用崩溃。为了避免这些问题,我们在 index.js
文件中添加一个全局错误处理程序:
-- -------------------- ---- ------- ----- ------- - -------------------- ------------------------------------- - ------- ------ -- ------------------------------- -------- ------ -- - ------------------------ ----------------- -- -------------------- ----- -------- -- - -- ----- ----- --- ------------------- --------- -- ------------ --
Fastify 的错误处理提供了非常多的细节,比如说能够根据请求接收 Content-Type 自动解析 JSON 和 XML。如果你在请求参数里面提供了 preValidation
钩子,那么处理程序也能在其中提前捕捉到异常,并且将抛出的异常转换为 HTTP 错误码。
结论
借助可扩展、高效和易于使用的 Fastify 框架,我们可以轻松构建现代化的 Node.js 微服务。在本文中,我们学习了如何创建基本的 Fastify 应用程序、如何抽象出和组织路由、使用中间件和处理 Websocket 连接等。
通过实践和实验,本文深入讲解了 Fastify 的高级概念和不同的用例。如果你正在寻找一种可扩展且易于使用的 web 框架,那么 Fastify 绝对是你应该选择的工具之一。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6752d0538bd460d3ad98db5f