合约概览
向不同消费者发送你的supergraph的不同子集
此功能仅适用于 GraphOS企业计划.
您可以通过注册免费 企业试用版.
统一 supergraph为公司数据提供单一真相。这些数据可能具有不同消费者、不同需求和权限。GraphOS合约使您可以向不同消费者发送不同的supergraph子集。
每个合约可以包括来自每个子图的不同字段和数据类型。
合约的好处
合约提供以下好处:
选择数据访问: 超图通常包含大量数据,包括与特定受众不相关的信息。合约声明式地授予对超图特定子集的访问权限,因此图消费者仅访问相关数据。
数据安全和隐私: 合约通过允许排除特定消费者访问机密数据来加强数据安全和隐私保护。这确保只有授权方才能访问敏感数据。
文档和指南: 合约向客户端开发者提供文档。针对合约的特定文档帮助开发者更好地理解和更容易地与他们授权访问的数据交互。
合约如何工作
每个合约将您的超图模式的部分过滤到一个不同的GraphOS变体中:
合约通过向您的@tag
指令添加到您的子图模式。 @tag
声明哪些类型和字段要包含或排除在特定的合约变体中。
type Product {id: ID!name: String!codename: String! @tag(name: "internal")}
type Product {id: ID!name: String!# codename field is filtered out of this contract variant}
在上面的示例中,合约排除了使用internal
@tag
标记的类型和字段。生成的合约架构定义了针对外部受众的定制的GraphQL API。
如何使用合约
通常,您创建合约以支持合约路由器、合约文档或二者都支持。
合同路由器
您可以将自己的 托管实例 部署为 图 和 路由器,该路由器使用 contract 架构。使用合同路由器端点的客户端只能执行 GraphQL 操作,这些操作由合同架构支持:
这使您能够隐藏仍在开发中的实验性类型和 字段,或限制特定受众只能访问所需的部分图。
合同 路由器 可以安全地连接到与其他路由器相同的 子图 实例,因为其客户端只能与合同架构中表示的数据进行交互。这不会影响内部路由。例如,可以继续在 @requires
选择集中使用 字段。
ⓘ 注意
源变体 的 超图架构 中的 @tag
标签也存在于合同变体的超图架构中。
合同文档
在 GraphOS Studio 中,每个 contract 变体都有自己的 README、架构参考和探索者。如果您 公开合同变体,可以将这些资源提供给外部客户端开发者,帮助他们与您的图特定部分进行交互,同时省略不相关的类型和 字段。
联邦 1 的限制
合同 的行为取决于您的图使用 Apollo Federation 的哪个版本——是联邦 1 还是联邦 2。最重要的是,使用联邦 1 的图不能使用 @tag
排除以下项:
- 自定义 标量 类型(在联邦 1 中无法排除默认标量类型)
- 枚举类型或它们的值
- 输入类型或它们的 字段 或接口字段
- 对象 字段或接口字段的 参数
合同与联邦 2
要创建使用联邦 2 的合同变体,合同的源变体也必须使用联邦 2。了解如何将现有变体移至联邦 2。
将现有合同移至联邦 2
如果一个联邦1 源变种已经有一个或多个相关的合同,则无法将其或其合同变种移动到联邦2。相反,您需要按照以下步骤删除并重新创建您的合同变种: