是的。截至 2022 年 11 月 15 日,@apollo/gateway
v0.x 已正式弃用,预计于 2023 年 9 月 22 日停止支持。 @apollo/gateway
v2.x 仍全面支持。
了解更多关于弃用和生命周期的信息。
最终需要。迁移到 Federation 2 的过程有三个步骤:
- 升级您的网关以支持 Federation 2(我们推荐转向 GraphOS 路由器)。
- 开始使用 Federation 2 构造您的超级图模式逻辑。
- 更新您的各个子图以使用 Federation 2 功能和指令。
步骤 1 和 2 通常不需要修改您的子图模式。需要修改的模式是那些会导致某些构造错误(见下文。)的 schema。
第3步需要对您的子图模式进行一些更改,具体描述在这里。
如上所述,以下 Federation 1 的示例应该会引发组合错误,但并未检测到。如果您的子图模式包含与这些匹配的语法,您需要在迁移到 Federation 2 之前更新这些模式。
一个实体的@key 由一个或多个实体的字段组成。如果其中任何一个字段有子字段,则@key也应该包含至少一个这些子字段:
1
type User @key(fields: "id organization { id }") {
3
organization: Organization!
在此示例中,User
's 的键字段是User.id
和User.organization.id
。
Federation 1 的组合不正确地允许以下此类@key
:
1
type User @key(fields: "id organization") {
3
organization: Organization!
此@key
应破坏组合,因为它不包含至少一个组织的子字段。
一个子图可以标记一个实体字段,使用@requires
指示它依赖于另一个子图的字段和子字段:
子图A
1
type Product @key(fields:"sku") {
3
dimensions: ProductDimensions!
子图B
1
extend type Product @key(fields:"sku") {
3
dimensions: ProductDimensions! @external
4
shippingEstimate: Int! @requires(fields: "dimensions { size weight }")
在这个例子中,子图B的shippingEstimate
字段依赖于子图A的dimensions.size
和dimensions.weight
字段。
Federation 1 错误地允许以下类似的@requires
指令:
子图A
1
type Product @key(fields:"sku") {
3
dimensions: ProductDimensions!
子图B
1
extend type Product @key(fields:"sku") {
3
dimensions: ProductDimensions! @external
4
shippingEstimate: Int! @requires(fields: "dimensions { length depth }")
这个@requires
指令应该破坏组合,因为它依赖于不存在的子字段(length
和depth
)。
一个子图可以注解一个实体字段,使用@provides
指令以指示该子图可以独立解决通常标记为@external
的实体字段。
子图A
1
type Product @key(fields: "id") {
3
info: ProductInfo @external
8
inStock: Boolean! @external
12
outOfStockProducts: [Product!]! @provides(fields: "info { name }")
13
discontinuedProducts: [Product!]!
在上面的例子中,子图 A可以通过outOfStockProducts
查询解决Product.info.name
字段。任何其他通往Product.info.name
的路径都会导致额外的子图调用。
Federation 1 错误地允许以下类似的@provides
使用:
子图A
1
type Product @key(fields: "id") {
3
info: ProductInfo @external
8
inStock: Boolean! @external
12
outOfStockProducts: [Product!]! @provides(fields: "info")
13
discontinuedProducts: [Product!]!
这个@provides
的使用应该破坏组合,因为它没有指定它可以解决哪个子字段。这在Federation v2中被正确捕获和暴露为错误,但Federation v1错误地允许这种使用。
不,在你至少将一个子图架构转换为真正的Federation 2架构之前不可以。
Federation 2提供了相对Federation 1而言更灵活的组合规则。修改你的子图架构以利用这种灵活性之后,你的图将不能再与Federation 1进行组合。你需要撤销这些更改才能回到Federation 1。
在将图转移到Federation 2之前,你可以阅读如何转移到Federation 2的官方文档。
对于@apollo/gateway
v0.x的插件和自定义,在@apollo/gateway
v2.x将按预期继续工作。
路由器/网关版本 | Federation 1 Composition | Federation 2 Composition |
---|
Apollo Router Core v1.x | 🟢 | 🟢 |
@apollo/gateway v2.x | 🟢 | 🟢 |
@apollo/gateway v0.x (已弃用) | 🟢 | ❌ |