使用 gRPC 和/或 GraphQL 进行微服务架构

Dun*_*Luk 4 architecture rpc microservices grpc graphql

在我的公司,我们即将建立一个新的微服务架构,但我们仍在尝试决定哪种协议最适合我们的用例。

在我们的例子中,我们有一些服务被其他服务内部调用,但也通过 GraphQL API 网关向我们的客户端公开。

选项 1:gRPC

由于其性能和效率,gRPC 似乎是微服务内部通信的流行选择。

然而,gRPC 使得查询关系数据变得更加困难,并且需要更多的工作来连接到我们的 API 网关。

选项 2:GraphQL

另一种选择是让每个微服务实现自己的 GraphQL 模式,以便在 API 网关中使用 Apollo Federation 轻松地将它们拼接在一起。

这种方法将使查询更加灵活,但由于缺乏协议缓冲区,内部请求的性能会降低。

选项3:两者都有?

也许另一种选择是通过在 gRPC 中实现突变和在 GraphQL 中实现查询来利用两全其美。或者只是创建两个 API,一个面向网关客户端,一个用于服务之间的通信。

问题

  1. 我们如何决定使用哪种方法?
  2. 我们应该考虑任何显着(不利)的优势吗?例如在易用性、可维护性、可扩展性、性能等方面?
  3. 这个用例有更好的替代方案吗?

dig*_*raw 7

这取决于您正在实施的整体架构。

我建议同时使用 GraphQL 和 gRPC:

  • 使用Apollo Federation作为边界节点来无缝处理来自前端使用 GraphQL 交谈的请求。

  • 在您的 API 和微服务上使用CQRS模式,并将读取模型与写入模型严格分开。

  • 使用六边形架构(我们在我公司使用显式架构)来实现DDD - Domain-driven-design

  • 为了无缝集成 Apollo,您必须将 GraphQL 层实现到所有后端服务的架构中。

  • 在读取模型中,实现 GraphQL 层。您将从联合中受益(来自多个微服务的数据的并行读取将在联合引擎中“加入”,而无需您的 API 节点的任何参与)。

  • 对于写入模型(突变)中的后端服务之间的通信,请使用gRPC

  • gRPC 将使您可以像在本地一样远程调用您的 CQRS 命令。

  • 因此,您的远程微服务看起来就像是本地后端代码的一部分。

  • 您还需要一个像RabbitMQKafka这样的消息代理来通过事件和消息队列管理一些更复杂的状态更改。