Google 远程过程调用 (gRPC) 是一个用于通过 HTTP/2 实现 API 的高性能开源框架。 它旨在使开发人员更容易构建分布式应用,尤其是当代码可能在不同的机器上运行时。

gRPC最初由 Google 开发,作为实现远程过程调用 (RPC) 的技术。 如今,gRPC 是云原生计算基金会的一个孵化项目,这意味着它已在生产中使用并得到大量贡献者的支持。

为什么要创建 gRPC?

为了理解 Google 开发 gRPC 的原因,我们先简单回顾一下API设计的时间表。

RPC 是设计和构建 API 的最古老方法之一。RPC 允许您编写代码,就好像它会在本地计算机上运行一样,即使您实际上可能调用在另一台机器上运行的服务(通常在您的本地网络上)。

实际上,这使得开发人员能够使用直接操作(如 SendUserMessages、addEntry 等),而不必考虑网络详细信息。 RPC消息轻量、高效,但是也和底层系统紧密耦合。 这使得它们难以集成和更改,并且更容易泄露有关系统的详细信息。

当引入REST API架构时,它通过提供使用通用HTTP方法(如 GET、POST、PUT 和 DELETE)访问数据和资源的统一方式解决了其中的一些挑战。 尽管 REST 简化了数据访问,但 API 通常会返回比所需更多的元数据。 REST API 还需要更多有关网络的信息(例如,向哪里发送请求),因此它们不像 RPC 那样轻量和高效。

gRPC 有哪些优势?

通过采用更新的技术,gRPC 更新了旧的 RPC 方法,使其具有互操作性且更加高效。 如今,在开发微服务架构的 API 时,这是一个有吸引力的选择。

gRPC 的一些优点包括:

  • 性能——gRPC 默认使用HTTP/2作为其传输协议和协议缓冲区,这可以提高 REST 和 JSON 通信之外的性能。
  • 流式传输 - gRPC 支持事件驱动架构的数据流式传输,例如服务器端流式传输、客户端流式传输以及用于同时发送客户端请求和服务器响应的双向流式传输。
  • 互操作性——gRPC 支持多种具有内置代码生成的编程语言,包括 C++、Java、Python、PHP、Go、Ruby、C#、Node.js 等。
  • 安全性——gRPC 提供可插入的身份验证、跟踪、负载均衡健康检查,以提高安全性和弹性。
  • 云原生 - gRPC 适用于基于容器的部署,并且与Kubernetes和 Docker 等现代基于云的技术兼容。

总体而言,gRPC 提供了一个高性能、灵活的框架,非常适合高度分布式微服务架构中的服务间通信。

了解 gRPC: 基本概念

gRPC 的优势和好处很大程度上源于采用了两种技术:

  • 用于构造消息的协议缓冲区
  • HTTP/2 作为传输层

用于构造消息的协议缓冲区

gRPC 使用协议缓冲区(或Protobufs )来定义服务和消息,而不是 XML 或 JSON。 它是一种与语言无关的机制,用于序列化服务之间相互发送的结构化消息。

与 REST API 的OpenAPI 规范的概念类似,gRPC 中的 API 契约是在 .proto 文本文件中实现的,开发人员在其中定义他们希望如何构造数据。 然后,protoc 编译器会自动将 .proto 文本文件编译成任何受支持的语言。 在运行时,消息被压缩并以二进制格式发送。

这有两个主要优点:

  • gRPC 的 CPU 占用较低,因为数据以二进制格式表示,从而减少了消息的大小。
  • 该模式定义明确,以确保客户端和服务器之间顺利交换消息,从而减少错误。

HTTP/2 作为传输层

传统上,REST API 使用 HTTP/1.1 作为传输层。 虽然 REST API 也可以通过 HTTP/2 传递,但 gRPC 对 HTTP/2 的独家使用带来了一些关键优势。 其中一个优点是能够使用二进制发送通信。 此外,HTTP/2 支持处理多个并行请求的能力,而不是一次处理一个请求。 通信也是双向的,这意味着单个连接可以同时发送请求和响应。

总的来说,这提高了性能并降低了网络利用率,这在繁忙的微服务架构中尤其有价值。 但也存在一些限制。 现代网络浏览器通常不支持 HTTP/2,因此您可能需要使用 NGINX 之类的反向代理来传递应用。

gRPC 与 REST: 比较

如今,REST 是最主流的 API 设计风格,因此它提供了一个有用的参考点来与 gRPC 进行比较。REST 和 gRPC 都是为 Web应用和微服务构建 API 的有效方法,其中一种并不一定比另一种更好。 也就是说,了解它们的主要区别对于选择最佳工具是很有帮助的。

gRPC 和 REST 之间的一些主要区别属于以下类别:

  • 协议
  • 数据格式
  • 流媒体
  • API 设计
  • 表现
  • 错误处理
  • 语言支持

协议

虽然 REST API 可以利用 HTTP/2,但 RESTful 服务传统上使用基于文本的 HTTP/1.1 作为传输层。gRPC 专门使用 HTTP/2,这是一种更高效的二进制协议,并且支持通过单个 TCP 连接进行标头压缩和多路复用等功能。

数据格式

