使用 GraphQL 搭建基于微服务的后端架构

面试官:小伙子,你的代码为什么这么丝滑?

前言

在当前的互联网技术中,前后端分离已成为一种趋势。随着微服务架构的兴起,将后端系统拆分成多个独立的服务已变得非常普遍。然而,在面对大型应用的复杂性时,如何更好地协调这些服务之间的通信,以满足业务需求呢?在这个时候,GraphQL 就成了一个出色的选择。

GraphQL 是一种数据查询和操作语言,可以被用于构建 API。它提供了更加灵活和高效的数据查询方式,可以避免 RESTful API 存在的问题:例如 API 产生冗余请求和响应、缺少类型推导、多个请求需要合并等。

在这篇文章中,我们会深入了解 GraphQL 的工作原理和实现方式,并结合微服务架构的实战案例,向大家介绍如何使用 GraphQL 搭建基于微服务的后端架构。

GraphQL 的工作原理

GraphQL 的核心思想是开发者可以从 API 中获取他们需要的数据,并且可以按照自己的需求定义请求的数据结构,而不是像 RESTful API 那样受到固定的数据结构所束缚。

GraphQL 查询语言

GraphQL 查询语言类似于 JSON 格式,使用对象和字段来定义所需数据的结构。例如,以下查询请求将返回电影的标题和评级:

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

GraphQL 的数据类型

在 GraphQL 中,有六种基本类型:

  • Int: 32 位整型
  • Float: 浮点型
  • String: 字符串
  • Boolean: 布尔型
  • Enum: 枚举类型,枚举中的每个值必须是字符串类型
  • ID: 表示一个唯一 identifier 的字符串类型

开发者可以使用这些类型来定义他们需要的数据结构。

GraphQL 的解析流程

当一个 GraphQL 请求被发送到服务器时,它将被分解成多个字段,每个字段都代表一个特定的查询需求。GraphQL 查询语言允许开发者明确声明每个字段的返回结果。

然后,服务器会根据所需的字段执行相应的查询,根据需要从数据源中获取数据,并返回结果。使用这种方法,GraphQL 能够有效地处理复杂的查询需求,并且只返回指定的数据。

基于微服务的 GraphQL 实战案例

在这个实战案例中,我们将探讨如何使用 GraphQL 搭建基于微服务的后端架构。我们将创建两个微服务,一个服务负责管理用户数据,另一个服务负责管理文章数据。我们将使用 Apollo Server 和 Apollo Client 实现 GraphQL 的后端和前端。

创建前端应用

首先,我们将创建前端应用。打开终端并运行以下命令:

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

这将使用 Create React App 创建一个新的 React 应用,并将我们进入到该应用的根目录。

在根目录下,我们需要安装前端所需的依赖。打开终端并运行以下命令:

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

这将安装我们需要的一些依赖项,其中包括 Apollo Boost、GraphQL 和 React Apollo。

创建后端服务

我们将使用 Apollo Server 创建后端服务。在终端中运行以下命令以安装所需的依赖项:

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

然后,我们可以创建一个名为 index.js 的新文件,并将以下代码添加到其中:

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

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

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

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

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

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

在这个例子中,我们定义了一个 User 类型,当查询 users 时,返回这个类型的数组。我们还得到了一个硬编码的用户数据,稍后我们将从数据库中检索并返回它。

运行以下命令在终端中启动后端服务:

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

在启动时,这将开始监听端口 http://localhost:4000/graphql,我们可以在浏览器中访问该端口,并使用 GraphQL Playground 调试和测试我们的 GraphQL 服务器。

创建前端查询

我们将创建一个可以查询到用户数据的前端查询。首先,在 React 应用程序中,我们将打开 src/App.js 文件并将以下代码添加到文件的开头:

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

这部分代码导入了我们需要使用的 React、ApolloClient、ApolloProvider、Query 和 gql。

接下来,我们将实例化一个 Apollo 客户端,并将其传递给我们的应用程序,以便管理我们的数据。在 src/App.js 文件中,我们将添加以下代码:

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

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

这部分代码将实例化一个 Apollo 客户端。我们在应用程序的根目录下使用 ApolloProvider 将客户端作为 prop 提供,使我们的整个应用程序都能访问它。

接下来,我们将使用 Query 组件来执行我们的查询。在 src/App.js 文件中,我们将添加以下代码:

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

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

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

