概述
现在我们已经了解了完整的管理联合 工作流程,现在该回到我们在 FlyBy 中停止的地方了。我们已经有了 locations
和 reviews
子图,所以接下来的步骤是创建一个 超图 在 GraphOS Studio 并发布我们的子图!
在本节中,我们将
- 创建 超图 用于 FlyBy 在 GraphOS Studio
- 使用 Rover CLI 将我们的 子图架构 注册到架构注册表
- 查看由架构注册表生成的 超图架构
✏️ 在 GraphOS Studio 中创建图
我们首先创建一个新的 超图 用于 FlyBy.
打开一个新的浏览器窗口,然后访问GraphOS Studio.
studio.apollographql.com如果您之前从未在 Studio 中创建过 图,您可以点击 连接 GraphQL API 开始。
否则,我们可以点击 + 创建新图 按钮,它位于 图 选项卡的右上角。
studio.apollographql.com我们为我们的 图 命名一个描述性的标题,将 图架构 的默认设置保留为 “超图”,然后点击下一步。
studio.apollographql.com如果您没有看到上面的模态框,您可能在错误的计划中。
检查您的计划: 本课程的一部分涵盖了自托管 GraphOS 路由器,它需要 GraphOS 企业版计划。如果您所在的组织使用其他计划,您仍然可以跟着学习,但您无法完成某些动手操作任务。您也可以通过 注册免费企业版试用 测试此功能。
我们现在应该会看到一个带有发布架构选项的模态框。
studio.apollographql.com稍后我们会用到它。
✏️ 存储 GraphOS 环境变量
为了使用 Rover 发布我们的 子图,我们需要从 Studio 中保存两个环境变量:
APOLLO_KEY
:用于验证 Rover 的 API 密钥。它以类似于service:your-graph-name
开头。APOLLO_GRAPH_REF
:我们的 图引用(或 图引用)用于我们的 超图,我们将使用它来告诉 Rover 在哪里发布我们的 子图。- 一个 图引用 以图的 ID 开头,后跟一个
@
符号,然后是 图 变体。
- 一个 图引用 以图的 ID 开头,后跟一个
我们可以从 Studio 中发布选项模态框中获取 APOLLO_KEY
和 APOLLO_GRAPH_REF
的值。
回到 Studio 中创建 超图 后出现的配置选项。确保您在 架构文档 选项卡上。
首先,确保 超图管道跟踪 下拉菜单设置为 联合 2.7 超图。这指定了我们的 超图 应该使用 Apollo 联合 的最新功能构建。
studio.apollographql.com在下面,可以稍微了解一下发布 子图架构 的命令。我们很快就会运行此命令,但现在,我们更关注这里的
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点击代码块上的眼睛图标,以显示
APOLLO_KEY
的完整值。将APOLLO_KEY
及其值复制到剪贴板。回到我们的代码编辑器,我们将在
router
目录中创建一个名为.env
的新文件。将您的
APOLLO_KEY
粘贴到router/.env
中。router/.envAPOLLO_KEY=your-graphs-apollo-key现在让我们回到 Studio 获取我们的 图引用。我们正在寻找的值出现在同一个代码块中,紧随 “rover 子图 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:生产中的联合 中详细介绍变体。在您的
router/.env
文件中,添加一行,并设置您的APOLLO_GRAPH_REF
环境变量:router/.envAPOLLO_KEY=your-graphs-apollo-keyAPOLLO_GRAPH_REF=your-graph-name@current
警告:出于安全考虑,环境变量永远不应该提交到版本控制系统。因此,本项目包含一个 .gitignore
文件,该文件指定在将代码更改提交到存储库时应该忽略 .env
文件。
我们已经获得了发布 子图 所需的值!
The rover subgraph publish
command
Rover 提供了一个命令来帮助我们完成这项重要任务: rover subgraph publish
。此命令将单个 子图模式 的最新版本推送到 GraphOS。
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
子图 来看看这个命令的实际运行情况。
返回终端,确保我们在项目的根目录中。
现在让我们键入
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
命令,则无需包含\
。运行命令后,您将看到以下消息
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
允许它。我们目前处于教程环境中,并在本地环境中工作!请注意,您需要在每次 子图模式 发布命令后执行此操作。
如果一切正常,运行此命令应该会输出一条消息,确认 子图 已发布,并且 超级图 已更新!
检查 Studio 中的结果
让我们返回 Studio,查看“查看模式更改”以了解 超级图 中的变化。
这个新页面看起来与我们在之前的课程中使用的沙盒类似,但它还具有用于管理 超级图 的其他功能。
让我们点击侧边栏中的 模式 选项卡。
模式参考
模式参考 页面允许我们查看组合 超级图模式 中的所有类型和 字段。没错,即使我们只发布了一个 子图,我们已经拥有超级图模式了!
我们可以看到, 超级图 的 Query
类型包含 locations 子图 中的两个 字段。每个 字段 都标注了其描述、所需的任何 变量 以及它所属的子图。
✏️ 发布 reviews
子图
让我们再次使用 rover subgraph publish
发布 reviews
子图,看看我们的模式如何变化。
回到项目根目录的终端中,我们再次使用
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成功运行后,返回 Studio 并刷新 模式参考 页面。现在我们可以看到新的
latestReviews
字段,这是我们的reviews
子图 添加到Query
类型中的!studio.apollographql.com
干得好!通过几个命令,我们完成了联邦之旅中的一个重要里程碑。我们使用 托管联邦 将我们的 子图 注册到模式注册表,并且 GraphOS 自动为我们组合了 超级图模式!
查看我们的模式
让我们仔细看看 超级图模式。点击模式页面顶部的 SDL 选项卡。在这里,我们可以看到有关已发布 子图 的详细信息,以及两个额外的模式。
该 API 架构 是向您的客户端公开的 GraphQL API。它清晰且逻辑地表示了您的 子图架构 的组合。(我们现在不会担心这个架构。)
该 超级图架构 被 路由器 用作地图,用于定义如何将传入的 GraphQL 操作 分配到基础 子图 中。让我们研究一下 超级图架构 以了解 GraphOS 在幕后为我们做了些什么。
看起来 超级图架构 包含一些我们自己没有创建的新语法和 指令。我们不需要深入研究这些。但对我们来说,更有趣的是了解超级图架构如何识别属于我们每个 子图 的类型和 字段。
在 超级图架构 中向下滚动,看看 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)}
我们的 超级图架构 为 路由器 提供了完整的信息,以便它可以 查询 有关位置、评论或两者的任何组合的信息!正如我们在上一课中学到的, GraphOS 将在我们将任何更改推送到我们任何一个 子图 时自动重新组合这个超级图架构。
练习
关键要点
- 我们可以使用
rover subgraph publish
命令从 Rover CLI 将我们的 子图架构 发布到 Apollo 架构注册表。 - 每当一个新的 子图架构 发布时,GraphOS 会使用我们超级图中注册的任何子图来组合一个新的 超级图架构。
- 该 超级图架构 整合了我们发布的 子图 中的所有类型和 字段。它还包含额外的 指令 来帮助 路由器 确定哪些子图可以解析每个字段。
接下来
我们的下一个任务是看看 路由器 如何使用 超级图架构 来解析传入的 GraphQL 操作 并将来自多个 子图 的数据捆绑到一个干净的响应中。
分享您对此课的疑问和评论
您的反馈将帮助我们改进!如果您遇到困难或困惑,请告诉我们,我们会帮助您。所有评论都是公开的,必须遵守 Apollo 行为准则。请注意,已解决或已处理的评论可能会被删除。
您需要一个 GitHub 帐户才能在下面发布。没有吗? 请在我们的 Odyssey 论坛中发布。