rpc和http做比较
rpc的理解
- RPC, 英文全名remote procedure call 即远程过程掉调用
- 就是说一个应用部署在A服务器上,想要调用B服务器上应用提供的方法
- 由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据
- RPC就是要像调用本地的函数一样去调用远程函数
eq:1.那为啥不能用HTTP请求,要用RPC调用呢?
- 首先,rpc是一个完整的远程调用方案,他通常包括通讯协议和序列化协议
- 其中,通信协议包含http协议,(如gRPC使用HTTP2)、自定义报文的tcp协议(如dubbo)
- 序列化协议包含基于文本编码的xml、json,基于二进制编码的protobuf、hessian等
- 而HTTP只是一个通信协议,不是一个完整的远程控制协议
- 也就是说,HTTP和RPC不是对等的概念,用来比较不合适
eq:2.为什么有些后端子系统之间是使用自定义tcp协议的rpc来做进程通信?而不是使用http协议呢?
- 首先,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这种浏览器安全相关的方面做了很多功夫