在这个例子中,我们定义了一个 GraphQL 查询,该查询返回用户的 id、name 和 email。我们还将使用 React Apollo 中的 Query 组件将这个查询添加到 React 应用程序中,并在返回的数据中映射这些值。

在我们的应用程序中,我们只需要在一个组件中传递 gql 查询定义,然后在一个函数式组件中传递此查询作为 query prop 来触发数据的获取和渲染。

联合查询

在上面的例子中,我们只查询了用户,并没有查询文章。现在,我们将使用 Apollo Client 来获取更多数据。

打开 src/App.js 文件并添加以下代码:

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

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

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

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

在这个例子中,我们定义了一个新的查询,该查询返回文章列表,每篇文章有标题和正文属性。

我们在应用程序中添加了第二个Query组件,该组件将获取我们的文章,并在返回的数据中映射相关的信息。

这两个查询是独立的,但是在实际应用中,我们可能想要查询及联合处理这两个表中的数据。我们将在下面进行更深入的探讨。

交叉查询

让我们现在仅查询每篇文章的作者姓名。在我们的 GraphQL 服务器上,我们可以更新 typeDefs 如下:

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

我们添加了一个新的 type ArticleWithUser,该类型包含文章和其作者的姓名。我们还添加了一个新的查询 articleWithUser,用于查询所有文章及其作者。

接下来,我们需要为新查询实现 resolvers。我们将改变 queries 实现,以便我们可以同时为一篇文章和其关联的作者进行查询:

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

现在,我们已经添加了作者的姓名到文章中,让我们将其添加到我们的 React 应用程序中。在 src/App.js 文件中,我们将更新 GET_ARTICLES gql 查询如下:

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

现在,我们已准备好让我们的 React 组件调用新查询。在 src/App.js 文件中,我们需要将第二个 Query 组件更新如下:

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

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

现在,我们的 React 应用程序打包到一起了基于微服务架构的 GraphQL 实战案例,并且可以同时查询用户和文章,还能够交叉查询每篇文章的作者名称。

结论

本文介绍了 GraphQL 的工作原理和实现方式,并结合基于微服务的案例,向大家展示了如何使用 GraphQL 搭建整体的后端架构。

使用 GraphQL 构建 API 可以增加可维护性、数据源扩展性和代码的可读性,同时减少性能问题和错误。

最后,我们希望这个案例可以启发读者探索 GraphQL 在微服务构建中的潜力,和了解如何使用它去联合API、交叉查询,以及实现微服务的复杂任务。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/66f3ca54f40ec5a964e4e64b


