Serverless GraphQL 的实现和使用优化

阅读时长 7 分钟读完

Serverless 架构以及 GraphQL 的兴起,为前端开发带来了全新的发展机遇。Serverless 架构通过将应用程序的部署和运行都交给第三方云服务提供商,大幅简化了前端工程师的部署工作;而 GraphQL 则可以帮助前端开发者在网络传输中减少冗余、提升性能以及灵活性。将二者结合起来,可以帮助前端应用极大地提升可扩展性和用户体验。本文将介绍 Serverless GraphQL 的实现和使用优化,并提供示例代码。

什么是 Serverless GraphQL

Serverless 架构是指将应用程序的构建、部署和扩展等工作都交给云服务提供商,从而大幅简化开发者的工作流程。在 Serverless 架构中,开发者只需上传代码,并指定一些触发器(比如 HTTP 请求、定时器、数据库事件等),云服务提供商会自动为开发者维护基础设施,并按照触发器的规则运行代码。因为无需自行购买和维护服务器,开发者能够专注于业务逻辑的实现,从而提升生产效率。

与此相对,传统的服务器架构存在诸多局限性,比如需要耗费大量时间和经费来购买和维护服务器,同时还需要开发者自行处理服务器的扩展、维护和缩容等工作。因此,Serverless 架构成为了前端开发者的首选。

GraphQL 是一种由 Facebook 推出的 API 查询语言和运行时。GraphQL 与 RESTful API 不同,它允许开发者在一个请求中定义需要的数据,从而减少网络传输中冗余数据的传输。GraphQL 的数据模型之间的组合也更为灵活,能够高效并发地处理多个请求,并且允许将多个数据源整合在一起。因此,GraphQL 成为了前端开发者的另一种首选。

Serverless GraphQL 将两者结合起来,能够进一步提升前端应用的性能,并提供更灵活的查询和数据模型处理方式。

实现 Serverless GraphQL

要实现 Serverless GraphQL,需要用到以下工具和技术:

  • AWS Lambda,用于运行 GraphQL 服务器;
  • AWS API Gateway,用于管理和部署 GraphQL 服务器的 HTTP 端点;
  • Apollo Server Lambda,用于创建和运行 GraphQL 服务器;
  • AWS DynamoDB,用于存储和查询数据。

下面,我们将详细介绍实现 Serverless GraphQL 的步骤。

创建 AWS Lambda 函数

首先,我们要创建一个 AWS Lambda 函数,用于运行 GraphQL 服务器的代码。在 AWS Lambda 控制台中,点击“创建函数”,然后选择“从头开始创建”。

在“基本信息”页面中,输入函数名称、描述和运行时。我们选择 Node.js 14.x 作为运行时,并创建了一个名为“graphql-server”的 Lambda 函数。

在“函数代码”页面中,选择“上传 ZIP 文件”,并上传包含 GraphQL 服务器代码的 zip 文件。接下来,我们需要为 Lambda 函数配置执行角色、VPC、环境变量等设置。

创建 AWS API Gateway API

下一步,我们需要创建一个 AWS API Gateway API,用于管理和部署 GraphQL 服务器的 HTTP 端点。在 AWS API Gateway 控制台中,选择“REST API”,然后选择“新建 API”。

在“新建 API”页面中,输入 API 名称、描述和协议。我们选择 REST 协议,并创建了一个名为“graphql-server-api”的 API。

创建 API 后,在“资源”->“任意资源”下创建一个新资源并添加方法。选择“任意”作为资源路径,并选择“POST”作为方法。然后,将此方法关联到新创建的 Lambda 函数,并设置 Lambda 函数的输入和输出格式。最后,在“方法执行”页签中,勾选“使用 Lambda 代理集成”选项,并保存 API 配置。

到此,我们已经完成了 Serverless GraphQL 的基本构建。我们还需要运行 GraphQL 服务器并连接到数据源。

运行 GraphQL 服务器

要运行 GraphQL 服务器,我们可以使用 Apollo Server Lambda。首先,需要安装它:

然后,在 Lambda 函数的入口文件中添加以下代码:

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

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

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

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

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

以上代码中,我们首先定义了 GraphQL schema,然后使用 Apollo Server Lambda 创建了一个 GraphQL 服务器实例,并导出了 Lambda 处理程序。

当您运行 Serverless GraphQL API 时,基于 AWS Lambda 的 GraphQL 服务器将被运行。通过使用 Apollo Server Lambda,我们可以在足够灵活的环境下拓展 Query、Mutation 和 Subscription 类型。

与 AWS DynamoDB 集成

要与 AWS DynamoDB 集成,可以使用 AWS SDK for Node.js。首先,需要安装它:

然后,我们需要在 Lambda 函数中添加以下代码:

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

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

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

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

以上代码中,我们首先引用了 AWS SDK for Node.js 中的 AWS DynamoDB 客户端。随后,我们定义了一个新的 resolver,用于调用 AWS DynamoDB 来获取数据。最后,我们需要在数据库中创建“itemsTable”表,并在 Lambda 函数的环境变量中配置 AWS 访问密钥和密钥 ID。

使用优化

在实现 Serverless GraphQL 后,我们需要考虑使用优化。以下是一些有用的优化技巧。

使用 AWS Serverless Architecture 自动扩缩容

AWS Serverless Architecture 使用了自动扩缩容功能来对您的 GraphQL API 进行便捷、自动管理。这使得您无需考虑服务器的扩展或缩减。

调整 AWS Lambda 函数配置

调整 AWS Lambda 函数的内存大小和请求天花板可以使 GraphQL API 在负载中呈现出更大的性能优势。您可以使用 AWS Lambda 上定义的按需内存模式,这样,您无需在管道中保持闲置服务器。

启用缓存

在 GraphQL 应用中使用现有的缓存技术(如 Redis 或 Memcached)以及 GraphQL 应用自带的查询缓存,能大大减少将信息传递给服务器的请求量。

结论

本文介绍了如何实现和使用 Serverless GraphQL,以及一些使用优化。Serverless 架构通过将应用程序的构建、部署和扩展等工作都交给第三方云服务提供商,大幅减少了前端工程师的部署工作;而 GraphQL 则可以帮助前端开发者在网络传输中减少冗余、提升性能以及灵活性。将二者结合起来,可以帮助前端应用极大地提升可扩展性和用户体验。本文还提供了示例代码,以帮助您更好地使用 Serverless GraphQL。

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

纠错
反馈