概括
在 GraphQL Apollo 托管联合中,我试图弄清楚一个服务是否可能有一个聚合字段,它返回一个实体数组,两个独立的服务。如,我试图支持这个用例:
query FromTwoServices {
aggregateField {
id
...on Service1Entity {
field1
}
...on Service2Entity {
field2
}
}
}
两者都在哪里
type Service1Entity implements Aggregation
和
type Service2Entity implements Aggregation
在底层,解析器aggregateField
(位于服务 2 上)向下调用服务 1 到Service1Entity
s。所以这个字段聚合了两个数据集。
示例问题
在我当前的 GraphQL 设置中,我将所有这些都定义在一个服务中:
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal {
id: ID!
name: String!
meows: Boolean
}
type Dog implements Animal {
id: ID!
name: String!
barks: Boolean
}
当我查询我的服务时,它会遇到一个animals
解析器,看起来像:
query Animals {
animals {
id
...on Cat {
meows
}
...on Dog {
barks
}
}
}
现在我正在创建一个Dogs
服务。我想Dogs
来自 Dog 服务,而 Cats 来自 Cats 服务。此外,我仍然想支持我的animals
聚合字段,并且我想将它移到Dogs
服务中。
为了支持这一点,我创建了Cat
一个实体,并在两个服务之间复制了接口。为了让 Dog 服务解析Cat
类型,我使用了“引用”来告诉 Dog 服务Cat
住在其他地方。
Cat 服务(用 标记 Cat 为实体@key
):
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal @key(fields: "id") {
id: ID!
name: String!
meows: Boolean
}
狗服务:
interface Animal {
id: ID!
name: String!
}
type Cat implements Animal @key(fields: "id") {
id: ID! @external
}
type Dog implements Animal {
id: ID!
name: String!
barks: Boolean
}
这个设置的问题是 Dog 服务无法启动,因为这个 GraphQL 错误:
错误:接口字段 Animal.name 应为预期,但 Cat 未提供。
在我的 Dog 服务中,如果我添加一个外部name
字段,如下所示:
type Cat implements Animal @key(fields: "id") {
id: ID! @external
name: String! @external
}
然后这两个服务无法组成托管联合:
此数据图缺少有效配置。[dog] Cat.name -> 被标记为@external,但未被@requires、@key 或@provides 指令使用。
我有点觉得我在这里走错了路。是否有可能有一个像这样的聚合字段,其中一个服务可以返回它自己的实体,以及另一个服务的实体?
我们已经有很多客户查询该animals
字段,因此我们试图在不要求客户更改的情况下支持此更改,也就是不重新调整接口的使用。