在 GraphQL 中如何处理分布式架构

在现代 web 应用程序中,分布式系统变得越来越常见。分布式系统可以更好地处理高负载或复杂的问题,同时也有助于减少单点故障。然而,对于前端开发人员来说,这样的系统可能会增加复杂性。GraphQL是一种可以帮助处理这些复杂性的工具。本文将介绍如何在GraphQL中处理分布式架构。

什么是分布式架构?

分布式架构是指将应用程序的不同部分分配到不同的计算机或节点上。这些节点可以在同一物理位置或不同的位置上。对于 web 应用程序,分布式可以是在不同的服务器上运行不同的服务,例如数据库、文件系统或其他服务。

尽管分布式架构具有许多好处,但它也会增加复杂性,例如在处理网络延迟和处理相互调用的服务之间的复杂性方面。在GraphQL中,可以使用一些技术来帮助处理这些复杂性。

处理分布式架构的 GraphQL 技术

Schema Stitching

如果系统被设计为使用多个 GraphQL 实例,则可以使用Schema Stitching来将它们组合在一起。例如,在电子商务系统中,可能会有不同的 GraphQL 实例管理产品,订单和用户信息。使用Schema Stitching,可以将这些实例的 schema 组合在一起,使其在客户端看起来像单个 GraphQL 实例。

下面是一个基本的示例:

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

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

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

请注意,这只是一个基本示例,您可以根据需要调整它。这里,我们使用了 graphql-tools 中的 stitchSchemas 函数,它将 schema 和 link 组合到一起。

Federation

Federation是GraphQL工具链的另一种技术,它可以帮助处理分布式架构。Federation是一种基于 REST 的分布式系统的替代方案,它可以更好地管理分布式架构中的资源。Federation是由 Apollo GraphQL 开发的一个开源项目,可以轻松地在现有的实例和新的实例之间进行交互,并支持自定义指令。

下面是一个示例:

首先,在 servers 目录下创建一个 subgraph.js 文件,该文件包含订单服务的 schema。

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

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

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

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

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

然后,在另一个目录中创建后端网关,这是一个 Apollo Server,它聚合了所有子服务的 schema。

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

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

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

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

这里,我们使用了@apollo/gateway软件包创建了一个新的 Apollo Server。我们将 serviceList 选项用于识别后端服务并聚合它们的 schema。

结论

GraphQL是一种处理分布式系统的伟大工具。无论是使用Schema Stitching还是Federation,GraphQL可以帮助我们处理复杂性。如果您正在处理分布式架构,那么您应该仔细考虑使用GraphQL来管理您的服务。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/6711ef17ad1e889fe201a0ba