6. 使用 Rover 发布子图
9m

概述

现在我们已经了解了完整的 工作流程,现在该回到我们在 FlyBy 中停止的地方了。我们已经有了 locationsreviews ,所以接下来的步骤是创建一个 并发布我们的子图!

在本节中,我们将

  • 创建 用于 FlyBy 在
  • 使用 将我们的 注册到架构注册表
  • 查看由架构注册表生成的

✏️ 在 GraphOS Studio 中创建图

我们首先创建一个新的 用于 FlyBy.

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

    studio.apollographql.com

    The landing page for a fresh Enterprise account

  2. 如果您之前从未在 Studio 中创建过 ,您可以点击 连接 GraphQL API 开始。

    否则,我们可以点击 + 创建新图 按钮,它位于 选项卡的右上角。

    studio.apollographql.com
    The New Graph button in Studio
  3. 我们为我们的 命名一个描述性的标题,将 图架构 的默认设置保留为 “”,然后点击下一步。

    studio.apollographql.com

    Creating a new graph in Studio

    如果您没有看到上面的模态框,您可能在错误的计划中。

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

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

    studio.apollographql.com

    The Publish your Schema with Federation modal in Studio

    稍后我们会用到它。

任务!

✏️ 存储 GraphOS 环境变量

为了使用 发布我们的 ,我们需要从 Studio 中保存两个环境变量:

  • APOLLO_KEY:用于验证 的 API 密钥。它以类似于 service:your-graph-name 开头。
  • APOLLO_GRAPH_REF:我们的 图引用(或 )用于我们的 ,我们将使用它来告诉 在哪里发布我们的
    • 一个 以图的 ID 开头,后跟一个 @ 符号,然后是

我们可以从 Studio 中发布选项模态框中获取 APOLLO_KEYAPOLLO_GRAPH_REF 的值。

  1. 回到 Studio 中创建 后出现的配置选项。确保您在 架构文档 选项卡上。

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

    studio.apollographql.com

    The Publish your schema with Federation modal, highlighting the Federation 2 Supergraph option for the Supergraph Pipeline Track

  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 及其值复制到剪贴板。

  5. 回到我们的代码编辑器,我们将在 router 目录中创建一个名为 .env 的新文件。

  6. 将您的 APOLLO_KEY 粘贴到 router/.env 中。

    router/.env
    APOLLO_KEY=your-graphs-apollo-key
  7. 现在让我们回到 Studio 获取我们的 。我们正在寻找的值出现在同一个代码块中,紧随 “ publish” 命令的一部分。我们将此值复制到剪贴板。

    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

    注意: 我们的 使用了 current 用于我们的 ,这是默认变体。我们将在 航程 III:生产中的联合 中详细介绍变体。

  8. 在您的 router/.env 文件中,添加一行,并设置您的 APOLLO_GRAPH_REF 环境变量:

    router/.env
    APOLLO_KEY=your-graphs-apollo-key
    APOLLO_GRAPH_REF=your-graph-name@current
任务!

警告:出于安全考虑,环境变量永远不应该提交到版本控制系统。因此,本项目包含一个 .gitignore 文件,该文件指定在将代码更改提交到存储库时应该忽略 .env 文件。

我们已经获得了发布 所需的值!

The rover subgraph publish command

提供了一个命令来帮助我们完成这项重要任务: rover subgraph publish。此命令将单个 的最新版本推送到

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

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

选项它是什么?
--name我们在 GraphOS 中要为子图命名的名称
--schema子图模式文件的相对路径
--routing-url子图运行的 URL(目前是本地的)

我们将根据每个 的详细信息填写这些选项。

✏️ 发布 locations 子图

让我们通过发布 locations 来看看这个命令的实际运行情况。

  1. 返回终端,确保我们在项目的根目录中。

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

    我们将粘贴 APOLLO_GRAPH_REF 环境变量的值。

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

    对于 schema 选项,我们将传入 locations.graphql 文件的相对路径。

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

    rover subgraph publish <APOLLO_GRAPH_REF> \
    --name locations \
    --schema ./subgraph-locations/locations.graphql \
    --routing-url https://127.0.0.1:4001

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

  3. 运行命令后,您将看到以下消息

    The host `localhost` is not routable via the public internet.
    Continuing the publish will make this subgraph reachable in local environments only.
    Would you still like to publish? [y/N]

    键入 y 允许它。我们目前处于教程环境中,并在本地环境中工作!

    请注意,您需要在每次 发布命令后执行此操作。

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

检查 Studio 中的结果

让我们返回 Studio,查看“查看模式更改”以了解 中的变化。

这个新页面看起来与我们在之前的课程中使用的沙盒类似,但它还具有用于管理 的其他功能。

让我们点击侧边栏中的 模式 选项卡。

模式参考

模式参考 页面允许我们查看组合 中的所有类型和 。没错,即使我们只发布了一个 ,我们已经拥有超级图模式了!

我们可以看到, Query 类型包含 中的两个 。每个 都标注了其描述、所需的任何 以及它所属的子图。

studio.graphql.com/graph/flyby/schema/reference?variant=current
The Schema page for our graph

✏️ 发布 reviews 子图

让我们再次使用 rover subgraph publish 发布 reviews ,看看我们的模式如何变化。

  1. 回到项目根目录的终端中,我们再次使用 rover subgraph publish 命令。我们不会更改 ,但我们将更新其他命令行选项以反映 reviews

    rover subgraph publish <APOLLO_GRAPH_REF> \
    --name reviews \
    --schema ./subgraph-reviews/reviews.graphql \
    --routing-url https://127.0.0.1:4002
  2. 成功运行后,返回 Studio 并刷新 模式参考 页面。现在我们可以看到新的 latestReviews ,这是我们的 reviews 添加到 Query 类型中的!

    studio.apollographql.com
    The updated Schema reference page, now including the latestReviews Query entrypoint

干得好!通过几个命令,我们完成了联邦之旅中的一个重要里程碑。我们使用 将我们的 注册到模式注册表,并且 自动为我们组合了

查看我们的模式

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

API 架构 是向您的客户端公开的 API。它清晰且逻辑地表示了您的 的组合。(我们现在不会担心这个架构。)

超级图架构 用作地图,用于定义如何将传入的 分配到基础 中。让我们研究一下 超级图架构 以了解 在幕后为我们做了些什么。

studio.apollographql.com
The supergraph schema composed from publishing two subgraphs

看起来 包含一些我们自己没有创建的新语法和 。我们不需要深入研究这些。但对我们来说,更有趣的是了解超级图架构如何识别属于我们每个 的类型和

中向下滚动,看看 Query 类型。在这里,我们在两个 中添加到 Query 类型的 已在一个地方合并。每个 都用特殊的 @join_field 进行注释,该指令引用其来源 的名称。

type Query @join__type(graph: LOCATIONS) @join__type(graph: REVIEWS) {
"""
The full list of locations presented by the Interplanetary Space Tourism department
"""
locations: [Location!]! @join__field(graph: LOCATIONS)
"""
The details of a specific location
"""
location(id: ID!): Location @join__field(graph: LOCATIONS)
"""
The three latest reviews submitted for FlyBy's locations
"""
latestReviews: [Review!]! @join__field(graph: REVIEWS)
}

我们的 提供了完整的信息,以便它可以 有关位置、评论或两者的任何组合的信息!正如我们在上一课中学到的, 将在我们将任何更改推送到我们任何一个 时自动重新组合这个超级图架构。

练习

以下关于超级图的陈述哪些是正确的?

关键要点

  • 我们可以使用 rover subgraph publish 命令从 将我们的 发布到 Apollo 架构注册表。
  • 每当一个新的 发布时, 会使用我们超级图中注册的任何子图来组合一个新的
  • 整合了我们发布的 中的所有类型和 。它还包含额外的 来帮助 确定哪些子图可以解析每个字段。

接下来

我们的下一个任务是看看 如何使用 来解析传入的 并将来自多个 的数据捆绑到一个干净的响应中。

上一个

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

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

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