微服务中使用 GraphQL 进行数据通信的技术实践

AI 编程助手,豆包旗下的编程助手,提供智能补全、智能预测、智能问答等能力,节省开发时间,释放脑海中的创造力,支持 VSCode,点击体验 AI

最近几年,微服务架构在Web开发领域受到越来越多的追捧。但是,微服务架构中有一个非常头痛的问题:不同服务之间的数据通信问题。不同的微服务之间通信的方式有很多种,但大多数情况下,我们使用RESTful API来进行通信。RESTful API是一种简单易用的通信方式,但是它的缺点也很明显:API 接口较多时维护成本高、数据冗余及性能问题等。而 GraphQL,因其具有高度灵活性,强大的查询能力和节约流量的特点,正逐渐成为微服务架构中数据通信的首选方案。本文将介绍在微服务架构中使用 GraphQL 进行数据通信的技术实践。

什么是 GraphQL

GraphQL 是一种由Facebook开发的数据查询语言和运行时。GraphQL 构建于类型系统之上,并允许客户端根据需要声明需要查询的数据,并在单个请求中进行多个查询。GraphQL 还允许开发人员通过定义自己的类型和关系来扩展现有数据模型。

使用GraphQL,客户端可以精确地声明它需要哪些数据,并获得提供单个请求所需数据的响应。这意味着可以避免在传统 RESTful APIs 中常见的“过度拉取”的问题(即获取比所需数据更多的数据)。

GraphQL 提供了以下优点:

  • 灵活性:GraphQL 允许你描述你的数据模型,包括类型属性。客户端可以通过声明需要的属性来查询任何级别的数据支持。这种灵活性使得 GraphQL 非常适合微服务架构中的数据通信。

  • 节省网络带宽:在单个 GraphQL 请求中执行多个查询,而不是多个 RESTful API 请求。这大大降低了网络的负担,尤其是当网络性能受到限制的时候。

  • 避免“过度拉取”:传统 RESTful API 接口通常返回大量的数据,其中大部分对于客户端来说都不需要。GraphQL 允许开发者精确地声明需要哪些数据,并且只返回所需数据。

微服务和 GraphQL

微服务架构有很多优势,也有很多挑战。其中一个重要的问题是服务之间的数据通信问题。RESTful API 是一种使客户端和 Web 服务进行通信的常见方式。对于单个服务而言,这个方案可能是不错的。但在微服务架构中,如果每个服务都有自己的RESTful API,那么就会出现大量的API接口,我们需要在这些接口间花费大量的时间和精力,同时还会产生代码冗余、维护成本高等问题。

此时,GraphQL 作为新的数据通信协议,可以解决上述问题。相较于 RESTful API,GraphQL 有以下优点:

  • 可自动化生成GraphQL API,减少API的维护成本
  • 更精细的权限控制
  • 更高效的数据传输协议

GraphQL 和微服务的整合

在将 GraphQL 应用于微服务架构之前,我们需要明确几个概念:服务端,数据源和客户端。在微服务中,每个服务都有一个服务端、数据源(通常是数据库)和一个或多个客户端,而GraphQL通常被用于服务端和客户端之间的数据通信。下面是将 GraphQL 应用于微服务架构的步骤:

第一步:为服务定义 GraphQL API

为给定服务创建 GraphQL API是第一步。这可以通过 a GraphQL schema 描述服务的数据模型来完成。为了使用GraphQL,服务应该实现 GraphQL 的数据查询语言,并能以 GraphQL schema 的形式定义服务数据模型的结构。

例如,让我们考虑一个由两个微服务组成的医院管理应用程序。其中一个服务提供患者信息,另一个服务提供医生信息。我们可以使用 GraphQL 为每个服务创建 schema,如下所示:

patientService

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

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

doctorService

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

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

第二步:在服务端实现 GraphQL API

