HTTP与RPC区别比较分析

一、TCP的特点与问题

我们八股文常背的
TCP是:(1)面向连接 (2)可靠的(3)基于字节流的

我们使用TCP协议的话,就需要使用socket编程

客户端需要做的

//获取socket套接字
fd = socket(AF_INET,SOCK_STREAM,0);
//绑定IP与port
bind(fd,  struct sockaddr *addr, addrlen);
//建立连接
connect(fd, struct sockaddr* addr, addrlen);

对于使用纯裸TCP存在的问题,我们关注点放在基于字节流上

什么叫基于字节流?
就是当通信双方建立连接后,我们可以形象一点的看作,通信双方之间建立了一个“通信的管道”,想要通信的数据一个一个比特位在通信管道内传输。

如果还不明白的话,我们可以打一个比方:
数据就像河流中的水一样;通信管道就是河道;河流中的水是由小的河流分支汇集而来(小分支就是一个一个用户发送数据);最终河流汇入大海(大海就是数据接收方)
大海收到河流中的水,但是收到的水并不是一批一批收到,而是不断的收到,这样大海无法确定对方在发送的时候一次发送了多少。所以在接收的时候,就可能一次收的比对方一次发的多,或者少。这就是大名鼎鼎的粘包问题
【如果还有不明白的,大家可以评论,我有空再详细讲一下】

总之,使用TCP就会有粘包问题,为了解决这个问题,我们就需要在TCP的上层(应用层)再设计一些自定义协议,解决粘包问题,最常见的就是HTTP,HTTP中的某一些字段就可以标识哪些属于同一个报文,这样就可以避免粘包问题。

二、HTTP与RPC

TCP是传输层的协议,而基于TCP造出来的HTTP和各类RPC协议,它们都只是定义了不同消息格式的应用层协议而已。

1、HTTP协议

HTTP协议【超文本传输协议】,平常我们用浏览器使用的就是HTTP一系列的协议

想对HTTP有更具体了解可以看我总结的HTTP复习系列
HTTP复习(一)
HTTP复习(二)

2、RPC协议

而RPC(Remote Procedure Call),又叫做远程过程调用。它本身并不是一个具体的协议,而是一种调用方式。

调用方法其实跟我们平常在代码中调用自定义方法(或者叫函数)差不多。只不过这个方法是远端服务器暴露出来的接口,我们通过这个接口去使用,就好像我们在调用本地函数一样,就屏蔽了底层网络细节,就方便了很多。需要完成一个任务就调用一个接口。简直不要太爽(回想一些基于TCP的socket通信)

虽然大部分RPC底层使用的是TCP,但是这也不被完全限制。RPC底层可以使用UDP/TCP,甚至是HTTP。

3、有了HTTP,why要出现RPC协议

其实RPC出现早于HTTP。
TCP是上世纪70年代出现,HTTP是90年代才流行。
但是TCP的粘包问题确实一直存在,这期间就要用各种各样的自定义应用层协议来解决粘包问题。

4、有了RPC,why要出现HTTP协议

一些app,只需要客户端与自家的服务器进行消息传递【C/S架构】,这个时候各家使用各家的RPC协议就可以。

但是随着【B/S架构】发展,浏览器要访问各种服务器,这个使用每家的服务器都必须遵守统一的规则,所以HTTP应用越加广泛。

现在【B/S】【C/S】架构分割越来越不明显了,RPC一般只用于公司内部使用了。

三、HTTP与RPC的区别

1、服务发现

首先要向某个服务器发起请求,你得先建立连接,而建立连接的前提是,你得知道IP地址和端口。这个找到服务对应的IP端口的过程,其实就是服务发现

HTTP中,你知道服务的域名,就可以通过DNS服务去解析得到它背后的IP地址,默认80端口

RPC的话,就有些区别,一般会有专门的中间服务去保存服务名和IP信息,比如consul或者etcd甚至是redis。想要访问某个服务,就去这些中间服务去获得IP和端口信息。由于dns也是服务发现的一种,所以也有基于dns去做服务发现的组件,比如CoreDNS。

可以看出服务发现这一块,两者是有些区别,但不太能分高低。

2、底层连接形式

以主流的HTTP1.1协议为例,其默认在建立底层TCP连接之后会一直保持这个连接(keep alive),之后的请求和响应都会复用这条连接。

而RPC协议,也跟HTTP类似,也是通过建立TCP长链接进行数据交互,但不同的地方在于,RPC协议一般还会再建个连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用,可以说非常高效。
在这里插入图片描述

3、传输的内容

基于TCP传输的消息,说到底,无非都是消息头header消息体body

header:存储的是一些标志信息。可以传字符串也可以传二进制

body:实际传输的内容。一般采用JSON进行序列化
在这里插入图片描述
对于主流的HTTP1.1,虽然它现在叫超文本协议,支持音频视频,但HTTP设计初是用于做网页文本展示的,所以它传的内容以字符串为主。header和body都是如此。在body这块,它使用json来序列化结构体数据。

对于HTTP/1.1来说,会有头部字段冗余,传输字符串而不是二进制,队头阻塞等等问题。但是HTTP/2进行了很好的改进。所以HTTP/2的性能不一定就比RPC差了。
甚至gRPC底层都是使用的HTTP/2

而RPC,因为它定制化程度更高,可以采用体积更小的protobuf或其他序列化协议去保存结构体数据,同时也不需要像HTTP那样考虑各种浏览器行为,比如302重定向跳转啥的。因此性能也会更好一些,这也是在公司内部微服务中抛弃HTTP,选择使用RPC的最主要原因。

总结于小林coding~

  • 10
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值