1. 课程概述和设置
5m

👋 欢迎来到使用 Java 和 DGS 进行 GraphQL 联合!

我们很高兴您加入了我们在这个课程中,它是我们 和 Java 系列的一部分。

我们准备在 基础上进行构建,并深入研究可扩展的联合架构。在本课程中,我们将学习称为 超级图 的组件,也称为联合 架构。我们还有很多动手操作的机会,在现有 GraphQL API 上构建新功能。我们将使用一些主要的 组件来安全地发布这些更改: rover dev

让我们开始吧!

从 GraphQL API 开始

首先,让我们看看单个 API 是如何工作的。

A GraphQL server receives requests from clients and resolves them

当客户端需要一些数据时,它会向 发送一个 。服务器使用它的模式、数据获取器(有时称为 函数)和 来检索和解析这些数据,然后将其发送回客户端。这是一个非常棒的体验!

这种设置对于较小的项目或团队来说效果很好,但是当我们的 API 增长时会发生什么?当更多团队开始向我们的模式添加类型、 和功能时,我们的 API 会变得越来越难以管理、扩展和部署。这是单体后端服务中常见的一个瓶颈问题。

介绍联合

为了解决这个问题,我们可以将 API 的功能划分为多个 驱动的微服务,每个微服务负责 API 模式的一部分。当我们采用这种 联合架构 时,我们的每个微服务都被称为 子图,它们共同构成了我们 超级图 的基础。

An illustration of two subgraphs, with each subgraph having its own schema file, resolvers and data sources.

随着我们的 增长,它可以包含一个、两个,甚至两百个 !这完全取决于我们希望如何划分功能和能力,以帮助我们的团队进行构建和协作。

如果我们将 API 的功能拆分到许多不同的微服务中,客户端如何跨所有这些服务进行 ?为此,我们需要超级图的另一个组成部分: 路由器

了解我们所有的 ,并且还了解每个 在 API 模式中由哪个子图负责。客户端将查询发送到路由器,而路由器会智能地将它们分配到相应的子图。

The journey of a GraphQL operation, in a supergraph with the router and subgraphs

充当 API 的单一访问点,类似于 API 网关。由于路由器管理 如何 路由和解析请求,因此客户端无需担心与我们各个 通信!

遵循这种方法,我们可以扩展 API 以包含大量 和服务:所有功能都统一在单个智能 后面。

为什么要使用联合?

使用 架构,从客户端的角度来看没有任何变化。它们仍然与单个 端点( )通信,并且它们无需了解图在幕后是如何构建的。

在后端 API 方面,我们有了明确的关注点分离。通过将模式拆分为 ,后端团队可以独立地处理他们自己的子图,而不会影响处理其他子图的开发人员。并且由于每个子图都是一个独立的服务器,因此团队可以灵活地选择最适合他们的语言、基础设施和策略。

为了提供管理和构建联合 所需的可观察性和治理,我们将使用 Apollo GraphOS 来增强我们的 API。Apollo GraphOS 是一个完整的云平台,用于构建、管理和扩展您的 :它提供了一套工具和服务,使产品开发人员能够专注于更快地构建更好的应用程序。在本课程中,我们将探索 的主要组件!

我们正在构建的内容

在学习和练习这些联合概念时,我们将构建我们的课程项目: Airlock

The Airlock app homepage with a list of places to book.

Airlock 是一款星际旅行预订应用程序:我们可以用它来找到一个在广阔宇宙中住宿的好地方!我们已经构建了 listings 服务器的起点,该服务器位于 GraphQL 入门课程 中。在本课程中,我们将用一些新的重要数据来增强我们的列表:评论。在预订旅行之前,请查看其他旅行者对该住宿的评价——毕竟,口碑是最好的营销方式。

项目设置

要跟随课程进行学习,您需要以下内容

先决条件知识

我们假设您熟悉 概念,例如类型、查询和 。如果您需要复习,请查看我们的 使用 Java 和 DGS 进行 GraphQL 入门课程

您还应该熟悉 Java 编程概念(本课程使用 JDK 17)和 Spring Boot 的基础知识。

注意: 我们还提供使用 C# 和 Hot Chocolate 以及 使用 TypeScript 和 Apollo Server 的本课程。

代码编辑器或 IDE

许多流行的 IDE 提供插件,这些插件可以启用 语法高亮显示。对于 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 文件。 这是我们应用程序的起点。

@SpringBootApplication
public 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 设置

是 Apollo 的命令行界面 (CLI) 工具,它可以帮助开发人员处理 并与 交互。 它是一个方便且通用的工具,可用于本地开发和 CI/CD。

在接下来的课程中,我们将使用 在发布之前验证我们的本地更改。

安装 Rover

是 Apollo 的命令行界面 (CLI) 工具,它可以帮助开发人员处理 并与 交互。

任务!

练习

以下哪些是使用 Apollo Federation 的好处?

主要要点

  • 联邦是一种用于创建模块化 的架构,也称为 架构。
  • 一个 由一个或多个 组成。
  • 一个 是一个负责自身领域的 微服务。
  • 是管理如何路由和执行请求的单一端点,有点像 API 网关。

接下来

我们的列表很渴望获得客人的意见! 在下一课中,我们将迈出扩展 API 的第一步,并了解 的组成部分。

下一课

分享您关于本课的问题和评论

本课程目前处于

测试版
.您的反馈有助于我们改进! 如果您遇到问题或感到困惑,请告诉我们,我们将帮助您。 所有评论都是公开的,必须遵守 Apollo 行为准则。 请注意,已解决或已处理的评论可能会被删除。

您需要一个 GitHub 帐户才能在下面发布。 没有帐户? 改在我们的 Odyssey 论坛上发布。