加入我们,从10月8日至10日,在纽约市了解 GraphQL Federation 和 API 平台工程的最新技巧、趋势和新闻。加入我们,参加 2024 年纽约市的 GraphQL 座谈会
文档
免费开始

Apollo Federation 1的变化

了解Apollo Federation 2的新功能


不会发生变化的内容?

在介绍新功能之前,先来看看Federation 2中不会发生变化的部分。

  • 最重要的是,Federation 2与大多数Federation 1

    • 了解更多.
    • 为了充分利用Federation 2的功能,你确实需要对你的
  • 没有其他要求。任何子图兼容的库都会自动与Federation 2兼容。

    • 许多还没有自动定义Federation 2中新的一些,例如@shareable。您可以为在您的子图模式中使用它们而手动定义这些指令

更灵活的组合

Federation 2提高了子图模式的可灵活性和独立性。与Federation 1相比,新的组合逻辑更为灵活,这意味着团队可以更有信心构建子图或在不同子图之间迁移功能。

让我们看看一些例子吧!

值类型

在Federation 1中,多个可以定义相同的类型,但这些定义必须是相同的。这些相同的共享类型称为值类型

Fed. 1

子图A
type Book {
title: String!
author: String!
}
子图B
type Book {
title: String!
author: String!
}

在Federation 2中,这种“相同定义”约束被移除了。值类型及其可以在子图之间共享,即使定义之间存在某些细节差异。

有关详细信息,请参阅下面的章节,以及值类型

对象

在Federation 2中,可以像这样在子图之间共享:

Fed. 2

子图A
type Book @shareable {
title: String!
author: String!
}
子图B
type Book @shareable {
title: String!
author: String # Nullable
isbn: String! # Not in A
}

上面的两个 Book 类型定义在所包括的字段和这些字段的 nullability 上有所不同。注意还有新的 @shareable 指令,该指令是用于表明某个 可以由多个 subgraphs 解析。

注意

将类型标记为 @shareable(就像上面的 Book 一样)与将其所有 fields 都标记为 @shareable 是等效的。

在组织拥有多个独立的 APIs 且希望用联邦将它们统一在一起时,这种灵活性特别有用。这样的 APIs 通常共享一些类型,这种增加的灵活性减少了成功组合它们模式所需的工作。

子图之间有效的共享字段差异

  • 共享字段的数据类型可以是可变的,具有 nullability(String / String!)。
  • 类型可以省略其他子图中包含的字段,只要你的 中的每个字段总是可以解析的。(有关详细信息,请参阅 组合规则。)

有关如何处理这些字段差异的详细信息,请参阅 不同共享字段

枚举、联合和接口

在 Federation 2 中,enumunioninterface 定义可以在子图之间有所不同。有关详细信息,请参阅 合并多个子图中的类型

实体

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! @external
inStock: 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! @shareable
price: Int
}
库存
type Product @key(fields: "id") {
id: ID!
name: String! @shareable
inStock: 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!
}
以前的
子图规范
下一页
移动步骤
评分文章评分在GitHub上编辑编辑论坛Discord

©2024Apache Graph Inc.,简称Apollo GraphQL。

隐私政策

公司