在 GraphQL 中使用微服务以更快的响应速度

阅读时长 5 分钟读完

什么是 GraphQL?

GraphQL 是一种查询语言和执行引擎,可用于构建客户端应用程序。它由 Facebook 开发,旨在为客户端提供用于获取数据的标准化 API。GraphQL 通过提供一个聚合层,将服务器上不同的数据源绑定在一起,并使客户端能够请求与其需求完全匹配的数据。

比起 REST API,GraphQL 有四个主要的优势:

  1. 客户端能够请求特定字段,这意味着无需获取整个数据对象。
  2. 每个 GraphQL 请求返回的数据结构都是统一的,这样客户端就可以直接使用了,不需要再从服务端自己转换了。
  3. GraphQL 让客户端可以在一个请求中获取多个资源。
  4. 通过定义 GraphQL 的模式,可以让客户端和服务端共享约定,包括接口定义和类型检查。

GraphQL 中的微服务

当我们构建 GraphQL API 时,通常需要从多个源获取数据,例如 MySQL 数据库,Redis 缓存,Rest API 甚至其他 GraphQL 服务。在传统的 monolithic 架构中,将多个数据源储存在同一个数据库中,但在微服务架构中,每个服务都有一个独立的数据源。

在 GraphQL 中,使用微服务可以为我们带来以下好处:

  1. 每个服务都能专注于自己的数据源,并简化其数据图形以提高性能。
  2. 由于微服务都有自己的 API,因此可以使用 GraphQL 模式定义,将服务整合到一个 GraphQL 服务中。
  3. 使用微服务可以消除由于调用 API 而引起的复杂度,并在实现查询后使用结果缓存来加快响应速度。

使用示例代码

如果你想尝试使用 GraphQL 和微服务构建应用程序,那么可以先从基本的示例代码开始。下面的代码演示了在 Node.js 中使用 Apollo Server 和微服务的基本用法。

-- -------------------- ---- -------
----- - ------------- --- - - -------------------------
----- - -------------- - - ----------------------------------
----- ----- - ----------------------
----- --------- - ----------------------------

----- ----- - -
  - --- -- ----- ------- -------- --- --
  - --- -- ----- ------- -------- --- -- --
  - --- -- ----- ------ -------- --- -- --
--

----- ------- ------- -------------- -
  ------------- -
    --------
    ------------ - ---------------------------------------------
  -

  ----- ------------- -
    ----- ----- - ----- -------------
    ----- -------- - ----------------- -- ----------------------
    ------ ----------------- -- --
      --------
      -------- -------------- -- ---- --- -------------- -- ------
    ----
  -
-

----- -------- - ----
  ---- ---- -
    --- ---
    ----- ------
    -------- -----
  -

  ---- ----- -
    -------- ----- ----
    ---------- ------- ------
  -
--

----- --------- - -
  ------ -
    ----- ----- -------- - -- -- - ----------- -- -- -
      ------ ------------------------------------- -- -----
    --
    ------ ----- -------- - --- -- - ----------- -- --
      ----------------------------------
  --
  ----- -
    -------- -- ------- -- -- --------
  --
--

----- ------ - --- --------------
  ---------
  ----------
  ------------ -- -- --
    -------- --- ----------
  ---
---

----------------------- --- -- -- -
  ---------------  ------ ----- -- ---------
---

这段代码中,我们定义了一个 User 类型和一个 Query 类型。User 类型包括 id、name、userIds 字段。Query 类型包括 user 和 users 函数,用以获取单个用户和多个用户的信息。

我们使用 apollo-datasource-restnode-fetch 来访问第三方 REST API。(由于 JSONPlaceholder 中不存在与 'id' 字段对应的用户,因此这并不是一个很好的示例。)

我们将 UserAPI 类继承了 RESTDataSource,这可以为我们处理请求、传递 headers 等,并使我们能够轻松地维护实例的状态。在 getUsers 函数中,我们使用 this.get 调用了 JSONPlaceholder 的 users 接口,并过滤出 ID 包含于查询参数 ids 中的用户。

在 resolvers 函数中,我们根据数据源将用户数据绑定到用户查询中,而在 dataSources 中我们创建了 UserAPI 实例并传入 Apollo Server。

结论

GraphQL 是一个强大的工具,可以将多个数据源组合成一个易于使用的 API。使用微服务可以使查询更快、更可靠、更易于维护,并消除由于调用 API 而造成的复杂性。如果你正在使用 Node.js 和 GraphQL 构建应用程序,那么使用微服务来提高性能和可靠性将是一种不错的选择。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67505938fbd23cf89076dbe0

纠错
反馈