如何使用 GraphQL 联合实现 Relay 节点查询

Posted

技术标签:

【中文标题】如何使用 GraphQL 联合实现 Relay 节点查询【英文标题】:How to implement Relay node query with GraphQL federation 【发布时间】:2021-11-30 05:01:06 【问题描述】:

我们正在尝试用Apollo federation 实现Relay node query。由于 Apollo 不知道 Relay,所以我们必须在一些服务(Node Resolution Service)中实现节点查询

interface Node 
  id: ID!


type Query 
  node(id: ID!): Node!

问题在于节点解析服务不知道其他服务子图中定义的任何实现类型。

Apollo 网关向节点解析服务发送如下请求

node(id:"dHlwZUZyb21BU2VydmljZTox")__typename ...on TypeFromAnotherServiceid __typename

查询验证失败,因为服务不知道任何关于TypeFromAnotherService 的信息。我们能够实现节点查询,因为我们在 ID 中编码了类型,但我们不知道如何修复验证。

    我们可以根据联合模式动态生成模式。这个好像用here但是感觉很麻烦 关闭验证并信任 Apollo GW 验证。我们不喜欢它,而且在我们在后端使用的Netflix DGS 中似乎是不可能的。

任何想法如何使中继节点查询与联邦一起工作?

【问题讨论】:

有一个新的issue与此相关 【参考方案1】:

我们通过实现一个独立的节点解析器解决了这个问题。它执行以下操作:

    检查查询并即时生成模式,以防 Apollo 在片段中使用类型。节点解析器基本上将TypeFromAnotherService 添加到架构中。 节点解析器从 ID 中提取类型并生成响应。

我们正在考虑将服务开源,有人感兴趣吗?

【讨论】:

当然,Apollo 客户端有自己的方式来缓存数据,但是从 API 的角度来看,中继全局标识符模式也很有用。遗憾的是,在联邦实施中没有正式解决它。如果您想出网关的即插即用节点解析器实现,我会很感兴趣。

以上是关于如何使用 GraphQL 联合实现 Relay 节点查询的主要内容,如果未能解决你的问题,请参考以下文章

Relay 从哪里获取 GraphQL 的 Schema?

如何将 Realm 与 Relay/GraphQL 一起使用

GraphQL + Relay:如何执行重新获取授权?

如何在 GraphQL (Relay) 中查询和改变数组类型?

如何使用 Relay、GraphQL 和 React 渲染数据

使用 graphql-java 构建 Relay GraphQL 服务器