前面详细讨论了 RESTful 服务的局限性,正是这些局限性为 gRPC 的诞生奠定了基础。无独有偶,还有很多新兴的进程间通信技术,它们的问世也是为了满足相同的需求。下面看一下目前较为流行的技术,并将之与 gRPC 进行对比。
01. Thrift
Apache Thrift(以下简称 Thrift)是与 gRPC 类似的 RPC 框架,最初由 Facebook 开发,后来被捐赠给了 Apache。它有自己的接口定义语言并提供了对多种编程语言的支持。Thrift 可以在定义文件中定义数据类型和服务接口。Thrift 编译器以服务定义作为输入,能够生成客户端代码和服务器端代码。Thrift 的传输层为网络 I/O 提供了抽象,并将 Thrift 从系统的其他组成部分中解耦出来,这意味着 Thrift 可以在任意传输实现上运行,如 TCP、HTTP 等。
如果将 Thrift 和 gRPC 进行对比,可以发现它们遵循相同的设计理念和使用目标。但是,两者之间也有一些重要的区别。
传输方面
相对于 Thrift,gRPC 的倾向性更强,它为 HTTP/2 提供了一流的支持。gRPC 基于 HTTP/2 的实现充分利用了该协议的功能,从而实现了高效率并且能够支持像流这样的消息模式。
流方面
gRPC 服务定义原生支持双向流(客户端和服务器端),它本身便是服务定义的一部分。
采用情况和社区资源方面
从采用情况来看,gRPC 的势头似乎更好,它已围绕 CNCF 项目成功构建了一个良好的生态系统。同时,gRPC 的社区资源非常丰富,比如良好的文档、外部的演讲以及示例。因此,相对于Thrift,采用 gRPC 会更顺利一些。
性能方面
虽然目前还没有 gRPC 和 Thrift 对比的官方结果,但一些在线资源对比了两者的性能,结果显示 Thrift 的数据表现更好。然而,gRPC 的绝大多数发布版本经过了大量的性能测试。因此,性能问题不太可能是选择 Thrift 而非 gRPC 的决定性因素。同时,一些其他 RPC 框架提供了类似的功能,但不管怎样,gRPC 是目前最标准、最具交互性和采用范围最广的 RPC 技术,处于领先地位。
02. GraphQL
GraphQL 是另一项越来越流行的进程间通信技术,该项目由Facebook 发起并通过开源进行了标准化。它是一门针对 API 的查询语言,并且是基于既有数据满足这些查询的运行时。GraphQL 为传统的客户端–服务器端通信提供了一种完全不同的方法,该方法允许客户端定义希望获得的数据、获取数据的方式以及数据格式。
gRPC 则有针对远程方法的特定契约,借此实现客户端和服务器端之间的通信。
GraphQL 更适合面向外部的服务或 API,它们被直接暴露给消费者。在这种情况下,消费者需要对来自服务器端的数据有更多的控制权。以在线零售应用程序场景为例,假设 ProductInfo 服务的消费者只需要关于商品的特定信息,而不是商品属性的完整集合,而且他们希望能有一种方法来指定想要的信息,那么我们可以借助GraphQL 来建模一个服务,允许消费者使用 GraphQL 查询语言来查询服务并获取想要的信息。
在 GraphQL 和 gRPC 的大多数使用场景中,GraphQL 用于面向外部的服务或 API,而支撑 API 的内部服务则使用 gRPC 来实现。
接下来看一些实际的 gRPC 采用者及其使用场景。