3. 创建超级图
10m

概述

让我们把我们的带到世界上来。

在本课中,我们将

  • 将我们的listings服务器转换为一个联合的
  • 使用我们的listings 来创建一个新的
  • 设置我们的环境变量

从服务器到子图

我们的listings服务器已经处于良好的状态,可以成为一个,它是更大联合图的一部分。我们只需要做一些小的调整。

安装 @apollo/subgraph

首先,在我们listings目录的根目录中,让我们安装@apollo/subgraph包。此包提供了一些实用程序,用于准备一个服务(比如我们的listings服务器)以与其他 服务集成,并在单个端点之后。

listings
npm install @apollo/subgraph

使用 buildSubgraphSchema

接下来,我们将跳到我们的listings/src/index.ts文件中。在这里,我们可以从@apollo/subgraph导入buildSubgraphSchema函数。

index.ts
// other imports
import { buildSubgraphSchema } from "@apollo/subgraph";

下面,我们将稍微调整一下我们对ApolloServer的实例化。我们不是直接将包含我们的typeDefsresolvers的对象传递给构造函数,而是定义一个具有名为schema的属性的对象。

- const server = new ApolloServer({ typeDefs, resolvers });
+ const server = new ApolloServer({
+ schema: // TODO
+ })

作为schema属性的值,我们将调用buildSubgraphSchema,将包含我们的typeDefsresolvers的对象数组传递给它。以下是它的样子。

index.ts
const server = new ApolloServer({
schema: buildSubgraphSchema([{ typeDefs, resolvers }]),
});

buildSubgraphSchema 函数在做什么?

The buildSubgraphSchema函数接受一个对象数组。我们传递的对象包含typeDefsresolvers,并返回一个准备用于联合的。此模式包含许多联合指令和类型,使我们的能够充分利用联合的强大功能。稍后我们将详细介绍它!

启用联合 2

为了使我们的能够利用联合版本 2 中提供的全部功能,我们需要添加一个名为extend schema的特定定义。这与我们要使用的联合版本相关联。

复制以下代码行

extend schema @link(url: "https://specs.apollo.dev/federation/v2.7", import: ["@key"])

接下来,我们将打开schema.graphql,并将模式定义添加到文件顶部。

schema.graphql
extend schema @link(url: "https://specs.apollo.dev/federation/v2.7", import: ["@key"])
type Query {
# query fields
}
# other GraphQL types

就是这样,我们的服务器已经配备了联合支持!

从子图到超级图

正如我们在上一课中学到的,我们可以使我们的单个listings现在也满足资格!)成为中的第一块。从“子”到“超级”的增长实际上比听起来容易得多。

准备好了吗?让我们开始吧。

创建一个新图

检查你的计划: 本课程的一部分涵盖了自托管的 GraphOS Router,它需要 GraphOS 企业版计划。如果你所在的组织使用的是其他计划,你仍然可以继续学习,但无法完成某些动手操作任务。你也可以通过 注册免费的企业版试用来测试此功能。

  1. 打开一个新的浏览器窗口,然后访问GraphOS Studio

  2. 如果你之前没有在 Apollo Studio 中创建过,系统会提示你创建。否则,我们可以通过点击仪表板右上角的+ 创建新图按钮来创建一个新图。

    studio.apollographql.com

    The New Graph button in Studio

  3. 我们将给我们的起一个描述性的标题,将图架构的默认设置保留为“”,然后点击下一步。

    studio.apollographql.com

    The create graph modal in Studio, filled out with the name Airlock

    如果你没有看到上面的模态,你可能使用了错误的计划。

    检查你的计划: 本课程的一部分涵盖了自托管的 GraphOS Router,它需要 GraphOS 企业版计划。如果你所在的组织使用的是其他计划,你仍然可以继续学习,但无法完成某些动手操作任务。你也可以通过 注册免费的企业版试用来测试此功能。

  4. 现在我们应该看到一个带有发布模式选项的模态。

    studio.apollographql.com

    A modal window showing options for publishing the schema for our graph

我们准备发布模式了!

任务!

发布 listings 模式

要将我们的listings模式发布到我们的新,我们将使用。Rover 允许我们从命令行连接到我们的图并发布模式,但它首先需要一些数据。

  • APOLLO_KEY:你的的 API 密钥,用于与单个 中交互。它以类似于"service:your-graph-name"的形式开头。请注意,这与你的个人 API 密钥不同,我们在第一课中使用它来验证,它允许你部分访问你所属组织中的每个
  • APOLLO_GRAPH_REF:我们(或图引用),我们将使用它来告诉在哪里发布我们的。图引用以图 ID 开头,后面跟着一个@符号,后面跟着

我们将在运行 时再次使用这些值,因此我们可以将它们存储在一个新文件中,我们将将其添加到 路由器 目录中,称为 .env

现在让我们创建该文件。

📦 odyssey-federation-typescript
┣ 📂 router
┃ ┣ 📄 router-config.yaml
┃ ┗ 📄 .env
┗ 📂 listings
任务!

