首先要明确两个概念,rpc的中文全称是远程进程调用,意思就是一个机器调用另外一个机器的进程。更像是操作系统里的概念,而http是网络传输协议。
所以这个问题应该是,为什么用自定义的tcp而不是http?
rpc只是对底层协议的封装,对具体使用什么通信协议没有太多的要求
rpc主要包含两个方面,一个是传输协议,一个是序列化协议。
- 传输协议:grpc 用的就是http2协议,dobbo很多框架用的是tcp协议。
- 序列化协议:基于二进制的protobuf,基于字符的xml,json
关于序列化协议,其实大家说的rpc支持的二进制编码的序列化,用http也能实现,当然http头还是需要字符编码,但body可以用二进制编码。
所以主要的原因在传输协议上。http传输有一个缺陷就是header在一个包中的占比会大,并且是字符编码的,所以会增加了很多无用的噪比。而tcp的报文头只有16byte相对来说要更小一些。
rpc更像是一个操作系统的概念,或者说是一个思想,那就是程序员只管像调用本地的函数一样取调用一个远程函数,而不用管IO。
至于负载均衡和服务发现,其实用http也可以实现。但单纯地使用http调用则少了这些特性。