gRPC 是一种支持互联网规模的进程间通信技术,可以弥补传统进程间通信技术的大多数缺点。鉴于 gRPC 所带来的收益,越来越多的现代应用程序和服务器将其进程间通信协议替换成了 gRPC。在面对如此众多的可选方案时,为什么选择 gRPC 作为通信协议呢?下面详细介绍gRPC 的关键优势。

01. gRPC 的优势

gRPC 的优势是它被越来越多的人所采用的关键所在,主要有以下几个方面。

提供高效的进程间通信

gRPC 没有使用 JSON 或 XML 这样的文本化格式,而是使用一个基于 protocol buffers 的二进制协议与 gRPC 服务和客户端通信。同时,gRPC 在 HTTP/2 之上实现了 protocol buffers,从而能够更快地处理进程间通信。这样一来,gRPC 就变成了最高效的进程间通信技术之一。

具有简单且定义良好的服务接口和模式

gRPC 为应用程序开发提供了一种契约优先的方式。也就是说,首先必须定义服务接口,然后才能去处理实现细节。因此,与RESTful 服务定义中的 OpenAPI/Swagger 和 SOAP Web 服务中的WSDL 不同,gRPC 提供了简单但一致、可靠且可扩展的应用程序开发体验。

属于强类型

因为使用 protocol buffers 来定义 gRPC 服务,所以 gRPC 服务契约清晰定义了应用程序间进行通信所使用的类型。这样一来,在构建跨多个团队和技术类型的云原生应用程序时,对于其所产生的大多数运行时错误和互操作错误,可以通过静态类型来克服,因此分布式应用程序的开发更加稳定。

支持多语言

gRPC 支持多种编程语言。基于 protocol buffers 的服务定义是语言中立的。因此,我们可以选择任意一种语言,它们都能与现有的 gRPC 服务或客户端进行互操作。

支持双工流

gRPC 在客户端和服务器端都提供了对流的原生支持,这些功能都被整合到了服务定义本身之中。因此,开发流服务或流客户端变得非常容易。与传统的 RESTful 服务消息风格相比,gRPC 的关键优势就是能够同时构建传统的请求–响应风格的消息以及客户端流和服务器端流。

具备内置的商业化特性

gRPC 提供了对商业化特性的内置支持,如认证、加密、弹性(截止时间和超时)、元数据交换、压缩、负载均衡、服务发现等(第 5 章会讨论这些功能)。

与云原生生态系统进行了集成

gRPC 是 CNCF 的一部分,大多数现代框架和技术对 gRPC 提供了原生支持。例如,CNCF 下的很多项目(如 Envoy)支持使用gRPC 作为通信协议。另外,对于横切性的特性,比如度量指标和监控,gRPC 也得到了大多数工具的支持,比如使用 Prometheus 来监控 gRPC 应用程序。

业已成熟并被广泛采用

通过在谷歌进行的大量实战测试,gRPC 已发展成熟。许多大型科技公司采用了 gRPC,如 Square、Lyft、Netflix、Docker、CoreOS 和思科等。

与其他技术一样,gRPC 也存在一定的劣势。在开发应用程序时,了解这些方面非常有用。

02. gRPC 的劣势

下面介绍 gRPC 的一些劣势,在选择它来构建应用程序时,需要注意以下 3 点。

gRPC 可能不太适合面向外部的服务

大多数的外部消费者可能对 gRPC、REST 或 HTTP 等协议很陌生。因此,如果希望将应用程序或服务通过互联网暴露给外部客户端,gRPC 可能不是最适合的协议。gRPC 服务具有契约驱动、强类型的特点,这可能会限制我们向外部暴露的服务的灵活性,同时消费者的控制权会削弱很多(这与 1.2.6 节讨论的 GraphQL 协议有所不同)。按照设计,gRPC 网关将是克服该问题的解决方案。第 8 章会对此进行详细讨论。

巨大的服务定义变更是复杂的开发流程

在现代的服务间通信场景中,模式修改很常见。如果出现巨大的 gRPC 服务定义变更,通常需要重新生成客户端代码和服务器端代码。这需要整合到现有的持续集成过程中,可能会让整个开发生命周期复杂化。但是,大多数 gRPC 服务定义的变更可以在不破坏服务契约的情况下完成,而且只要不引入破坏性的变更,gRPC 就可以与使用不同版本 proto 的客户端和服务器端进行交互。因此,大多数情况并不需要重新生成代码。

gRPC 生态系统相对较小

与传统的 REST 或 HTTP 等协议相比,gRPC 的生态系统依然相对较小。浏览器和移动应用程序对 gRPC 的支持依然处于初级阶段。

在开发应用程序时,必须注意这些方面的问题。由此可以看到,gRPC 并不是适用于所有进程间通信需求的万能技术。相反,你需要评估业务场景和需求,选择适当的消息协议。第 8 章会讨论其中的一些指导原则。

如前所述,目前有很多新兴的进程间通信技术。因此,有一点非常重要,那就是了解如何将 gRPC 与在现代应用程序开发中流行的类似技术进行对比,从而为服务选择最合适的协议。

文档更新时间: 2023-09-02 03:31   作者:Minho