聊聊RPC
既然有了HTTP协议,为什么还要有RPC
TCP协议
网络的基石就是TCP与UDP协议,TCP协议的特点就是面向连接、可靠、字节流。但是光有TCP协议是不够的,因为通过TCP协议收发的消息是一个字节流,没有对这个字节流定义消息的边界。只有在TCP的基础上定义字节流中哪一段是消息头、消息体才能实现消息的收发,因此在TCP协议的基础上出现了HTTP、RPC等协议。
HTTP(Hypertext Transfer Protocol)是一种用于在网络上传输超文本数据的协议,通常用于构建 Web 应用。它是一个应用层协议,基于客户端-服务器模型,通过请求-响应的方式进行通信。HTTP协议主要用于传输HTML页面、图片、样式表等资源,并且是无状态的,每个请求都是独立的,服务器不保存关于客户端的任何信息。
RPC(Remote Procedure Call)本身不是一种协议,而是指一种调用方式,用于在分布式系统中进行远程调用。RPC允许一个程序调用另一个地址空间(通常是在远程机器上)的过程,就像调用本地过程一样。RPC框架可以通过网络传输数据,让远程的服务被调用,然后将结果返回给调用方。
传输内容
RPC协议诞生在80年代,http诞生在90年代,有了RPC协议就可以保证一个企业内部服务的相互调用。但是浏览器需要访问各类网站,所以需要一个统一的标准,因此就诞生了http协议。
由于Http是为浏览器打造的,其协议的内容有大量的冗余,序列化方式一般为JSON,会降低一些性能,所以定制化的RPC协议冗余内容更少,序列化方式选择更多,性能也更佳
服务发现
要想向某个服务发起请求必须建立连接,建立连接的前提是知道ip地址和端口,寻找服务地址的过程就是服务发现。HTTP协议会通过DNS解析得到域名背后的地址,而RPC则需要一些中间服务来保存服务名称和信息,例如Consul、Etcd、Redis
底层连接形式
HTTP/1.1 协议为例,其默认在建立底层 TCP 连接之后会一直保持这个连接(Keep Alive),之后的请求和响应都会复用这条连接。
而 RPC 协议,也跟 HTTP 类似,也是通过建立 TCP 长链接进行数据交互,但不同的地方在于,RPC 协议一般还会再建个连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用。
总结:
- 抽象性更强: RPC通常提供更高级别的抽象,使开发人员能够像本地调用一样调用远程服务,而不必关心底层通信细节。这有助于简化代码和提高开发效率。
- 性能优化: RPC通常采用二进制协议,相对于HTTP的文本协议,可以更有效地序列化和传输数据。此外,一些RPC框架支持更高级的特性,如连接池、复用等,有助于提高性能。
- 多协议支持: RPC框架通常支持多种协议,例如gRPC支持HTTP/2,Thrift支持自定义二进制协议。这使得开发人员可以根据具体需求选择合适的协议。
- 强类型支持: 很多RPC框架是强类型的,支持定义数据结构和接口,从而在通信时提供更多的类型安全性。
- 适用于不同场景: RPC通常更适用于服务间通信,而HTTP更适用于客户端和服务器之间的通信。RPC框架可以更好地满足服务间通信的需求,例如微服务架构中的服务调用。