为了实现 GraphQL API,我们需要一个 GraphQL Server。GraphQL的生态中,有很多常用的GraphQL的服务实现,例如 Apollo、Prisma等。在我们的医院管理应用程序中,我们可以使用Apollo GraphQL server作为我们的GraphQL server实现,如下所示:

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

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

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

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

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

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

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

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

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

请注意,我们在这里定义了一个GraphQL schema,绑定了数据库中Patient的查询操作。在请求 '/graphql' 路径时会触发一个GraphQL查询请求,并在patients中返回所有患者数据和patient(id:ID!) 中按照ID返回单个患者数据。

第三步:将 GraphQL API 集成到客户端

最后,我们需要在客户端中使用 GraphQL API。我们可以使用各种语言和框架来实现客户端。在这个例子中,我们使用 React 作为我们的客户端,并使用 Apollo-Client 作为我们的 API 客户端,如下所示:

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

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

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

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

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

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

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

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

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

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

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

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

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

在这个例子中,我们通过查询Patient服务中的所有患者的API将患者的列表显示出来,并使用gql模板标记定义GraphQL查询,如下所示:

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

最后我们将PATIENTS_QUERY查询加载到组件中:

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

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

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

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

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

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

此处的PatientList组件首先会向 patientService-GraphQL 服务请求获取所需的患者数据,然后使用返回的数据来渲染页面。

结论

在微服务架构中使用 GraphQL 进行数据通信的优势显而易见:灵活性、节省网络带宽和避免“过度拉取”,都可以改善微服务架构的数据通信问题。在实际应用过程中,我们可以选择不同的 GraphQL Server 或 GraphQL Client 来搭建应用。例如,我们可以使用Apollo-Server作为我们的GraphQL Server实现,使用 Apollo-Client 作为我们的API客户端实现,从而在微服务架构中实现更高效、更精细的数据传输。对于那些希望减少API维护成本、保证数据安全性和提高应用程序性能的开发人员,使用 GraphQL 是一种非常好的选择。

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


猜你喜欢

  • 使用 Enzyme 对 React Native 应用程序进行端到端测试的方法和技巧

    React Native 是一种流行的跨平台移动应用程序开发框架,它允许开发人员使用 JavaScript 和 React 来构建原生应用程序。Enzyme 是一个用于 React 和 React N...

    4 天前
  • ES8 Array.includes() 和 String.padStart() 函数解析

    在 JavaScript 中,ES8 带来了许多新的特性和函数,其中 Array.includes() 和 String.padStart() 函数是其中两个非常有用的函数。

    4 天前
  • 如何解决 MongoDB 中的 socket 错误

    在使用 MongoDB 进行开发时,有时候会遇到 socket 错误,这会导致应用程序无法正常工作。本文将介绍如何解决 MongoDB 中的 socket 错误,并提供示例代码以方便理解。

    4 天前
  • RxJS Observer 的使用及注意事项

    在前端开发中,RxJS Observer 是一个非常强大的工具,它可以用来处理异步数据流。本文将介绍 RxJS Observer 的使用方法以及注意事项,并提供示例代码帮助读者更好地理解。

    4 天前
  • Serverless 应用中使用 SQS 的最佳实践

    什么是 Serverless? Serverless 是一种云计算架构,它使开发人员能够构建和运行应用程序和服务,而无需管理基础架构。这意味着开发人员只需专注于编写应用程序代码,而不必担心服务器、操作...

    4 天前
  • 如何优化 Babel 编译 React 项目的性能

    随着 React 技术的不断发展,我们的前端项目也越来越复杂,同时也需要更高效的编译工具。Babel 是一个广泛使用的编译器,它可以将新的 ECMAScript 语法转换成浏览器可以识别的代码。

    4 天前
  • Mongoose 中新的自定义 validators 实现方法

    Mongoose 中新的自定义 validators 实现方法 Mongoose 是一款 Node.js 的对象模型工具,它提供了一种将数据存储到 MongoDB 中的方法,同时还可以使用 Mongo...

    4 天前
  • 我们为什么放弃了 React Native 以及解决方案

    React Native 是一种基于 React 的移动应用开发框架,它可以让开发者使用 JavaScript 和 React 来构建原生应用。这个框架被广泛使用,因为它可以提高开发效率和跨平台性能,...

    4 天前
  • 基于 LESS 创建响应式网站的最佳实践

    LESS 是一种预处理器,它可以帮助前端开发人员更轻松地编写 CSS。在 LESS 中,你可以使用变量、嵌套、混合和函数等高级功能,从而提高代码的可读性和可维护性。

    4 天前
  • 使用 Next.js + Firebase 实现 SSR 数据同步的教程

    在现代 Web 开发中,服务器端渲染(SSR)和实时数据同步已经成为了非常流行的技术。Next.js 是一个基于 React 的 SSR 框架,而 Firebase 则是一个实时数据同步的后端服务。

    4 天前
  • Redux 方案优化 —— 数据过大时的处理方法

    在前端开发中,Redux 是一个非常流行的状态管理方案。它通过单一状态树来管理应用的状态,使得状态的变化可预测且易于调试。然而,当应用的状态数据过大时,Redux 的性能可能会受到影响。

    4 天前
  • Docker 容器中如何配置 Java 环境变量?

    随着 Docker 技术的不断普及,越来越多的应用程序开始在 Docker 容器中运行。而在 Java 应用程序中,Java 环境变量是非常重要的一部分,因为它们可以影响到应用程序的性能和稳定性。

    4 天前
  • Hapi 框架与 ReactJS 整合核心技术

    前言 Hapi 是一个 Node.js 的开源框架,用于构建可扩展的 Web 应用程序。ReactJS 是 Facebook 开源的一个 JavaScript 库,用于构建用户界面。

    4 天前
  • 如何在 React 应用程序中使用 Server-sent Events

    Server-sent Events (SSE) 是一种基于 HTTP 的服务器推送技术,它允许服务器向客户端发送事件流,这些事件流可以是任何类型的数据,如 JSON、HTML 或文本。

    4 天前
  • 如何调试 GraphQL 查询中的字段解析错误

    GraphQL 是一种用于 API 的查询语言,它允许客户端指定需要从服务器获取的数据。在 GraphQL 中,查询和数据之间的关系由类型系统定义。当客户端向服务器发送一个查询请求时,服务器会根据类型...

    4 天前
  • React 网络请求及返回数据集成测试时如何使用 Enzyme?

    在 React 应用程序中,网络请求和返回数据是非常重要的一部分。然而,这些请求和数据的处理可能会导致应用程序出现问题,因此在编写前端代码时需要进行集成测试以确保应用程序的正确性。

    4 天前
  • 了解 ES8:指数运算符:**

    简介 ES8(ECMAScript 2017)是 JavaScript 的最新版本,于 2017 年发布。它引入了许多新的功能和语言特性,包括指数运算符:**。指数运算符是一种新的二元运算符,用于计算...

    4 天前
  • 前端工作中 Redux 数据更新的问题及处理方法

    引言 Redux 是一个非常流行的状态管理库,它被广泛应用于 React 应用程序中。在前端开发中,Redux 可以帮助我们管理应用程序的状态,使得我们能够更加方便地更新状态并且实现组件之间的数据共享...

    4 天前
  • Docker 部署应用的最佳实践和注意事项

    Docker 是一个流行的容器化技术,可以帮助前端开发者更轻松地部署应用程序。本文将介绍 Docker 部署应用的最佳实践和注意事项,以及一些示例代码。 Docker 的基本概念 在开始之前,让我们先...

    4 天前
  • Webpack 打包和部署 SPA 应用的最佳实践

    随着前端技术的不断发展,单页面应用(SPA)越来越受到开发者的欢迎。而在 SPA 的开发过程中,Webpack 打包和部署是非常重要的一步。本文将介绍 SPA 应用中 Webpack 打包和部署的最佳...

    4 天前

相关推荐

    暂无文章