远程过程调用RPC(Remote Procedure Call)
是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一个地址空间(通常为一个开放网络的一台计算机)的子程序,而程序员就像调用本地程序一样,无需额外地为这个交互作用编程(无需关注细节)。RPC
是一种服务器-客户端Client/Server
模式,经典实现是一个通过__发送请求-接受回应__进行信息交互的系统。
超文本传输协议HTTP(HyperText Transfer Protocol)
是一种用于分布式、协作式和超媒体信息系统的__应用层协议__。
现在我们来分析RPC
和HTTP
区别比较明显的几个点:
首先要向某个服务器发起请求,得先建立连接,而建立连接的前提是,得知道IP
地址和端口。这个找到服务对应的IP
端口的过程,其实就是服务发现。
在HTTP
中,则是根据服务的域名,通过DNS
服务去解析得到IP
地址,默认80端口。
而RPC
的话,就有些区别,一般会有专门的中间服务去保存服务名和IP
信息,比如consul
或etcd
,甚至是redis
。想要访问某个服务,就去这些中间服务去获得IP
和端口信息。由于dns
也是服务发现的一种,所以也有基于dns
去做服务发现的组件,比如CoreDNS
。
以主流的HTTP1.1
协议为例,其默认在建立底层TCP
连接之后会一直保持这个连接keep alive
,之后的请求和响应都会复用这条连接。
而RPC
协议,也跟HTTP
类似,也是通过建立TCP
长链接进行数据交互,但不同的地方在于,RPC
协议一般还会再建个连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用。
RPC
,使⽤⾃定义的TCP
协议,可以让请求报⽂体积更⼩,或者使⽤HTTP2
协议,也可以很好的减少报⽂的体积,提⾼传输效率。
HTTP
,如果是基于HTTP1.1
的协议,请求中会包含很多⽆⽤的内容,如果是基于HTTP2.0
,那么简单的封装以下是可以作为⼀个RPC
来使⽤的,这时标准RPC
框架更多的是服务治理。
因为良好的RPC
调用是面向服务的封装,针对服务的可用性和效率等都做了优化。单纯使用HTTP
调用则缺少了这些特性。