👋 欢迎来到 TypeScript 版 GraphQL 联合!
我们很高兴你能加入我们的这个课程,加入我们的GraphQL 和 TypeScript 系列课程。
我们准备基于 GraphQL 基础进行构建,并深入探讨可扩展的联合架构。在本课程中,我们将学习被称为 超级图 的组件,它也被称为联合 GraphQL 架构。我们还有很多动手操作的机会,在现有的 GraphQL API 之上构建新功能。我们将使用一些主要的 GraphOS 组件来安全地发布这些更改: 架构检查、 发布 和 rover dev
。
让我们开始吧!
从 GraphQL API 开始
首先,让我们看看单个 GraphQL API 是如何工作的。

当客户端需要一些数据时,它会发送一个 GraphQL 操作 到 GraphQL 服务器。服务器使用其架构、 解析器 和 数据源 来检索和解析这些数据,然后将其发送回客户端。这是一次很棒的体验!
这种设置适用于较小的项目或团队,但是当我们的 API 增长时会发生什么?当越来越多的团队开始向我们的架构添加类型、 字段 和功能时,我们的 API 变得越来越难以管理、扩展和部署。这是单体后端服务的常见瓶颈问题。
介绍联合
为了解决这个问题,我们可以将 API 的功能划分为多个基于 GraphQL 的微服务,每个微服务负责 API 架构的不同部分。当我们采用这种 联合架构 时,我们的每个微服务都称为 子图,它们共同构成了我们 超级图 的基础。

随着我们 超级图 的增长,它可以包含一个、两个甚至两百个 子图!这完全取决于我们想要如何划分我们的功能和能力,以帮助我们的团队构建和协作。
如果我们把 API 的功能拆分成很多不同的微服务,客户端如何跨所有这些微服务进行 查询?为此,我们需要我们 超级图 的另一个部分: 路由器。
该 路由器 了解我们所有 子图,并且它还知道 API 架构中每个 字段 应该由哪个子图负责。客户端将查询发送到路由器,路由器会智能地将它们拆分到相应的子图中。

该 路由器 充当我们 API 的单一访问点,有点像 API 网关。由于路由器管理 如何 路由和解析请求,客户端无需担心与我们单独的 子图 通信!
按照这种方法,我们可以扩展 API 以包含许多 数据源 和服务:所有功能都统一在一个智能的 路由器 背后。
为什么要使用联合?
使用 超级图 架构,从客户端的角度来看,没有任何变化。它们仍然与单个 GraphQL 端点( 路由器)进行通信,并且它们不需要了解图在幕后是如何构建的。
在后端 API 端,我们有明确的关注点分离。通过将架构拆分成 子图,后端团队可以独立地工作在自己的子图上,而不会影响在其他子图上工作的开发人员。并且,由于每个子图都是一个单独的服务器,团队可以灵活地选择最适合他们的语言、基础设施和策略。
我们正在构建什么
在学习和练习这些联合概念时,我们将构建我们的课程项目: 气闸。
气闸是一个星际旅行预订应用程序:我们可以用它来找到一个宇宙中开放空间中酷炫的住宿地点!我们已经在 listings
服务器中构建了起点,它位于 TypeScript 版 GraphQL 入门课程 中。在本课程中,我们将使用一些新的重要数据来增强我们的房源:评论。在预订旅行之前,查看其他旅行者对住宿的评价——毕竟,口碑是最好的营销形式。
项目设置
要跟随课程学习,您需要具备以下内容
先决条件
我们假设您熟悉 GraphQL 概念,例如类型、查询和 变异。如果您需要复习,请查看我们的 TypeScript 版 GraphQL 入门课程。
您还应该熟悉 TypeScript 编程概念。
注意: 我们还提供本课程的 Java with DGS 和 C# with Hot Chocolate 版本。
代码编辑器或 IDE
我们使用 VS Code。
许多流行的 IDE 都提供插件,这些插件可以启用 GraphQL 语法高亮。对于 VS Code,我们推荐 GraphQL: 语法高亮扩展。
克隆存储库
让我们设置好代码。
打开一个终端,指向一个新目录,并运行以下命令
git clone https://github.com/apollographql-education/odyssey-federation-typescript.git
以下是项目结构: listings
目录提供我们所有房源数据。 router
目录目前包含一个名为 router-config.yaml
的文件。我们将在后面的课程中讨论该目录的作用。
📦 odyssey-federation-typescript┣ 📂 router┃ ┗ 📄 router-config.yaml┗ 📂 listings
运行应用程序
最后,让我们启动 listings
服务器。
在终端中导航到 listings
目录,并运行以下命令。
首先,安装软件包
npm install
接下来,启动服务器
npm run dev
不久之后,我们应该在终端中看到应用程序正在运行!
🚀 Server is running📭 Query at https://127.0.0.1:4000/
检查点
注册一个带有企业计划的 Apollo GraphOS 账户
本课程使用 托管联合 (下一课将详细介绍!),这需要一个带有 企业计划 的 Apollo 账户。如果您的组织使用的是其他计划,您仍然可以继续学习,但无法完成某些动手任务。您也可以通过 注册免费企业试用 来测试此功能。
Rover 设置
Rover 是 Apollo 的命令行界面 (CLI) 工具,可帮助开发人员使用 图 并与 GraphOS 交互。它是一个方便且用途广泛的工具,可用于本地开发和 CI/CD。
在接下来的课程中,我们将使用 Rover 在发布本地更改之前对其进行验证。
安装 Rover
Rover 是 Apollo 的命令行界面 (CLI) 工具,可帮助开发人员使用 图 并与 GraphOS 交互。
实践
关键要点
- 联合是一种用于创建模块化 图 的架构,也称为 超级图 架构。
- 一个 超级图 由一个或多个 子图 和 路由器 组成。
- 一个 子图 是一个负责其自身域的 GraphQL 微服务。
- 该 路由器 是管理请求如何路由和执行的单个端点,有点像 API 网关。
接下来
我们的列表渴望得到客人的评价!在下一课中,我们将迈出扩展 API 的第一步,并了解 超级图 的组成部分。
分享您对本课的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发布。还没有吗? 改为在我们的 Odyssey 论坛中发布。