猜你喜欢

  • 在 Express.js 中使用 Pug 模板引擎

    在开发 Web 应用程序时,模板引擎是一个非常重要的工具。它可以帮助我们管理和组织 HTML、CSS 和 JavaScript 代码,使得我们可以更加专注于业务逻辑的实现。

    24 天前
  • Cypress:如何跳过指定测试用例?

    Cypress 是一款流行的前端自动化测试工具。在测试过程中,我们可能需要跳过某些测试用例,以便专注于更为重要的测试任务。在本文中,我们将介绍如何在 Cypress 中跳过指定测试用例,并提供示例代码...

    24 天前
  • Vue.js 中数据绑定到 input 框无法输入解决方法

    在使用 Vue.js 开发前端应用时,经常会遇到数据绑定到 input 框时无法输入的问题。这种情况主要是由于 Vue.js 对 input 框的双向数据绑定机制造成的。

    24 天前
  • Kubernetes 中 CI/CD 流水线的最佳实践

    随着云计算与容器技术的发展,越来越多的应用程序开始运行在 Kubernetes 环境中。在协调和扩展容器部署方面,Kubernetes 已经帮助了许多开发人员。但对于大多数项目来说,运行应用程序只是一...

    24 天前
  • PM2 遇到端口被占用问题的解决方案

    当我们使用 PM2 运行前端应用程序时,有时可能会遇到一个常见的问题——端口被占用。这是因为系统中已有一个进程正在使用该端口,而在尝试启动一个新的应用程序实例时,我们需要使用该端口。

    24 天前
  • 如何在 VSCode 中配置 ESLint 和 Prettier

    介绍 ESLint 和 Prettier 都是 JavaScript 中非常流行的代码检查工具。它们可以分别用来检查代码中潜在的问题和格式化代码风格。在本文中,我们将讨论如何在 VSCode 中配置 ...

    24 天前
  • 如何使用 Magento 进行响应式设计的开发

    引言 在今天的 Web 开发中,响应式设计已经成为了一个必不可少的部分。响应式设计是指在同一页面下,根据设备的不同分辨率、屏幕大小等终端特征,为用户提供最佳的浏览体验。

    24 天前
  • 从 DXP 到 Headless CMS:开启下一代内容管理

    从 DXP 到 Headless CMS:开启下一代内容管理 内容管理系统(CMS)是一种用于管理数字内容的软件,可以用于创建、编辑、发布和管理内容,如网站、博客、文档库等。

    24 天前
  • 为什么你的 RESTful API 不够 RESTful?

    引言 RESTful API 是设计 Web 服务的一种架构风格。它遵循 HTTP 协议的规范,用 HTTP 请求来实现对资源的访问,是现代 Web 开发中最常用的 API 设计模式之一。

    24 天前
  • 使用 Cypress 测试多语言网站的技巧

    在当今数字化的时代,全球化的概念越来越得到重视。许多公司的产品和服务不仅提供英语,而且还提供了多种其他语言,以确保其能在全球范围内获得成功。但是,如何测试这些多语言网站,以确保它们符合语言和域的特定要...

    24 天前
  • 浅谈 CSS Grid 中的子项目排序和定位

    介绍 CSS Grid 是一种流行的前端布局工具,它可以帮助我们有效地处理布局和排版的问题。其中,子项目排序和定位是 Grid 布局的一部分。通过排序和定位,我们可以更加精细地控制子项目的位置和大小。

    24 天前
  • 在 Sequelize 中创建唯一索引的方法

    在 SQL 中,索引是一种数据结构,用于提高数据库查询操作的效率。在 Sequelize 中,创建索引是一项关键的任务,它可以帮助我们减少查询时间和提高数据读取速度。

    24 天前
  • MongoDB 中如何处理大型数据量

    作为一种非关系型数据库,MongoDB 逐渐成为了许多应用的首选。然而,在应对大型数据量时,MongoDB 中的一些特性需要特别注意。本文将介绍 MongoDB 如何处理大型数据量,探讨如何进行优化并...

    24 天前
  • Redis 缓存穿透问题的解决方案

    在开发 Web 应用程序时,我们经常需要将数据库中读取的数据缓存到 Redis 中,以提高应用程序的性能。但是,当用户请求一个不存在的数据时,缓存就会失效,这种情况被称为缓存穿透。

    24 天前
  • 如何在 Webpack 中使用 Angular2?

    Angular2 是一种流行的前端框架,可用于构建现代的 Web 应用程序。在开发过程中,你需要使用一些工具来管理和构建你的应用程序,其中 Webpack 是一种非常流行的工具。

    24 天前
  • Custom Elements 中的最佳实践:封装变量

    在现代化网页开发中,Custom Elements 已经变得越来越重要,它允许开发者通过 HTML 标签自定义元素和组件,从而更加方便的构建 Web 应用程序。 然而,在实际开发中,我们可能会遇到一些...

    24 天前
  • React Hooks 在 Next.js 中的运用

    React是一种流行的JavaScript库,广泛应用于前端开发中。自React 16.8版本发布以来,React Hooks已经成为了React生态系统中的重要组成部分。

    24 天前
  • 使用 Kubernetes 部署 Istio 服务网格的步骤和注意事项

    前言 随着云原生时代的到来,微服务架构已成为前后端开发中不可避免的趋势。然而,微服务架构也带来了复杂度的提升,需要对服务之间的通信、负载均衡、故障恢复等问题进行处理。

    24 天前
  • WAI-ARIA 在无障碍设计中的应用

    随着数字化时代的到来,越来越多的人使用互联网进行日常生活中的事务。然而,对于一些身体残疾或认知障碍的人来说,使用网站或应用程序可能是一个挑战。 WAI-ARIA (Web Accessibility ...

    24 天前
  • GraphQL 中 change tracking 的最佳实践

    GraphQL 是一种强大的数据查询和操作语言,它的出现极大地简化了前后端数据交互的流程。GraphQL 的一个重要功能是 change tracking,它可以用来追踪数据的变化,了解数据的最新状态...

    24 天前

相关推荐

    暂无文章