Apollo Federation 1的变化
了解Apollo Federation 2的新功能
💡 提示 如果你刚开始使用Federation,请查看
在介绍新功能之前,先来看看Federation 2中不会发生变化的部分。 最重要的是,Federation 2与大多数Federation 1
子图服务器没有其他要求。任何子图兼容的库都会自动与Federation 2兼容。 Federation 2提高了子图模式的可灵活性和独立性。与Federation 1相比,新的组合逻辑更为灵活,这意味着团队可以更有信心构建子图或在不同子图之间迁移功能。 让我们看看一些例子吧! 在Federation 1中,多个子图可以定义相同的类型,但这些定义必须是相同的。这些相同的共享类型称为值类型: Fed. 1 在Federation 2中,这种“相同定义”约束被移除了。值类型及其字段可以在子图之间共享,即使定义之间存在某些细节差异。 有关详细信息,请参阅下面的章节,以及值类型。 在Federation 2中,对象类型可以像这样在子图之间共享: Fed. 2 上面的两个 不会发生变化的内容?
@shareable
。您可以为在您的子图模式中使用它们而手动定义这些指令。更灵活的组合
值类型
对象
Book
类型定义在所包括的字段和这些字段的 nullability 上有所不同。注意还有新的 @shareable
指令,该指令是用于表明某个 字段 可以由多个 subgraphs 解析。
ⓘ 注意
将类型标记为 @shareable
(就像上面的 Book
一样)与将其所有 fields 都标记为 @shareable
是等效的。
在组织拥有多个独立的 GraphQL APIs 且希望用联邦将它们统一在一起时,这种灵活性特别有用。这样的 APIs 通常共享一些类型,这种增加的灵活性减少了成功组合它们模式所需的工作。
子图之间有效的共享字段差异
- 共享字段的数据类型可以是可变的,具有 nullability(
String
/String!
)。 - 类型可以省略其他子图中包含的字段,只要你的 supergraph 中的每个字段总是可以解析的。(有关详细信息,请参阅 组合规则。)
有关如何处理这些字段差异的详细信息,请参阅 不同共享字段。
枚举、联合和接口
在 Federation 2 中,enum
、union
和 interface
定义可以在子图之间有所不同。有关详细信息,请参阅 合并多个子图中的类型。
实体
Federation 2 对 实体 引入了微妙但强大的变化。
原始子图
在 Federation 1 中,一个 实体始于一个 subgraph,然后在其他子图中扩展:
Fed. 1
type Product @key(fields: "id") {id: ID!name: String!price: Int}
extend type Product @key(fields: "id") {id: ID! @externalinStock: Boolean!}
在 Federation 2 中,实体没有“原始 subgraph”。相反,每个子图都可以定义一个 entity,并向其贡献 fields:
Fed. 2
type Product @key(fields: "id") {id: ID!name: String!price: Int}
type Product @key(fields: "id") {id: ID!inStock: Boolean!}
有关详细信息,请参阅 为实体贡献字段。
共享实体字段
在 Federation 1 中,每个实体 field 只由一个 subgraph 解析(除非它是一个 @key
字段或 @provides
指令的一部分)。在 Federation 2 中,如果有多个 subgraphs 都将其标记为 @shareable
指令,则多个 subgraphs 可以解析相同的实体 field:
Fed. 2
type Product @key(fields: "id") {id: ID!name: String! @shareableprice: Int}
type Product @key(fields: "id") {id: ID!name: String! @shareableinStock: Boolean!}
更多信息,请参阅解决另一个子图字段。
@key
的更改
Federation 2 增加了一个可选的 参数用于 @key
指令: resolvable
。您可以将此参数设置为 false
以指示特定的子图没有为该实体定义 引用解析器。
例如
Fed. 2
type Product @key(fields: "id") {id: ID!name: String!price: Int}
type Product @key(fields: "id", resolvable: false) {id: ID!}type Review {product: Product!score: Int!}
在这种情况下,评论子图通过将 Product
用作 Review.product
的返回类型来引用 Product
实体。然而,该子图没有向 Product
添加任何独特的 fields
,因此它不需要为它定义引用 解析器。因此,评论子图中 Product
的 "stub" 定义可以包含 resolvable: false
。
更多信息,请参阅引用不贡献字段的实体。
迁移字段
Federation 2 引入了 @override
指令,该指令可帮助您安全地在具有 管理式联邦 的子图之间迁移实体和根级字段:
type Bill @key(fields: "id") {id: ID!amount: Int!}type Payment {# ...}
type Bill @key(fields: "id") {id: ID!amount: Int! @override(from: "Payments")}
有关详细信息,请参阅 实体迁移。
实现接口的接口
如果接口类型实现了另一个接口,Federation 1 的组合将失败。这个问题已在 Federation 2 中得到解决:
Fed. 2
interface Media {title: String!}interface Book implements Media {title: String!author: String!}