👋 欢迎来到使用 .NET (C#) 和 Hot Chocolate 实现 GraphQL 联邦!
想要将您的GraphQL API 提升到新的水平吗?您来对地方了!
如果您使用 GraphQL 构建了产品和体验,那么您就会知道它有多强大!您已经感受到了 查询 您所需数据的满足感,并且能够以您所需的形式获取数据。此外,能够将多个 数据源 和服务混合在一个端点下非常有用!
那么下一步是什么?我们可能渴望让我们的 API 发展和演变。我们希望提供更丰富的体验,这意味着添加更多成分:更多 数据源、更多服务、更多功能、更多能力。那么我们如何保护我们的 API 并促进其以一种能让我们取得成功的方式发展呢?
在本课程中,我们将学习称为 超级图 的组件,也称为联邦 GraphQL 架构。我们还有很多动手实践的机会,将在现有 GraphQL API 之上构建新功能。我们将使用一些主要的 GraphOS 组件安全地发布这些更改: 模式检查、 发布 和 rover dev
。
让我们开始吧!
在本课中,我们将
- 确定联邦 图 架构的关键部分
- 设置我们的课程项目
从 GraphQL API 开始
首先,让我们看看单个 GraphQL API 是如何工作的。

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

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

该 路由器 充当我们 API 的单个访问点,类似于 API 网关。因为路由器管理 如何 路由和解析请求,所以客户端无需担心与我们的各个 子图 通信!
遵循这种方法,我们可以扩展我们的 API 以包含许多 数据源 和服务:所有功能都统一在一个智能的 路由器 后面。
为什么要使用联邦?
使用 超级图 架构,从客户端的角度来看没有任何变化。他们仍然与单个 GraphQL 端点( 路由器)通信,他们无需了解图在幕后是如何构建的。
在后端 API 方面,我们有明确的分工。通过将我们的模式拆分为 子图,后端团队可以独立地处理自己的子图,而不会影响处理其他子图的开发人员。并且由于每个子图都是一个独立的服务器,因此团队可以选择最适合自己的语言、基础设施和策略。
我们正在构建的内容
在我们学习和实践这些联邦概念时,我们将构建我们的课程项目: MusicMatcher。
MusicMatcher 是一个音乐目录应用程序:我们可以使用它来为合适的时刻找到合适的配乐。在本课程中,我们将把我们的配乐推荐带入我们日常生活中的一种常见活动:烹饪!找到在您为最新作品调味时聆听的完美播放列表。
我们在 GraphQL 服务器 中构建了这个应用程序的基础部分。GraphQL 简介 课程。这个配乐服务器将成为我们 超级图 中的第一个 子图。它负责模式中所有关于播放列表和音轨的类型和 字段。
让我们准备好开始构建!
项目设置
要跟随本课程,您需要以下内容
先决条件知识
本课程使用 C# 和 .NET 8。您应该熟悉 C# 基础编程概念才能跟随本课程学习。
我们也建议熟悉GraphQL的基本知识,并使用 Hot Chocolate 框架构建一个GraphQL 服务器。我们将使用基于注解的方法。如果你需要复习,请查看GraphQL 入门课程。
注意: 我们也提供此课程的Java with DGS 和TypeScript with Apollo Server 版本。
代码编辑器或 IDE
我们将使用VS Code,但你可以随意使用你最喜欢的 .NET 开发编辑器或 IDE!
在本地克隆仓库
项目仓库是完成GraphQL 入门课程的结果,并添加了其他配置来启用联合。
我们建议从头开始并克隆以下仓库
git clone https://github.com/apollographql-education/odyssey-federation-hotchocolate
以下是项目的外观
📦 Odyssey.MusicMatcher┣ 📂 .config┃ ┣ 📄 dotnet-tools.json┣ 📂 Data┃ ┣ 📄 SpotifyService.cs┃ ┣ 📄 swagger.json┣ 📂 Types┃ ┣ 📄 AddItemsToPlaylistInput.cs┃ ┣ 📄 AddItemsToPlaylistPayload┃ ┣ 📄 Mutation.cs┃ ┣ 📄 Playlist.cs┃ ┣ 📄 Query.cs┃ ┣ 📄 Track.cs┣ 📂 Properties┃ ┣ 📄 launchSettings.json┣ 📂 Router┃ ┣ 📄 router-config.yaml┃ ┣ 📄 .env┃ 📄 appsettings.Development.json┃ 📄 appsettings.json┃ 📄 Odyssey.MusicMatcher.csproj┃ 📄 Odyssey.MusicMatcher.sln┃ 📄 Program.cs┗ 📄 README.md
要安装依赖项,请运行
dotnet build
没有安装 .NET?在此处查找你的下载链接。在本课程中,我们使用 .NET 8。
然后,检查项目是否可以成功运行
dotnet run
你应该看到
Odyssey.MusicMatcher ❯ dotnet runBuilding...info: Microsoft.Hosting.Lifetime[14]Now listening on: https://127.0.0.1:5059info: Microsoft.Hosting.Lifetime[0]Application started. Press Ctrl+C to shut down.info: Microsoft.Hosting.Lifetime[0]Hosting environment: Developmentinfo: Microsoft.Hosting.Lifetime[0]Content root path: /Users/your-path/Odyssey.MusicMatcher
项目将默认在https://127.0.0.1:5059/graphql 上运行!
注册一个具有企业计划的 Apollo GraphOS 帐户
本课程使用托管联合(在下一课中将详细介绍!),这需要一个具有企业计划的 Apollo 帐户。如果你所在的组织使用的是其他计划,你仍然可以按照本课程进行学习,但你无法完成某些实践任务。你还可以通过注册免费的企业试用版来测试此功能。
安装和验证 Rover CLI
Rover 是 Apollo 的命令行界面 (CLI) 工具,可帮助开发人员使用图 并与GraphOS 交互。
练习
关键要点
- 联合是一种创建模块化图的架构,也称为超图架构。
- 一个超图由一个或多个子图和路由器组成。子图是负责其自身域的GraphQL 微服务。路由器是管理请求路由和执行方式的单个端点,类似于 API 网关。
- 客户端将一个GraphQL 操作发送到路由器。路由器接收此请求,确定哪些子图负责解析它,并将操作发送到相应的子图。子图解析数据并将其返回给路由器,然后路由器将其捆绑起来并返回给客户端。
接下来
我们将了解Apollo GraphOS,以及它如何帮助我们管理我们的超图。
分享你对本课程的疑问和评论
本课程目前处于
你需要一个 GitHub 帐户才能在下面发布。还没有帐户? 请改为在我们的 Odyssey 论坛中发布。