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

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

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

该 路由器 充当 API 的单一访问点,类似于 API 网关。由于路由器管理 如何 路由和解析请求,因此客户端无需担心与我们各个 子图 通信!
遵循这种方法,我们可以扩展 API 以包含大量 数据源 和服务:所有功能都统一在单个智能 路由器 后面。
为什么要使用联合?
使用 超级图 架构,从客户端的角度来看没有任何变化。它们仍然与单个 GraphQL 端点( 路由器)通信,并且它们无需了解图在幕后是如何构建的。
在后端 API 方面,我们有了明确的关注点分离。通过将模式拆分为 子图,后端团队可以独立地处理他们自己的子图,而不会影响处理其他子图的开发人员。并且由于每个子图都是一个独立的服务器,因此团队可以灵活地选择最适合他们的语言、基础设施和策略。
为了提供管理和构建联合 图 所需的可观察性和治理,我们将使用 Apollo GraphOS 来增强我们的 API。Apollo GraphOS 是一个完整的云平台,用于构建、管理和扩展您的 图:它提供了一套工具和服务,使产品开发人员能够专注于更快地构建更好的应用程序。在本课程中,我们将探索 GraphOS 的主要组件!
我们正在构建的内容
在学习和练习这些联合概念时,我们将构建我们的课程项目: Airlock。
Airlock 是一款星际旅行预订应用程序:我们可以用它来找到一个在广阔宇宙中住宿的好地方!我们已经构建了 listings
服务器的起点,该服务器位于 GraphQL 入门课程 中。在本课程中,我们将用一些新的重要数据来增强我们的列表:评论。在预订旅行之前,请查看其他旅行者对该住宿的评价——毕竟,口碑是最好的营销方式。
项目设置
要跟随课程进行学习,您需要以下内容
先决条件知识
我们假设您熟悉 GraphQL 概念,例如类型、查询和 变异。如果您需要复习,请查看我们的 使用 Java 和 DGS 进行 GraphQL 入门课程。
您还应该熟悉 Java 编程概念(本课程使用 JDK 17)和 Spring Boot 的基础知识。
注意: 我们还提供使用 C# 和 Hot Chocolate 以及 使用 TypeScript 和 Apollo Server 的本课程。
代码编辑器或 IDE
我们使用 IntelliJ IDEA(社区版)。
许多流行的 IDE 提供插件,这些插件可以启用 GraphQL 语法高亮显示。对于 IntelliJ,我们建议使用 GraphQL 插件。
克隆仓库
让我们开始设置我们的代码。
打开一个终端到一个新目录并运行以下命令
git clone https://github.com/apollographql-education/dgs-federation.git
以下是项目结构:listings
目录提供了我们所有的列表数据。 router
目录目前包含一个名为 router-config.yaml
的文件。 我们将在后面的课程中讨论这个目录的作用。
📦 dgs-federation┣ 📂 router┃ ┗ 📄 router-config.yaml┗ 📂 listings
运行应用程序
最后,让我们启动并运行我们的 listings
服务器。
在您的 IDE 中打开 listings
目录,并导航到位于 com.example.listings
包中的主 ListingsApplication
文件。 这是我们应用程序的起点。
@SpringBootApplicationpublic class ListingsApplication {public static void main(String[] args) {SpringApplication.run(ListingsApplication.class, args);}}
在 IntelliJ 中,我们在 main
函数旁边(或者界面顶部的)的边距处有一个方便的绿色播放按钮。
或者,您可以在项目的根目录中打开一个新的终端并运行以下命令
./gradlew bootRun
在 IDE Run 输出中,我们应该看到我们的应用程序正在运行!
> Task :ListingsApplication.main(). ____ _ __ _ _/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \\\/ ___)| |_)| | | | | || (_| | ) ) ) )' |____| .__|_| |_|_| |_\__, | / / / /=========|_|==============|___/=/_/_/_/:: Spring Boot :: (v3.2.5)
检查点
注册一个带有企业计划的 Apollo GraphOS 帐户
本课程使用 托管式联邦 (下一课将详细介绍!),这需要一个带有 企业计划 的 Apollo 帐户。 如果您的组织使用的是其他计划,您仍然可以学习,但无法完成某些动手任务。 您也可以通过 注册免费企业试用 来测试此功能。
Rover 设置
Rover 是 Apollo 的命令行界面 (CLI) 工具,它可以帮助开发人员处理 图 并与 GraphOS 交互。 它是一个方便且通用的工具,可用于本地开发和 CI/CD。
在接下来的课程中,我们将使用 Rover 在发布之前验证我们的本地更改。
安装 Rover
Rover 是 Apollo 的命令行界面 (CLI) 工具,它可以帮助开发人员处理 图 并与 GraphOS 交互。
练习
主要要点
- 联邦是一种用于创建模块化 图 的架构,也称为 超级图 架构。
- 一个 超级图 由一个或多个 子图 和 路由器 组成。
- 一个 子图 是一个负责自身领域的 GraphQL 微服务。
- 路由器 是管理如何路由和执行请求的单一端点,有点像 API 网关。
接下来
我们的列表很渴望获得客人的意见! 在下一课中,我们将迈出扩展 API 的第一步,并了解 超级图 的组成部分。
分享您关于本课的问题和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发布。 没有帐户? 改在我们的 Odyssey 论坛上发布。