REST API 通常使用 JSON 作为发送和接收数据的数据格式。 JSON 是基于文本的,易于读写,并且得到广泛支持。gRPC API 使用 Protobufs,它采用二进制格式,可提供更小的负载和更快的交互。 但是,Protobuf 本身并不容易读取。

流媒体

REST API 支持请求-响应模型,但对流式传输的支持有限。 相比之下,gRPC API 通过 HTTP/2 交付,并支持多种通信模式,包括一元(请求-响应)、服务器流、客户端流和双向流。

API 设计

REST 是一种以资源为中心的模型,支持 GET、POST、PUT 和 DELETE 等标准 HTTP 方法。 每个请求必须包含处理该请求所需的所有信息。 此外,API 契约通常使用 OpenAPI 规范编写,客户端和服务器的编码作为单独的步骤处理。 相比之下,gRPC 是一个以服务为中心的模型,其中消息和服务在 .proto 文件中定义。 该文件可用于为 API 客户端和服务器生成代码。

表现

REST 可能比较慢,因为它通过 HTTP/1.1 传输基于文本的数据。 每个请求都需要一次 TCP 握手,这可能会引入一些延迟。gRPC 通过 HTTP/2 支持多个流,因此多个客户端可以同时发送多个请求,而无需建立新的 TCP 连接。 它还利用了 HTTP/2 的功能,例如标头压缩。

错误处理

REST 使用标准 HTTP 状态代码进行错误处理。 相比之下,gRPC 提供了更精细的来定义错误状态代码并确保它们的一致性。 默认情况下,gRPC 模型非常有限,但最常见的扩展方法是使用Google 开发的更丰富的错误模型

语言支持

REST 几乎受到每种语言的广泛支持,但没有提供内置的代码生成功能。 实施完全留给开发人员。 gRPC 凭借其 protoc 编译器,为多种编程语言提供本机代码生成。

您应该使用 gRPC 而不是 REST 吗?

总而言之,gRPC 和 REST 之间的选择取决于你需要完成的任务。gRPC 为服务在分布式应用中进行通信提供了一种高效、高性能的方法。 也就是说,它不能被 Web 浏览器和其他客户端直接读取,并且需要API 网关或 NGINX 等反向代理才能与前端客户端交互。 对于属于事件驱动的微服务架构的内部 API 来说,它是一个绝佳的选择。

另一方面,REST 几乎在所有语言中都被广泛采用和支持。 由于数据是使用 JSON 或 XML 交换的,因此它是人类和机器可读的。 此外,它的学习曲线较低,并且受到许多网络浏览器的支持,这使其成为公开 API 的理想选择。

gRPC 微服务架构

gRPC 是微服务架构中通信的最佳选择之一。 这部分是由于性能,但也是因为其在语言支持方面的灵活性。 开发人员可以轻松构建和生成以他们喜欢的语言运行的 gRPC 客户端和服务器。 由于 gRPC 以二进制格式描述 API 契约,因此微服务可以独立于构建它们所使用的语言进行通信。

最常见的基于 gRPC 的微服务架构之一是将 API 网关置于微服务前面,然后通过 gRPC 处理所有内部通信。API 网关处理来自 HTTP/1.1 的传入请求,并将它们作为通过 HTTP/2 的 gRPC 请求代理到微服务。

gRPC 安全问题

随着 gRPC 的采用不断增长,开发人员和安全运营团队需要确保实施有效的安全解决方案。 由于 gRPC 消息采用二进制格式,因此对于需要看到基于 ASCII 的通信的设备和工具可能会出现问题。

gRPC API 也容易受到许多最常见的 API 安全威胁。 在基于 gRPC 的架构中,访问控制、加密和运行时保护等标准 API 安全实践同样重要。

gRPC 安全建议

gRPC应用和 API 需要采取整体的安全方法。 保护 gRPC 的一些最佳实践包括:

  • 架构验证——通过验证 gRPC 消息中的每个字段是否具有正确的类型和预期内容来阻止恶意攻击。
  • 数据屏蔽——屏蔽或阻止信用卡号和社会保险号等敏感数据离开系统。
  • 速率限制——对请求的大小和数量进行严格限制,以防止资源耗尽类型的 DoS 攻击。
  • 访问控制——在授予客户端访问服务的权限之前强制进行身份验证和授权。
  • 加密——使用传输层安全性 (TLS) 保护传输中的消息。

最终,您应该验证您的API 网关Web应用防火墙(WAF) 和其他 API 管理和安全工具是否能够承担保护生产中的 gRPC应用和 API 的任务。 他们应该能够导入每个服务的 .proto 文件并使用它来为 gRPC应用和 API 应用安全保护。

概括

gRPC 成为开发人员和NetflixLyft等大型公司在微服务架构中使用的流行替代方案,正获得广泛关注。 也就是说,gRPC 并不是 REST API 的替代品,也不是一种更好的构建 API 的方式。如果您主要为内部微服务环境构建 API 并且需要高效的实时通信,那么 gRPC 只是一种值得考虑的替代方案。

展望未来,gRPC 可能会凭借其性能优势和易于开发的特点继续受到云原生应用的青睐。 同时,需要公开 API 的开发人员将继续在其应用中使用 REST。 由于 REST 的向后兼容性以及与现有 API 基础设施和操作的深度集成,它还将继续存在于云原生环境中。