【问题标题】:Using gRPC and/or GraphQL for microservice architecture将 gRPC 和/或 GraphQL 用于微服务架构
【发布时间】:2021-05-20 08:03:32
【问题描述】:

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

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

选项 1:gRPC

gRPC 似乎因其性能和效率而成为微服务内部通信的热门选择。

但是,gRPC 使查询关系数据变得更加困难,并且需要做更多工作才能连接到我们的 API 网关。

选项 2:GraphQL

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

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

选项 3:两者都有?

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

问题

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

【问题讨论】:

  • 你的问题没有错。有人不只是感觉对!

标签: architecture graphql microservices grpc rpc


【解决方案1】:

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

我建议同时使用 GraphQL 和 gRPC:

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

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

  • 使用六边形架构(我公司使用Explicit Architecture)实现DDD - Domain-driven-design

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

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

  • 要在写入模型(突变)中在后端服务之间进行通信,请使用gRPC

  • gRPC 将使远程调用 CQRS 命令成为可能,就像在本地调用一样。

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

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

【讨论】:

    【解决方案2】:

    我建议您应该使用 gRPC 进行内部服务通信,因为它速度很快。现在来了您应该使用什么进行外部通信,您可以使用 REST 或 Graph QL。如果不同类型的客户端需要不同的数据量,Graph QL 是一个不错的选择,否则 REST 将更容易实现。

    在我的一个项目中,我们使用 gRPC 进行内部通信(服务使用 Go 语言),而对于外部通信,我们使用了 REST。 Go 有一些包可以帮助开发使用 REST 的服务公开并使用 gRPC 与其他服务进行内部通信。因此,在我们的场景中,它运行良好。

    【讨论】:

      猜你喜欢
      • 2020-05-29
      • 2017-12-26
      • 2020-07-22
      • 2016-08-11
      • 2021-12-04
      • 1970-01-01
      • 2014-01-08
      • 1970-01-01
      • 2015-12-26
      相关资源
      最近更新 更多