RPC 和 HTTP 的区别
概念层面
- RPC(Remote Procedure Call,远程过程调用):是一种允许程序调用另一个地址空间(通常是共享网络上的另一台机器)中的过程或函数的技术,就像调用本地函数一样自然。它屏蔽了底层网络通信的细节,使得开发人员可以更专注于业务逻辑。
- HTTP(Hypertext Transfer Protocol,超文本传输协议):是用于传输超文本的协议,主要用于在客户端和服务器之间传输网页、图片等资源。它是一种应用层协议,基于请求 - 响应模型。
- 数据格式
- RPC:通常使用自定义的二进制协议或一些高效的序列化协议(如 Protobuf、Thrift 等),这些协议可以将数据进行高效的编码和解码,减少数据传输量,提高传输效率。
- HTTP:常见的数据格式有 JSON、XML 等文本格式,相对二进制格式来说,文本格式的数据传输量较大,解析和序列化的效率也相对较低。
性能层面
- 通信效率
- RPC:由于使用了高效的序列化协议和自定义的传输协议,在数据传输和处理上通常具有更高的效率,尤其在内部系统之间的通信中,能够更快地完成数据交互。
- HTTP:由于其通用性和文本格式的特点,在传输效率上相对较低,尤其是在处理大量数据时,会消耗更多的带宽和处理时间。
- 连接方式
- RPC:可以根据具体需求选择长连接或短连接,长连接可以减少连接建立和断开的开销,提高通信效率。
- HTTP:早期的 HTTP 1.0 主要使用短连接,每次请求都需要建立和断开连接,开销较大;HTTP 1.1 支持持久连接,但在高并发场景下,连接管理仍然相对复杂。
Go 语言使用 gRPC 而非 HTTP 的原因
高性能
- 序列化效率高:gRPC 使用 Protocol Buffers 作为默认的序列化协议,它是一种高效的二进制序列化协议,能够将数据压缩成很小的体积,并且在编码和解码过程中具有很高的性能。相比之下,HTTP 常用的 JSON 格式在数据量较大时,传输和解析的效率较低。
- 传输效率高:gRPC 基于 HTTP/2 协议,HTTP/2 具有二进制分帧、多路复用、头部压缩等特性,能够更高效地利用网络带宽,减少延迟,提高通信效率。
强类型和接口定义
- 明确的接口定义:gRPC 使用 Protocol Buffers 的
.proto
文件来定义服务接口和消息结构,这种方式提供了明确的接口规范,使得服务的提供者和调用者之间的交互更加清晰和可维护。 - 类型安全:在编译时,gRPC 会根据
.proto
文件生成对应的 Go 代码,保证了类型的安全性,减少了因类型不匹配而导致的错误。
多语言支持
- 跨语言调用:gRPC 支持多种编程语言,包括 Go、Java、Python 等。这使得不同语言编写的服务之间可以方便地进行交互,在构建分布式系统时具有很大的优势。
流式传输
- 双向流式通信:gRPC 支持客户端和服务器之间的双向流式通信,这在需要实时数据传输或大数据量传输的场景中非常有用,例如实时监控、文件传输等。而 HTTP 在流式传输方面的支持相对较弱。