首先要明確兩個概念,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調用則少了這些特性。