「 计算机网络 」HTTP和RPC的区别与联系
参考&鸣谢
HTTP 和 RPC 的区别 小十七_
Http协议和Rpc协议有什么区别? 俗人杂念
为什么要自研RPC框架?HTTP和RPC的区别 starine
既然有HTTP协议,为什么还要有RPC 小白debug
文章目录
- 「 计算机网络 」HTTP和RPC的区别与联系
- 一、引言
- 二、什么是HTTP协议
- 三、什么是RPC协议
- 四、HTTP和RPC的区别
- 功能特性
- 实现原理
- 应用层面
- 五、为什么许多大公司还要自研 RPC 框架?
- 六、联系
一、引言
在微服务中,什么时候用HTTP协议?什么时候用RPC协议?
我们通常采用的原则为:向系统外部暴露采用HTTP,向系统内部暴露调用采用RPC方式。 也就是说前后端之间(网关之前)用http,各个服务之间用rpc。
那么为什么这样用呢?
有人说HTTP与RPC采取不同的协议,RPC所传输的数据是经过压缩的二进制数据,但是HTTP协议同样支持gzip压缩算法。其次,HTTP的报头包括太多无效信息,但是20-60字节的首部长度会对业务有很大影响吗?以现阶段计算机处理及网络传输速度,影响很大吗?或者能用增加服务器的方式去解决的问题,为什么很多公司要自研RPC框架呢?
首先需要解释:
RPC
是远程方法调用,即一个应用调用另一个应用的接口。 如何在一个应用中调用另一个应用?可以通过HTTP
协议,也可以通过自定义的TCP
协议实现通信。最终实质上完全相同,都是通过Socket
解析调用方的参数,最后再将处理结果通过Socket
传输。
HTTP 既然也是 RPC 的一种实现?为什么公司还要自研 RPC 框架?为什么他们的应用进程不之间通过HTTP协议完成交互?
最主要的原因还是RPC框架包含了重试机制,路由策略,负载均衡策略,高可用策略,流量控制策略等等。 如果应用进程之间只使用HTTP协议通信,显然是无法完成上述功能的。
二、什么是HTTP协议
HTTP(Hypertext Transfer Protocol)(超文本传输协议)是一种用于传输超媒体文档(例如HTML)的应用层协议。它是Web应用程序开发中最常用的协议之一,也是互联网上数据交换的基础。HTTP使用TCP/IP协议作为其传输层协议,主要用于Web浏览器和服务器之间的通信,以及在移动应用程序和Web服务之间进行数据交换。
HTTP 协议规定了浏览器和服务器的一种通信格式,让任何浏览器和服务器都可以以这种形式正常交流,比如:
数据传输通常是基于 TCP/IP 协议的。但是 HTTP 本身没有规定数据传输一定要用什么协议,只要是可靠的传输其实都可以,目前基本都是基于 TCP/IP 的。
三、什么是RPC协议
RPC(远程过程调用)是一种在分布式系统中实现进程间通信(IPC)的技术。它允许程序调用另一个地址空间的函数或过程,而无需了解底层网络细节。RPC通常用于分布式系统中,其中不同的节点需要相互通信。RPC协议隐藏了网络通信的细节,使得开发者可以像调用本地函数一样调用远程函数或过程。
本地过程调用,之前在单体时代,我们服务中的 service 调用的就是我们服务中的方法
const data = await this.user.getUserList()
但是现在都是微服务的方式,根据业务模块做了不同服务的拆分,比如校验服务、基础服务等,不同的小组维护不同自己模块的服务。
不同服务之间需要进行通信,就可以使用 rpc 的方式
const data = await userRpc.getUserList()
四、HTTP和RPC的区别
RPC主要用于系统内部服务调用,传输效率高(基于TCP,报文小),性能消耗低(高效的二进制传输、字节小、序列化耗时少),服务治理方便。
http是超文本协议,其包含的信息往往比较臃肿,网关之前一般用http,服务之间能用rpc协议就用rpc协议,除非少部分情况,一些旧的服务它可能只支持http,或者一些node开发团队只能用http,也不太好改成rpc。
功能特性
HTTP是一个属于应用层的超文本传输协议,是万维网数据通信的基础,主要服务在页面端和服务端的数据传输。
RPC 是一个远程过程调用协议,它的定位是实现不同计算机应用之间的数据通信,屏蔽通信底层的复杂性,让我们在实际使用过程中能像调用本地服务一样去完成远程服务的调用,所以这两个协议在定位上完全不同的。
实现原理
http 协议是一个已经实现并且成熟的应用层协议(如图),它定义了通信的报文格式 Request Body 和 Request Header,以及 Response Body 和 Response Header。
也就是说,符合这样一个协议特征的通信协议,才是 http 协议。
RPC 只是一种协议的规范,它并没有具体实现,只有按照 RPC 通信协议规范实现的通信框架,也就是 RPC 框架,才是协议的具体实现,比如 Dubbo、 gRPC 等。
因此,我们可以在实现 RPC 框架的时候,自定义报文通信的协议规范、自定义序列化方式、自定义网络通信协议的类型等等
从这个层面来说,http 是成熟的应用协议,而 RPC 只是定义了不同服务之间的通信规范。
应用层面
http 协议和实现了 RPC 协议的框架都能够实现跨网络节点的服务之间通信
并且他们底层都是使用 TCP 协议作为通信基础。
但是,由于 RPC 只是一种标准协议,只要符合 RPC 协议的框架都属于 RPC 框架。
因此,RPC 的网络通信层也可以使用 HTTP 协议来实现,比如 gRPC、OpenFeign 底层都采用了 http 协议。
五、为什么许多大公司还要自研 RPC 框架?
HTTP 既然也是 RPC 的一种实现?为什么公司还要自研 RPC 框架?
HTTP协议可以说是目前最为主流的一种网络通信协议,但是很多大厂依然自研RPC框架,如字节、阿里以及腾讯等?为什么他们的应用进程不之间通过HTTP协议完成交互?
最主要的原因还是RPC框架包含了重试机制,路由策略,负载均衡策略,高可用策略,流量控制策略等等。
如果应用进程之间只使用HTTP协议通信,显然是无法完成上述功能的。
一般来说,HTTP服务主要是针对小企业的,因为虽然RPC效率和性能更高,但是HTTP服务开发迭代会更快。而且在接口不多、系统与系统交互较少的情况下,Http通信是常使用的一种通信手段;优点就是简单、直接、开发方便。利用现成的http协议就可以进行服务间的数据传输。接口可能返回一个JSON字符串,然后客户端再去处理这个返回的信息,从而可以比较快速地进行开发。
但是对于大型企业来说,内部子系统较多、接口非常多的情况下,RPC框架的好处就显示出来了。首先是长链接,不必每次通信都要像http一样去3次握手,减少了网络开销;其次,RPC框架一般都有注册中心,有丰富的监控管理;发布、下线接口、动态扩展等,对调用方来说是无感知、统一化的操作。
六、联系
HTTP和RPC是两种不同的通信协议,它们都用于实现网络通信。虽然它们的目的和应用场景存在一定的差异,但它们之间也有一些联系。
具体而言,HTTP是一种基于文本的协议,常用于浏览器和服务器之间的通信,主要用于传输超文本和其他网络资源,如HTML文件、CSS样式表、JavaScript脚本等。而RPC是一种远程过程调用协议,它可以让程序在一个计算机上执行另一个计算机上的代码,并将结果返回给调用方。
尽管HTTP和RPC的应用场景存在较大的差异,但它们都依赖于底层的TCP/IP协议栈,且都需要进行数据序列化、网络传输和反序列化等操作。此外,在实际的软件开发中,很多情况下也会将它们结合起来使用,例如通过HTTP协议调用RPC服务,或者将RPC服务部署在HTTP服务器上,以便通过HTTP协议访问。因此,HTTP和RPC虽然有一定的差异,但在某些情况下也可以互补使用。