概述
让我们把我们的超级图带到世界上来。
在本课中,我们将
- 将我们的
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://127.0.0.1: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 论坛中发布。