2

概括

在 GraphQL Apollo 托管联合中,我试图弄清楚一个服务是否可能有一个聚合字段,它返回一个实体数组,两个独立的服务。如,我试图支持这个用例:

query FromTwoServices {
   aggregateField {
      id
      ...on Service1Entity {
          field1
      }
      ...on Service2Entity {
          field2
      }
   }
}

两者都在哪里

type Service1Entity implements Aggregation

type Service2Entity implements Aggregation

在底层,解析器aggregateField(位于服务 2 上)向下调用服务 1 到Service1Entitys。所以这个字段聚合了两个数据集。

示例问题

在我当前的 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字段,因此我们试图在不要求客户更改的情况下支持此更改,也就是不重新调整接口的使用。

4

0 回答 0