使用 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


猜你喜欢

  • 用 Polymer 创建自定义的 Custom Elements

    随着 Web 技术不断发展,前端开发逐渐形成了一整套规范和标准。其中 Web Components 是一种新兴的技术,它可以让我们创建自定义的 HTML 标签,提供了更具模块化和封装性的组件开发方式。

    2 个月前
  • Webpack 打包产生的 JS 文件过大的解决方案

    在前端开发中,Webpack 是一个非常重要的工具,它可以将多个 JS 文件打包成一个文件,减少 HTTP 请求次数,提高页面加载速度。但是,打包后的 JS 文件可能会非常大,会导致页面加载缓慢,甚至...

    2 个月前
  • SSR 实践:使用 Next.js 构建 SEO 尺度的博客网站

    随着互联网的发展,越来越多的人开始使用搜索引擎来获取信息和服务。因此,SEO(搜索引擎优化)变得越来越重要。在这篇文章中,我们将介绍如何使用 Next.js 框架构建 SEO 尺度的博客网站。

    2 个月前
  • webpack 中的 babel-loader 串联通开启指南

    在前端开发中,我们经常会使用到 webpack 进行模块打包和构建。而对于使用 ES6 或者更高版本的 JavaScript 进行开发的人来说,我们会使用 Babel 将代码转换为 ES5,以兼容更多...

    2 个月前
  • ES6 及其 Promise 对象的异步编程方法

    ES6 是 ECMAScript 的一个重要版本,它引入了许多新特性,其中包括 Promise 对象。Promise 对象是 ES6 中处理异步编程的方法之一,它可以大大简化异步代码的编写和处理。

    2 个月前
  • 在 Cypress 中集成邮件验证功能测试

    前言 邮件验证是在现代网络应用程序中常见的重要操作之一,它是验证用户电子邮件和确认用户电子邮件的过程。如果您正在测试一个需要邮件验证的 Web 应用程序,您需要确保您的测试代码可以模拟这一功能。

    2 个月前
  • 在Deno中使用Google API

    介绍 Deno是一个安全的JavaScript和TypeScript运行时环境,可以用于编写Web应用程序,脚本和工具。 Google API是一组开放式API,用于创建Web,移动和桌面应用程序中的...

    2 个月前
  • Angular5:用最新 Angular 打造 SPA 应用

    介绍 Angular 是一个流行的前端框架,它已经成为许多应用程序的首选框架。而在 2017 年,Angular 推出了它的第五个主要版本。Angular5 加强了性能方面的许多方面,并增加了很多新功...

    2 个月前
  • 微信小程序在 qaixin 项目中调用 Chai

    在前端测试领域中,Chai 是一个非常有名的断言库,它支持多种语法风格,包括 BDD 和 TDD 等。同时,微信小程序也是近年来变得越来越流行的前端技术。 在本文中,我们将介绍如何在 qaixin 项...

    2 个月前
  • Enzyme 测试 React 兄弟组件通信的最佳实践

    Enzyme 是一个用于测试 React 组件的 JavaScript 库,它提供了简单易用的 API 和强大的断言功能,用于测试应用程序的行为和状态。本文将介绍如何使用 Enzyme 对 React...

    2 个月前
  • Angular 应用中 RxJS switchCase 的应用场景与实践

    前言 Angular 是一个流行的前端框架,利用它可以轻松地开发单页应用程序和移动应用程序。而且 Angular 在处理异步数据流方面十分强大,并且使用 RxJS 工具来实现这一点。

    2 个月前
  • PWA 的兼容性问题分析

    随着互联网技术的不断发展,PWA(渐进式 Web 应用程序)成为一种受欢迎的移动端解决方案。它可以让 Web 应用程序呈现类似原生应用程序的体验并提供离线访问能力,但是在实践中,我们会发现PWA存在着...

    2 个月前
  • Flexbox 学习笔记(一)

    引言 在前端开发中,页面布局是一个很重要的方面。传统的布局方式如浮动、定位等会带来一些问题,如不易控制元素间的间距、浮动高度问题等。而使用 Flexbox 布局则可以有效地解决这些问题,因此 Flex...

    2 个月前
  • 使用 Custom Elements 构建 Web 组件开发流程

    在现代 Web 应用程序中,Web 组件已成为构建现代 Web 应用程序不可或缺的重要组成部分之一。使用 Web 组件,您可以简化代码库并使开发更加可维护和可扩展。

    2 个月前
  • Vue.js 中过渡效果的实现方法及注意事项

    Vue.js 是一个流行的 JavaScript 框架,用于构建网页应用程序。Vue.js 通过指令和组件的方式提供了强大的过渡效果功能。本文将介绍 Vue.js 中过渡效果的实现方法及注意事项。

    2 个月前
  • 在 Web Components 中使用 Web Workers 的方法详解

    随着现代浏览器的出现,Web Components 正在越来越受到前端开发者的关注。Web Components 可以让我们以更加模块化、高效和可重用的方式构建 web 应用程序。

    2 个月前
  • Next.js 构建大规模应用程序最佳实践

    随着应用程序规模的增加,前端开发也面临越来越多的挑战。Next.js 是一个基于 React 的轻量级框架,提供了许多构建大规模应用程序的最佳实践。本文将深入探讨 Next.js 的技术特点和如何使用...

    2 个月前
  • Cypress 多浏览器测试实践

    在前端开发中,多浏览器测试是一个必不可少的环节,因为不同的浏览器可能会有不同的兼容性问题。Cypress 是一个流行的前端端到端测试框架,它支持多种浏览器的测试。本文将介绍使用 Cypress 进行多...

    2 个月前
  • Docker Hub: 存储与分享 Docker 镜像

    前言 在当前的软件开发中,Docker 已经成为了不可或缺的一部分。它们旨在通过创建轻量级、可重复、安全和可移植的容器来解决许多软件开发和部署的问题。而且,Docker 镜像是这一生态系统的核心组件。

    2 个月前
  • 使用 Serverless 构建 Time-based Workflow

    随着云计算的发展,Serverless 技术吸引了越来越多的开发者。Serverless 架构在减少了关注底层基础架构的工作的同时,也可以帮助开发者更快速地构建复杂的应用程序和工作流程。

    2 个月前

相关推荐

    暂无文章