gRPC 是一个开源的高性能远程过程调用(RPC)框架,它可以在不同的平台上进行通信。它使用 Protocol Buffers 作为数据传输格式,可以实现双向流和流式传输等功能。

什么是 RPC 呢?
RPC 是 Remote Procedure Call 的简称,中文叫远程过程调用。
说的白话一点,可以这么理解:比如有两台服务器A和B,A服务器上的应用想调用B服务器上的另一个应用提供的方法,但由于不在同一个内存空间,无法直接调用,所以需要通过网络来实现调用效果。
其实大家在平时开发中有接触过,例如:前端去请求后端的接口。我们来想一下前后端要制定什么规则,才能进行接口请求:
- 调用的语义,也可以理解为接口规范。(比如 RESTful )
- 网络传输协议 (比如 HTTP )
- 数据序列化反序列化规范(比如 JSON )
只有制定了这些规则,才能保证前后端通信的规范性

从上图中可以看出,RPC 是一种客户端-服务端(Client/Server)模式。从某种角度来看,所有本身应用程序之外的调用都可以归类为 RPC。无论是微服务、第三方 HTTP 接口,还是读写数据库中间件 Mysql、Redis。
gRPC 和 RPC 的关系是什么?
gRPC 是由谷歌开源的一种 RPC 框架,设计之初便是为了解决谷歌内部的 RPC 使用场景所遇到的问题。因此你可以说 gRPC 就是一种 RPC 框架类型。具体来说:
- RPC是一种编程范式,定义了客户端像调用本地函数一样调用远程函数的方式。
- gRPC 是 Google 基于 HTTP/2 和 Protocol Buffers 实现的 RPC 框架。
- gRPC 支持双向流、流控、头压缩等,性能优异。
所以 gRPC 是 RPC 模式的一种高效实现,提供了语言中立、高性能、安全的 RPC 服务框架,使得RPC服务调用更加高效、简单、通用。它是 RPC 模式的一种优秀代表。
gRPC 的优势有哪些?
gRPC 是基于 HTTP/2 设计的~所以 gRPC 的优点自然也包含了 HTTP/2 的优点:
- 数据传输二进制分帧
- 多路复用
- 服务端推送
- 头部压缩
下面是一个简单的表格,罗列了gRPC的主要优势及其简要描述:
优势 | 描述 |
高性能 | 利用HTTP/2提供高效的网络传输,支持双向流、头部压缩、多路复用。 |
跨语言支持 | 支持多种编程语言间的无缝通信和集成。 |
自动化生成代码 | 使用Protobuf定义服务,自动生成客户端和服务器代码。 |
错误处理 | 定义丰富的错误码和状态码,便于异常处理和调试。 |
通信模式多样 | 支持多种RPC通信模型,如一对一、服务端流、客户端流、双向流等。 |
可扩展性 | 拦截器和插件机制允许功能的扩展和定制。 |
社区和生态系统 | 拥有活跃的社区支持和丰富的相关工具及库。 |
gRPC 是怎么传输的?

从上图的 gRPC 传输模型可以看出,客户端 Stub 从 gRPC Core 库发起请求,序列化成 Protobuf 消息格式,然后传输至服务端。
服务端 Stub 接收客户端请求,处理请求中的 Protobuf 数据并进行反序列化,然后将请求对象传入服务器并实现业务逻辑处理。最终再将响应序列化后返回给客户端,从而形成一次完整的接口调用过程。
使用 Apifox 发送 gRPC 调试请求
使用 Apifox,你可以轻松地在没有任何代码的情况下调试 gRPC。Apifox 支持基于 .proto 文件的一元调用和流式调用。在创建项目时,选择「gRPC 项目」并导入 .proto 文件,你就可以直接调用 gRPC 接口了。

在调试 gRPC 接口之前,也需要先导入作为 API 定义的 .proto 文件。如果一个 .proto 文件依赖于其他 .proto 文件,那么需要手动添加依赖关系目录。

一元调用
只需要在地址栏填写 URL ,然后点击「调用」按钮,即可发起一元调用。

流式调用
流式调用包含服务端流、客户端流、双向流。
在发起调用之后,你可以在 Message 标签下撰写消息并发送。Apifox 提供了一个时间线视图,按照时间顺序集中展示调用状态、发送的消息、收到的消息。点击消息之后,可以非常方便地查看消息的详情。

启用 TLS
gPRC 协议支持通过 TLS 建立安全的连接。在 Apifox 中,你可以通过点击 URL 前面的协议选择器来快速切换 TLS 的状态。
此外,Apifox 也兼容在 URL 中使用 grpcs://
来启用 TLS 连接。与之相对应,grpc://
表示不启用 TLS。

查看 Proto 文件内容
在 Apifox 中,通过点击左侧目录树中的 Proto,你可以查看 Proto 文件的原始内容。

查看请求和响应的参数
gRPC 使用 ProtoBuf 作为序列化格式,这意味着在发送、接收消息时,每条消息都以 ProtoBuf 格式进行传输。
与其他基于文本的序列化格式(JSON、XML)不同,ProtoBuf 是一种二进制格式,不适合人类进行书写、阅读。因此,在 Apifox 中调用 gRPC 接口时,所有消息都使用 JSON 格式来撰写、展示。在接口信息页面,可以很方便地查看以 JSON 形式表示的请求参数和响应参数。

总结
gRPC 是一高性能远程过程调用(RPC)框架,通过使用 Protocol Buffers 作为数据传输格式,实现了在不同平台上的通信,并支持双向流和流式传输。RPC 是远程过程调用的缩写,实现跨服务器调用。在开发中,规定调用规则、网络传输协议以及数据序列化反序列化规范是确保前后端通信规范性的关键。
Apifox 作为一体化 API 协作平台,支持 gRPC 接口调试,提供了便捷的导入 .proto 文件、一元调用和流式调用功能。一元调用只需填写 URL 并点击“调用”按钮,而流式调用包含服务端流、客户端流、双向流,可以在时间线视图中方便查看调用状态和消息详情。Apifox 还支持在 URL 中切换 TLS 状态,兼容使用 grpcs://
来启用 TLS 连接, grpc:// 表示不启用 TLS。通过点击左侧目录树中的 Proto,可以查看 Proto 文件的原始内容。由于 gRPC 使用 ProtoBuf 作为序列化格式,Apifox 在调用gRPC 接口时使用 JSON 格式展示请求和响应参数,简化了数据传输的可读性。
总体而言,Apifox 简化了 API 工作流,确保了前端、后端和测试人员之间的高效协作,为开发人员提供了一体化的 API 管理解决方案。

知识扩展: