最近被问到一个问题:“RPC和HTTP有什么区别?”
我说:“前者比后者效率高,但实现比较麻烦。总得来说后者比前者更“重”,导致效率低。”
回答的十分笼统,我觉得甚至没有解释清楚这个东西。
所以决定认真的再看看这两位“熟悉的朋友”。

HTTP

什么是HTTP?

HTTP是HyperText Transfer Protocol(超文本传输协议)的缩写。是一个应用层协议,规定了客户端(用户)和服务端(网站)之间请求和应答的标准,相互间通常使用TCP协议来进行连接,使用URI(Uniform Resource Identifiers,统一资源标识符)来标识资源。

URN和URL都是URI的表示形式。

  • URN(Uniform Resource Name,统一资源名称),为资源提供持久的、位置无关的标识方式,格式:urn:<NID>:<NSS>
  • URL(Uniform Resource Locator,统一资源定位系统),用于标识互联网资源地址,完整格式:[协议类型]://[访问资源需要的凭证信息]@[服务器地址]:[端口号]/[资源层级UNIX文件路径][文件名]?[查询]#[片段ID]

RPC

什么是RPC?

RPC是Remote Procedure Call(远程过程调用)的缩写。是一种服务器-客户端(Client/Server)模式,它允许一台计算机中的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序。
RPC通常包含传输协议和编码协议。

  • 传输协议:HTTP,TCP等
  • 编码协议:xml、json等

RPC是如何工作的?

RPC
  1. 客户端调用客户端stub(client stub)。这个调用是在本地,并将调用参数push到栈(stack)中。
  2. 客户端stub(client stub)将这些参数包装,并通过系统调用发送到服务端机器。打包的过程叫 marshalling。(常见方式:XML、JSON、二进制编码)
  3. 客户端本地操作系统发送信息至服务器。(可通过自定义TCP协议或HTTP传输)
  4. 服务器系统将信息传送至服务端stub(server stub)。
  5. 服务端stub(server stub)解析信息。该过程叫 unmarshalling。
  6. 服务端stub(server stub)调用程序,并通过类似的方式返回给客户端。

为什么需要RPC?

  1. RPC可以让不同的程序间进行交互,调用方式和本地方法调用一样,使用方便。
  2. 其传输协议可以使用传输层协议,比起网络层协议,效率更高。

结语

回到朋友最初的提问,这两者什么区别?一个是传输协议,一个是服务器-客户端模式,RPC可以选择在底层使用HTTP。
感觉把概念捋清了,很多东西就不言自明了。很多习以为常的概念,还是要多了解,最后内化成自己的东西,不然解释起来也是模棱两可XD。

参考

  1. Hypertext Transfer Protocol
  2. 十分钟搞懂HTTP和HTTPS协议?
  3. Remote procedure call
  4. 既然有 HTTP 请求,为什么还要用 RPC 调用? - 易哥的回答 - 知乎
  5. 浅谈 RPC 和 REST: SOAP, gRPC, REST