概述
让我们把我们的超级图带到世界上来。
在本课中,我们将
- 将我们的
listings服务器转换为一个联合的子图 - 使用我们的
listings子图来创建一个新的超级图 - 设置我们的环境变量
从服务器到子图
我们的listings服务器已经处于良好的状态,可以成为一个子图,它是更大联合图的一部分。我们只需要做一些小的调整。
安装 @apollo/subgraph
首先,在我们listings目录的根目录中,让我们安装@apollo/subgraph包。此包提供了一些实用程序,用于准备一个GraphQL服务(比如我们的listings服务器)以与其他 GraphQL服务集成,并在单个端点之后。
npm install @apollo/subgraph
使用 buildSubgraphSchema
接下来,我们将跳到我们的listings/src/index.ts文件中。在这里,我们可以从@apollo/subgraph导入buildSubgraphSchema函数。
// other importsimport { buildSubgraphSchema } from "@apollo/subgraph";
下面,我们将稍微调整一下我们对ApolloServer的实例化。我们不是直接将包含我们的typeDefs和resolvers的对象传递给构造函数,而是定义一个具有名为schema的属性的对象。
- const server = new ApolloServer({ typeDefs, resolvers });+ const server = new ApolloServer({+ schema: // TODO+ })
作为schema属性的值,我们将调用buildSubgraphSchema,将包含我们的typeDefs和resolvers的对象数组传递给它。以下是它的样子。
const server = new ApolloServer({schema: buildSubgraphSchema([{ typeDefs, resolvers }]),});
buildSubgraphSchema 函数在做什么?
The buildSubgraphSchema函数接受一个对象数组。我们传递的对象包含typeDefs和resolvers,并返回一个准备用于联合的子图模式。此模式包含许多联合指令和类型,使我们的子图能够充分利用联合的强大功能。稍后我们将详细介绍它!
启用联合 2
为了使我们的子图能够利用联合版本 2 中提供的全部功能,我们需要添加一个名为extend schema的特定定义。这与我们要使用的联合版本相关联。
复制以下代码行
extend schema @link(url: "https://specs.apollo.dev/federation/v2.7", import: ["@key"])
接下来,我们将打开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 企业版计划。如果你所在的组织使用的是其他计划,你仍然可以继续学习,但无法完成某些动手操作任务。你也可以通过 注册免费的企业版试用来测试此功能。
打开一个新的浏览器窗口,然后访问GraphOS Studio。
如果你之前没有在 Apollo Studio 中创建过图,系统会提示你创建。否则,我们可以通过点击仪表板右上角的+ 创建新图按钮来创建一个新图。
studio.apollographql.com
我们将给我们的图起一个描述性的标题,将图架构的默认设置保留为“超级图”,然后点击下一步。
studio.apollographql.com
如果你没有看到上面的模态,你可能使用了错误的计划。
检查你的计划: 本课程的一部分涵盖了自托管的 GraphOS Router,它需要 GraphOS 企业版计划。如果你所在的组织使用的是其他计划,你仍然可以继续学习,但无法完成某些动手操作任务。你也可以通过 注册免费的企业版试用来测试此功能。
现在我们应该看到一个带有发布模式选项的模态。
studio.apollographql.com
我们准备发布模式了!
发布 listings 模式
要将我们的listings模式发布到我们的新图,我们将使用Rover CLI。Rover 允许我们从命令行连接到我们的图并发布模式,但它首先需要一些数据。
APOLLO_KEY:你的图的 API 密钥,用于与单个 图在GraphOS中交互。它以类似于"service:your-graph-name"的形式开头。请注意,这与你的个人 API 密钥不同,我们在第一课中使用它来验证Rover,它允许你部分访问你所属组织中的每个图。APOLLO_GRAPH_REF:我们超级图的图引用(或图引用),我们将使用它来告诉Rover在哪里发布我们的子图。图引用以图 ID 开头,后面跟着一个@符号,后面跟着图的变体。
我们将在运行 路由器 时再次使用这些值,因此我们可以将它们存储在一个新文件中,我们将将其添加到 路由器 目录中,称为 .env。
现在让我们创建该文件。
📦 odyssey-federation-typescript┣ 📂 router┃ ┣ 📄 router-config.yaml┃ ┗ 📄 .env┗ 📂 listings
存储变量
返回 Studio 中创建 超级图 后出现的配置选项。确保您位于 Schema 文档 选项卡上。
首先,确保 超级图管道跟踪 下拉菜单设置为 Federation 2.7 超级图。这指定了我们的 超级图 应该使用 Apollo Federation 的最新功能构建。
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文件中。在下一步中,我们将需要它,并且无法通过 Studio 再次访问相同的密钥。router/.envAPOLLO_KEY=your-unique-apollo-api-key现在让我们回到 Studio 获取我们的 图引用。我们正在寻找的值出现在同一个代码块中,紧接在“rover 子图 发布”命令的一部分之后。我们也将保存此值作为环境变量,但我们可以随时从图的主页访问它。
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=your-unique-apollo-api-keyAPOLLO_GRAPH_REF=your-graph-name@current
我们已经拥有发布 子图 所需的值!
The rover subgraph publish command
Rover 有一个命令可以帮助我们完成这项重要任务: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 服务器尚未运行,请立即启动它!
回到终端并确保我们位于项目的
listings目录中。现在让我们输入
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://:4000注意: 我们在该命令中使用了
\字符,通过将每个命令行选项放在单独的行上,提高了可读性。如果您选择在一行上键入整个rover subgraph publish命令,则无需包含\。您将看到以下消息:
主机 localhost 无法通过公共互联网路由。继续发布将使此子图仅在本地环境中可访问。您是否仍要发布?[y/N]继续并按y键。在本课程中,我们将坚持使用本地环境!如果一切顺利,运行此命令应该会输出一条消息,确认 子图 已发布,并且 超级图 已更新!
查看 Studio 中的结果
让我们回到 Studio。我们可以在模态中点击 “查看模式更改” 以查看我们 超级图 中发生了哪些变化。
这将带我们到一个名为 发布 的新页面。每次对 超级图 进行更改时,都会运行一个 发布。我们将在接下来的课程中仔细研究发布。
现在,让我们点击侧边栏中的 Schema 选项卡。 Schema Reference 页面让我们可以查看组合后的 超级图模式 中的所有类型和 字段。没错——即使我们只发布了一个 子图,我们已经有了超级图模式!
我们看到我们的 超级图 的 Query 类型包含来自 listings 子图的两个 字段: featuredListings 和 listing。每个 字段 都用描述、所需 变量 以及它所属的 子图 进行注释。
让我们仔细看看那个 超级图模式。点击 SDL 选项卡,它位于 Schema 页面的顶部。在这里,我们可以看到有关我们发布的 子图 的详细信息,以及两个额外的模式。
API 模式 是暴露给您的客户端的 GraphQL API。它干净且逻辑地表示您 子图模式 的组合。(我们现在不用担心这个模式。)
超级图模式 被 路由器 视为地图,用来定义如何将传入的 GraphQL 操作 分配到底层的 子图 中。我们目前只有一个,因此操作中的所有 字段 都将被路由到 listings 子图。
练习
关键要点
- 我们可以使用
rover subgraph publish命令(来自 Rover CLI)将我们的 子图模式 发布到 GraphOS。 - 超级图模式 整合了我们发布的 子图 中的所有类型和 字段。它还包括额外的 指令 来帮助 路由器 确定哪些子图可以解析每个字段。
接下来
我们的 超级图 已设置好,只差一个部分: 路由器!接下来,让我们运行路由器,向它发送一些查询,并检查来自 GraphOS 的见解!
分享您对此课程的疑问和评论
本课程目前处于
您需要一个 GitHub 帐户才能在下面发布。没有帐户? 请改为在 Odyssey 论坛中发布。