存储变量

  1. 返回 Studio 中创建 后出现的配置选项。确保您位于 Schema 文档 选项卡上。

  2. 首先,确保 超级图管道跟踪 下拉菜单设置为 Federation 2.7 超级图。这指定了我们的 应该使用 的最新功能构建。

    studio.apollographql.com

    The schema publish modal, highlighting the Supergraph Pipeline Track dropdown

  3. 在下面,稍微看一下发布 的命令。我们很快就会运行此命令,但现在,我们更关心的是 APOLLO_KEY 环境变量。

    APOLLO_KEY=your-graphs-apollo-key \
    rover subgraph publish your-graph-name@current \
    --name products --schema ./products-schema.graphql \
    --routing-url http://products.prod.svc.cluster.local:4001/graphql
  4. 点击代码块上的眼睛图标以显示 APOLLO_KEY 的完整值。复制 APOLLO_KEY 及其值到 router/.env 文件中。在下一步中,我们将需要它,并且无法通过 Studio 再次访问相同的密钥。

    router/.env
    APOLLO_KEY=your-unique-apollo-api-key
  5. 现在让我们回到 Studio 获取我们的 。我们正在寻找的值出现在同一个代码块中,紧接在“ 发布”命令的一部分之后。我们也将保存此值作为环境变量,但我们可以随时从图的主页访问它。

    APOLLO_KEY=your-graphs-apollo-key \
    rover subgraph publish your-graph-name@current \
    --name products --schema ./products-schema.graphql \
    --routing-url http://products.prod.svc.cluster.local:4001/graphql

很好!在继续之前,我们应该确保已保存两个环境变量。我们马上就要将它们投入使用!

router/.env
APOLLO_KEY=your-unique-apollo-api-key
APOLLO_GRAPH_REF=your-graph-name@current

我们已经拥有发布 所需的值!

The rover subgraph publish command

有一个命令可以帮助我们完成这项重要任务:rover subgraph publish。此命令将单个 的最新版本推送到 Apollo Studio。

rover subgraph publish <APOLLO_GRAPH_REF> \
--name <SUBGRAPH NAME> \
--schema <SCHEMA FILE PATH> \
--routing-url <ROUTING URL>

要使用此命令,我们需要 用于我们想要发布的 ,以及以下命令行选项:

选项它是什么?
--name我们想在 Apollo Studio 中为我们的子图命名什么
--schema子图模式文件的相对路径
--routing-url我们的子图运行的 URL(暂时为本地)

让我们为我们的 listings 填写此命令。

注意: 如果您的 listings 服务器尚未运行,请立即启动它!

  1. 回到终端并确保我们位于项目的 listings 目录中。

  2. 现在让我们输入 rover subgraph publish 命令:

    接下来,我们将粘贴我们 APOLLO_GRAPH_REF 环境变量的值。

    对于 name 选项,我们将传入 listings

    对于 schema 选项,我们将传入模式的路径,从 listings 目录的根目录是 ./src/schema.graphql

    对于 routing-url 选项,我们将传入 localhost:4000

    rover subgraph publish <APOLLO_GRAPH_REF> \
    --name listings \
    --schema ./src/schema.graphql \
    --routing-url https://127.0.0.1:4000

    注意: 我们在该命令中使用了 \ 字符,通过将每个命令行选项放在单独的行上,提高了可读性。如果您选择在一行上键入整个 rover subgraph publish 命令,则无需包含 \

  3. 您将看到以下消息:主机 localhost 无法通过公共互联网路由。继续发布将使此子图仅在本地环境中可访问。您是否仍要发布?[y/N] 继续并按 y 键。在本课程中,我们将坚持使用本地环境!

  4. 如果一切顺利,运行此命令应该会输出一条消息,确认 已发布,并且 已更新!

查看 Studio 中的结果

让我们回到 Studio。我们可以在模态中点击 “查看模式更改” 以查看我们 中发生了哪些变化。

studio.apollographql.com

The schema publish modal, now with the 'See schema changes' button highlighted

这将带我们到一个名为 发布 的新页面。每次对 进行更改时,都会运行一个 。我们将在接下来的课程中仔细研究发布。

studio.apollographql.com

The Launches page in Studio, showing that changes were made to our graph

现在,让我们点击侧边栏中的 Schema 选项卡。 Schema Reference 页面让我们可以查看组合后的 中的所有类型和 。没错——即使我们只发布了一个 ,我们已经有了超级图模式!

我们看到我们的 Query 类型包含来自 子图的两个 featuredListingslisting。每个 都用描述、所需 以及它所属的 进行注释。

studio.apollographql.com

The Schema reference page in Studio, showing the Query type with two fields: featuredListings and listing

让我们仔细看看那个 。点击 SDL 选项卡,它位于 Schema 页面的顶部。在这里,我们可以看到有关我们发布的 的详细信息,以及两个额外的模式。

studio.apollographql.com

The Schema page opened up to the SDL tab, highlighted the two options: API schema and supergraph schema

API 模式 是暴露给您的客户端的 API。它干净且逻辑地表示您 的组合。(我们现在不用担心这个模式。)

超级图模式 视为地图,用来定义如何将传入的 分配到底层的 中。我们目前只有一个,因此操作中的所有 都将被路由到 listings 子图。

练习

rover subgraph publish 命令的作用是什么?

关键要点

  • 我们可以使用 rover subgraph publish 命令(来自 )将我们的 发布到
  • 整合了我们发布的 中的所有类型和 。它还包括额外的 来帮助 确定哪些子图可以解析每个字段。

接下来

我们的 已设置好,只差一个部分: !接下来,让我们运行路由器,向它发送一些查询,并检查来自 的见解!

上一页

分享您对此课程的疑问和评论

本课程目前处于

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

您需要一个 GitHub 帐户才能在下面发布。没有帐户? 请改为在 Odyssey 论坛中发布。