微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Apollo federation:从实现接口的两个独立服务返回实体的字段/解析器

如何解决Apollo federation:从实现接口的两个独立服务返回实体的字段/解析器

总结

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

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

两个地方

type Service1Entity implements Aggregation

type Service2Entity implements Aggregation

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

示例问题

在我当前的 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 类型,我使用了“referencing”来告诉 Dog 服务 Cat 位于其他地方。

Cat 服务(用 @key 将 Cat 标记为实体):

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 字段,因此我们正在尝试在不需要客户端更改的情况下支持此更改,也就是不重新构造接口的使用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。