RPC和HTTP的区别
RPC和HTTP的区别
- RPC(Remote Procedure Call),即远程过程调用。如果一个服务部署在A服务器上,想要调用B服务器上应用提供的方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。可以这么说,RPC就是要像调用本地的函数一样去调用远程方法。
- RPC是一个完整的远程调用方案,他通常包括通信协议和序列化协议。其中通信协议包括http协议(如gRPC使用http2)、自定义报文的tcp协议(如dubbo)。序列化协议包含基于文本编码的xml、json,基于二进制编码的protobuf、hessian等。所以RPC是远程过程调用的完整方案,而HTTP只是一个通信协议,它俩是不对等的概念,用来比较不太合适
- 为什么很多后端服务间通信使用RPC呢?首先http协议支持连接池复用,也就是建立一定数量的连接不断开,并不会频繁的创建和销毁连接,其次http也可以使用protobuf这种二进制协议对内容进行编码。也就是说连接建立与断开的开销和序列化协议并不是主要影响因素,二者最大的区别还是在传输协议上。http的传输协议中header部分有很多冗余的部分,像Content-Type、Last-Modified、Expires等。即使http body是使用二进制编码协议,header头的键值对却用了文本编码,非常占用字节数。而自定义的tcp协议,可以精简传输内容,传输效率更高。 比如下面的自定义tcp协议的报文: 1-4 byte,length 5-8 byte, type 9-16 byte,package_id 17-length+16 byte,package_data 报文头占用的字节数也就16个byte,大大减少了传输内容。高并发情况下,少几个字节,乘以巨大的请求数量,能带来巨大的收益。因此,对于性能要求比较高的系统来说,通常使用自定义tcp协议的rpc来做服务间通信。其实使用http协议比较多的还是前后端的通信,原因在于主流网页浏览器都支持http协议,而且http在缓存、幂等重试乃至cookie这种浏览器安全相关的方面做了很多功夫。