API 网关是为了方便前端工程师统一管理多个服务请求而产生的一种架构设计。而 Fastify 又是一个高效且灵活的 Web 框架,作为常用的 Node.js 开发者大可使用 Fastify 来进行 API 网关的开发。
快速了解 Fastify
Fastify 是一款基于 Node.js 开发的 Web 框架,它具有极快的性能和良好的扩展性。同时,Fastify 也是一个无依赖的框架,因此它的安装和使用非常方便。
Fastify 的主要特点包括:
- 采用了类似于 Express.js 的中间件机制,易于与其他插件进行整合。
- 内置了请求验证、缓存、请求ID、Schema 验证等功能。
- 支持 preHandler 和 onRequest hook,使得开发者能够更加细粒度地控制请求处理过程。
- 可以在无阻塞模式下处理高并发请求。
- 结构简单,易于使用和扩展。
更多关于 Fastify 的内容,您可以前往官网了解:https://www.fastify.io/docs/latest/
开始使用 Fastify 进行 API 网关开发
安装与初步配置
首先需要通过 npm 来安装 Fastify:
npm install fastify -save
然后创建一个名为 index.js
的文件来编写启动 Fastify 的代码:
-- -------------------- ---- ------- ----- ------- - -------------------- -------------------- -------- ----- -------- - -- ----- - ------------------ --------------- - ------------------- --------- -- ------------ --
接着在控制台通过以下命令来启动 Fastify:
node index.js
此时 Fastify 即已启动并监听在 3000 端口上。
添加路由
我们需要为 Fastify 添加路由来进行请求的转发。Fastify 提供了 .get()
、.post()
、.delete()
等方法来定义不同的 HTTP 请求。下面示例展示了一个基础的路由:
fastify.get('/', function (request, reply) { reply.send({ message: 'welcome to API gateway' }) })
该路由表示对 /
路径发起 GET 请求时,返回一个包含 message
成员的 JSON 数据。
我们也可以通过 .route()
方法来将路由函数封装为一个可重用的函数,例如:
-- -------------------- ---- ------- -------- ------------------ ------ - ------------ -------- ----- -- - ----- --------- -- - --------------- ------- ------ ---- --------- -------- --------- --
上述示例中,我们将原本的路由函数封装为了 myHandler
函数,并通过 .route()
方法来定义新的路由。该路由表示对 /route
路径发起 GET 请求时,调用 myHandler
函数,返回指定的 JSON 数据。
Fastify 还支持将多个路由挂载到同一路径的多个 HTTP 方法上:
fastify.route({ method: ['GET', 'POST'], url: '/multi-method', handler: function (request, reply) { reply.send({ message: 'this is a multi-method route' }) } })
使用插件
在实际的 API 网关开发中,我们通常需要使用一些额外的插件来提供更为丰富的功能或扩展 Fastify 的能力。例如,以下是一个使用 fastify-jwt
插件进行登录认证的示例:
首先安装 fastify-jwt
插件:
npm install fastify-jwt -save
然后在代码中引用插件:
const fastifyJwt = require('fastify-jwt') fastify.register(fastifyJwt, { secret: 'supersecret' })
以上代码表示注册了 fastify-jwt
插件,并为其指定了一个加密密钥。
接着我们可以编写一个路由,模拟用户登录的过程:
-- -------------------- ---- ------- ---------------------- ----- -------- --------- ------ - ----- - --------- -------- - - ------------ -- ----------------- ----- ----- - ------------------ -------- -- ------------ ----- -- --
上述代码中,我们使用 POST 请求发送了用户名和密码,然后将其和预设的用户名和密码做对比。如果校验通过则生成一个 JWT(JSON Web Token)并返回给前端。
接下来,我们可以使用 fastify-jwt
提供的 .jwtVerify()
方法来对请求中的 Token 进行校验:
fastify.get('/me', { preValidation: [fastify.authenticate] }, function (request, reply) { reply.send({ username: request.user.username }) })
以上代码表示定义了一个 /me
路由,其中使用了 fastify.authenticate
来对请求中的 Token 进行校验。如果校验失败则返回 401 状态码,否则将用户信息返回给前端。需要特别注意的是,在调用 .authenticate
方法前,需要先注册 fastify-jwt
插件,并指定加密密钥。
使用 DataLoader 进行高效查询
在常规的 API 请求中,相关数据通常会分步进行查询,这就导致了 API 网关需要针对每个请求进行单独查询的问题。而以 DataLoader 来进行数据的缓存与批处理可以显著提升查询效率。下面是一个使用 DataLoader 进行查询的示例:
首先安装 dataloader
:
npm install dataloader -save
然后创建一个 DataLoader:
-- -------------------- ---- ------- ----- ---------- - --------------------- ----- -------- ---------------- - ----- ---- - ----- ---------------- - ---- ----- ----- -- -- --------------------- ----- ----- - ------------------ ---- -- - ------------ - --- ------ ---- -- --- ------ ----------- -- ---------- - ----- ---------- - --- --------------- -- -----------------
以上代码表示通过 dataloader
库创建了一个 userLoader
,该 Loader 会批处理基于 ID 的数据请求。具体来说,在执行 load()
方法时,Loader 会将查询请求进行缓存,以便利用批处理方式实现高效查询。
然后我们可以编写一些路由函数来使用 Loader:
-- -------------------- ---- ------- ------------------------ ----- -------- --------- ------ - ----- ---- - ----- ---------------------------------- ---------------- -- ---------------------- ----- -------- --------- ------ - ----- - --- - - ------------ ----- ----- - ----- ---------------------- -- --------------------- ----------------- --
以上代码中,我们通过在路由函数中调用 Loader 的 load()
方法来获取数据。需要注意的是,由于 Loader 本身采用了异步包装,因此在使用时需要注意同步/异步调用的方式。
总结
Fastify 是一个优秀且强大的 Web 框架,适用于进行 API 网关的开发工作。通过阅读本文,您应该已经掌握了如何使用 Fastify 进行 API 网关的开发,以及如何使用插件和 DataLoader 进行高效的数据管理。
当然,该文探讨的只是一部分 Fastify 的功能,实际使用和深度学习还需多加实践和探索。感谢您阅读!
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6520af7495b1f8cacd81e3f3