创建和使用合约
了解如何在GraphOS中创建、使用和编辑合约
此功能仅在GraphOS企业计划中可用 GraphOS企业计划.
您可以通过免费注册来试用 企业试用.
ⓘ 注意
以下GraphOS Studio步骤需要具有组织管理员或图形管理员角色的组织成员。 了解成员角色。
创建合约
先决条件
更新您的路由器和子图
在您创建任何合约之前:
如果您使用Apollo Server:
- 对于Federation 2 合约变体,将您的Apollo Server子图更新到2.0.0或更高版本。
@apollo/subgraph
库。 - 对于Federation 1 合约变体,将
@apollo/subgraph
更新到0.1.1或更高版本。
- 对于Federation 2 合约变体,将您的Apollo Server子图更新到2.0.0或更高版本。
ⓘ 注意
@apollo/subgraph
已替换@apollo/federation
用于充当子图的Apollo Server实例。符号名称保持不变。
如果您使用
@apollo/gateway
库而不是GraphOS Router:- 对于Federation 2 合约 变体,请将您的网关的
@apollo/gateway
库更新到v2.0.2或更高版本。 - 对于Federation 1 合约 变体,请将您的网关的
@apollo/gateway
库更新到v0.34.0或更高版本。
- 对于Federation 2 合约 变体,请将您的网关的
ⓘ 注意
Apollo推荐使用 router 而不是 @apollo/gateway
,因为它 显著提高了性能和安全。如果您正在使用 graph 的 @apollo/gateway
,您可以在不改变任何其他部分的情况下迁移到 router 。请参阅 迁移指南。
上述库和工具的旧版本不完全支持所需的 @tag
指令。
(仅Fed1) 启用 @tag
的变体支持
ⓘ 注意
此步骤仅要求Federation 1 supergraph。如果您有Federation 2 supergraph,请继续到 下一步。
合约使用您的图中的一个现有 变体(称为源变体)来生成其合约模式。如果您的源变体使用Federation 1,则需要启用其对 @tag
指令的支持,在 GraphOS Studio:
- 打开要作为源变体使用的 Settings 页面,然后选择 variant 选项卡。
- 在 Build Configuration 部分,点击 Edit Configuration 并启用对
@tag
的支持。
1. 向子图模式添加 @tag
使用合约,您将@tag
指令应用于类型和字段,以表示选择它们是否包含在您的合约模式中。
在您可以添加@tag
指令之前,您需要在您的子图模式中定义指令。这种方式取决于您使用的是哪个联盟版本:
例如,让我们看一下这个联邦2子图模式:
extend schema@link(url: "https://specs.apollo.dev/federation/v2.0"import: ["@key", "@tag"])type Query {topProducts: [Product!]! @tag(name: "partner")}# All fields of the Product object type automatically inherit# the "partner" tag so we can avoid tagging them individuallytype Product @key(fields: "upc") @tag(name: "partner") {upc: ID!name: String!description: String!internalId: ID! @tag(name: "internal")percentageMatch: Float! @tag(name: "experimental")}
该模式将该@tag
指令应用于以下位置:
- 查询顶层产品字段(返回产品列表)
Query.topProducts
(字段) - 产品对象类型
Product
(类别) - 产品
Product
的两个字段(internalId
和percentageMatch
)
每个@tag
都有一个字符串名称
。你可以用相同的名称
给类型和字段标记,如果应该将它们作为一个组包括或排除,由特定的契约
处理。
💡 提示
有关有效@tag
用法的详细信息,请参阅@tag和契约的规则。
。组成默认情况下会删除一些其他指令。了解更多。
2. 发布更新的子图模式
在你添加了标签后,通过将你的更新子图模式发布到GraphOS来更新你的源变体。
💡 提示
发布后,如果工作室没有反映你所添加的@tags
,请确保你已经更新所有必需的库和工具。如果你通过勘探获取子图模式,旧的子图库可能会删除@tag
指令。
3. 创建合同
打开你的源变体's设置页面并选择此变体标签。在左侧导航中打开合同。
单击创建合同以打开合同创建对话框。
对话框第一步中,提供以下内容
- 新的合同变体的名称
- 要使用的源变体
ⓘ 注意
合同创建后,您无法更改这些值。
单击继续。
指定基于标签的合同筛选条件。
对话框检测你的源变体模式中使用的所有标签名称,并将这些名称填充到排除标签和包括标签下拉列表中。你可以向每个列表添加任意数量的标签名称。
你还可以添加源变体模式中尚未出现的标签名称。如果你后来添加了具有该名称的标签,合同将尊重它们。
💡 提示
在Apollo Federation 2中,如果您想从您的源变体的API模式及其所有合同模式中排除类型或字段,您可以使用@inaccessible
指令而不是@tag
。有关详细信息,请参阅使用@inaccessible
。
添加完标签名称后,单击生成预览。工作室将尝试根据您提供的过滤器生成合同模式并显示结果。生成预览后,单击审查以继续到下一步。
审查所有合同的细节。如果一切看起来都正确,请单击创建。这会启动您的启动合同变体及其初始合同模式。
ⓘ 注意
GraphOS可能在生成您的合同模式时遇到错误。有关这些错误的描述,请参阅错误。
使用合同变体
您可以使用您的合约变体为用户提供合约路由器或合约文档。contracts routers或contract documentation。例如,您可以完成一个新路由器实例的管理联邦配置,该实例使用您的合约变体。
自动更新
Apollo会在以下任何一种情况发生时自动更新您的合约模式:
- GraphOS成功为合约的源变体更新supergraph模式。
- 您可以修改您的合约。
这些自动更新确保了您的合约模式反映了源变体的最新版本,并且包括和排除正确的类型和字段。
您的管理合约路由器会自动获取合约模式的更新。
编辑合约
ⓘ 注意
您不能更改现有合约的名称或源变体。相反,您可以创建一个新的合约,如果您不再需要它,可以删除现有的合约变体。
创建合约后,您可以编辑其包括和排除的标签列表:
- 从您图's设置页面中的'合约'列表,点击您要编辑的合约右侧的按钮。然后点击。这将打开一个与您用来创建合约的对话框类似的对话框。进行任何必要的更改。
- 如果您更改了合约的包括或排除标签,GraphOS将自动运行合约检查以确定这些更改是否会影响到使用您的合约变体的任何客户端。这些检查的结果将在合约编辑对话框的"Review Schema"步中显示。
- 更新完成后,对话框将显示"Contract Updated"。
运行合约检查
如果您在GraphOS Studio中运行模式检查(我们推荐所有图使用),那些检查包括对任何作为合约源变体的变体的合约检查。合约检查有助于您的团队确定源变体的更改是否会负面影响一个或多个下游合约。
ⓘ 注意
要使用rover subgraph check运行合约检查,您必须将Rover CLI更新到v0.8.2或更高版本。
- 如果您使用Rover v0.8.0或v0.8.1,合约检查会运行,但Rover会忽略在阻断下游变体您设置的任何合约检查失败。
- 如果您使用的是 v0.8.0 以前的版本,
rover subgraph 检查
根本不会运行合约检查。
当您对一个模式检查执行源变体,合约检查将与该变体的其他检查(组合检查和操作检查)同时执行。
合约检查依赖于由组合生成的超级图模式,因此如果组合检查失败,它们不会执行。
合约检查为每个源变体的关联合约执行以下操作:
- 使用源变体的拟议超级图模式(由组合检查验证)生成和验证更新的合约模式。
- 针对更新的合约模式运行操作检查。
在您的绘图的“检查”页面中的“检查”部分,合约检查显示为下游:
单击“下游”项,位于“任务”列中,以查看已运行的合约检查摘要。单击特定的检查以查看更多详细信息。
失败的合约检查
与其他类型的检查不同,默认情况下失败的合约检查不会导致其关联的模式检查工作流程失败。这意味着rover subgraph 检查
命令不会返回导致源变体无法合并或部署更改的错误状态。
如果您希望失败的合约检查使整个检查工作流程失败,您可以设置源变体的阻止下游变体配置。如果对于任何指定的合约变体,合约检查失败,则源变体的检查工作流程将失败。
设置阻止下游变体:
- 打开您的源变体的“检查”页面并选择“此变体”选项卡。
- 单击“配置”并滚动到“阻止下游变体”部分。
- 选择应该作为阻止下游变体的每个合约变体。
从现在开始,每次对您的源变体运行模式检查时,如果任何阻止下游变体的合约检查失败,这些检查将失败。