0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

HTTP协议用得好好的,为什么还要用RPC协议?

Q4MP_gh_c472c21 来源:小白debug 作者:小白debug 2022-11-22 17:31 次阅读

想起我刚工作的时候,第一次接触RPC协议,当时就很懵,我HTTP协议用得好好的,为什么还要用RPC协议?

于是就到网上去搜。

不少解释显得非常官方,我相信大家在各种平台上也都看到过,解释了又好像没解释,都在用一个我们不认识的概念去解释另外一个我们不认识的概念,懂的人不需要看,不懂的人看了还是不懂。

这种看了,又好像没看的感觉,云里雾里的很难受,我懂

为了避免大家有强烈的审丑疲劳,今天我们来尝试重新换个方式讲一讲。

从TCP聊起

作为一个程序员,假设我们需要在A电脑的进程发一段数据到B电脑的进程,我们一般会在代码里使用socket进行编程

这时候,我们可选项一般也就TCP和UDP二选一。TCP可靠,UDP不可靠。除非是马总这种神级程序员(早期QQ大量使用UDP),否则,只要稍微对可靠性有些要求,普通人一般无脑选TCP就对了。

类似下面这样。

fd=socket(AF_INET,SOCK_STREAM,0);

其中SOCK_STREAM,是指使用字节流传输数据,说白了就是TCP协议

在定义了socket之后,我们就可以愉快的对这个socket进行操作,比如用bind()绑定IP端口,用connect()发起建连。

9d8ecdd0-50fa-11ed-a3b6-dac502259ad0.gif

握手建立连接流程

在连接建立之后,我们就可以使用send()发送数据,recv()接收数据。

光这样一个纯裸的TCP连接,就可以做到收发数据了,那是不是就够了?

不行,这么用会有问题。

使用纯裸TCP会有什么问题

八股文常背,TCP是有三个特点,面向连接可靠、基于字节流

9ec106d2-50fa-11ed-a3b6-dac502259ad0.png

TCP是什么

这三个特点真的概括的非常精辟,这个八股文我们没白背。

每个特点展开都能聊一篇文章,而今天我们需要关注的是基于字节流这一点。

字节流可以理解为一个双向的通道里流淌的数据,这个数据其实就是我们常说的二进制数据,简单来说就是一大堆 01 串。纯裸TCP收发的这些 01 串之间是没有任何边界的,你根本不知道到哪个地方才算一条完整消息。

9eea4376-50fa-11ed-a3b6-dac502259ad0.png

01二进制字节流

正因为这个没有任何边界的特点,所以当我们选择使用TCP发送"夏洛"和"特烦恼"的时候,接收端收到的就是"夏洛特烦恼",这时候接收端没发区分你是想要表达"夏洛"+"特烦恼"还是"夏洛特"+"烦恼"

9f20aa60-50fa-11ed-a3b6-dac502259ad0.png

消息对比

这就是所谓的粘包问题,之前也写过一篇专门的文章聊过这个问题。

说这个的目的是为了告诉大家,纯裸TCP是不能直接拿来用的,你需要在这个基础上加入一些自定义的规则,用于区分消息边界

于是我们会把每条要发送的数据都包装一下,比如加入消息头消息头里写清楚一个完整的包长度是多少,根据这个长度可以继续接收数据,截取出来后它们就是我们真正要传输的消息体

9f2a37f6-50fa-11ed-a3b6-dac502259ad0.png

消息边界长度标志

而这里头提到的消息头,还可以放各种东西,比如消息体是否被压缩过和消息体格式之类的,只要上下游都约定好了,互相都认就可以了,这就是所谓的协议。

每个使用TCP的项目都可能会定义一套类似这样的协议解析标准,他们可能有区别,但原理都类似

于是基于TCP,就衍生了非常多的协议,比如HTTP和RPC。

HTTP和RPC

我们回过头来看网络的分层图。

9f441aea-50fa-11ed-a3b6-dac502259ad0.png

四层网络协议

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

HTTP协议(Hyper Text Transfer Protocol),又叫做超文本传输协议。我们用的比较多,平时上网在浏览器上敲个网址就能访问网页,这里用到的就是HTTP协议。

9f7378ee-50fa-11ed-a3b6-dac502259ad0.png

HTTP调用

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

举个例子,我们平时调用一个本地方法就像下面这样。

res=localFunc(req)

如果现在这不是个本地方法,而是个远端服务器暴露出来的一个方法remoteFunc,如果我们还能像调用本地方法那样去调用它,这样就可以屏蔽掉一些网络细节,用起来更方便,岂不美哉?

res=remoteFunc(req)
9f9759b2-50fa-11ed-a3b6-dac502259ad0.png

RPC可以像调用本地方法那样调用远端方法

基于这个思路,大佬们造出了非常多款式的RPC协议,比如比较有名的gRPC,thrift。

值得注意的是,虽然大部分RPC协议底层使用TCP,但实际上它们不一定非得使用TCP,改用UDP或者HTTP,其实也可以做到类似的功能。

基于TCP协议的HTTP和RPC协议

到这里,我们回到文章标题的问题。

既然有HTTP协议,为什么还要有RPC?

其实,TCP是70年代出来的协议,而HTTP是90年代才开始流行的。而直接使用裸TCP会有问题,可想而知,这中间这么多年有多少自定义的协议,而这里面就有80年代出来的RPC。

所以我们该问的不是既然有HTTP协议为什么要有RPC,而是为什么有RPC还要有HTTP协议

那么,既然有RPC了,为什么还要有HTTP呢?

现在电脑上装的各种联网软件,比如xx管家,xx卫士,它们都作为客户端(client)需要跟服务端(server)建立连接收发消息,此时都会用到应用层协议,在这种client/server (c/s)架构下,它们可以使用自家造的RPC协议,因为它只管连自己公司的服务器就ok了。

但有个软件不同,浏览器(browser),不管是chrome还是IE,它们不仅要能访问自家公司的服务器(server),还需要访问其他公司的网站服务器,因此它们需要有个统一的标准,不然大家没法交流。于是,HTTP就是那个时代用于统一 browser/server (b/s) 的协议。

也就是说在多年以前,HTTP主要用于b/s架构,而RPC更多用于c/s架构。但现在其实已经没分那么清了,b/s和c/s在慢慢融合。很多软件同时支持多端,比如某度云盘,既要支持网页版,还要支持手机端和pc端,如果通信协议都用HTTP的话,那服务器只用同一套就够了。而RPC就开始退居幕后,一般用于公司内部集群里,各个微服务之间的通讯。

那这么说的话,都用HTTP得了,还用什么RPC?

仿佛又回到了文章开头的样子,那这就要从它们之间的区别开始说起。

HTTP和RPC有什么区别

我们来看看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协议一般还会再建个连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用,可以说非常环保。

a0224216-50fa-11ed-a3b6-dac502259ad0.png

connection_pool

由于连接池有利于提升网络请求性能,所以不少编程语言的网络库里都会给HTTP加个连接池,比如go就是这么干的。

可以看出这一块两者也没太大区别,所以也不是关键。

传输的内容

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

header是用于标记一些特殊信息,其中最重要的是消息体长度

body则是放我们真正需要传输的内容,而这些内容只能是二进制01串,毕竟计算机只认识这玩意。所以TCP传字符串和数字都问题不大,因为字符串可以转成编码再变成01串,而数字本身也能直接转为二进制。但结构体呢,我们得想个办法将它也转为二进制01串,这样的方案现在也有很多现成的,比如json,protobuf。

这个将结构体转为二进制数组的过程就叫序列化,反过来将二进制数组复原成结构体的过程叫反序列化

a0308ea2-50fa-11ed-a3b6-dac502259ad0.png

序列化和反序列化

对于主流的HTTP1.1,虽然它现在叫超文本协议,支持音频视频,但HTTP设计初是用于做网页文本展示的,所以它传的内容以字符串为主。header和body都是如此。在body这块,它使用json序列化结构体数据。

我们可以随便截个图直观看下。

a0a6722a-50fa-11ed-a3b6-dac502259ad0.png

HTTP报文

可以看到这里面的内容非常多的冗余,显得非常啰嗦。最明显的,像header里的那些信息,其实如果我们约定好头部的第几位是content-type,就不需要每次都真的把"content-type"这个字段都传过来,类似的情况其实在body的json结构里也特别明显。

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

a0fd1166-50fa-11ed-a3b6-dac502259ad0.png

HTTP原理

a1241022-50fa-11ed-a3b6-dac502259ad0.png

RPC原理

当然上面说的HTTP,其实特指的是现在主流使用的HTTP1.1,HTTP2在前者的基础上做了很多改进,所以性能可能比很多RPC协议还要好,甚至连gRPC底层都直接用的HTTP2。

那么问题又来了:

既然有了HTTP2,为什么还要有RPC协议?

这个是由于HTTP2是2015年出来的。那时候很多公司内部的RPC协议都已经跑了好些年了,基于历史原因,一般也没必要去换了。

总结

纯裸TCP是能收发数据,但它是个无边界的数据流,上层需要定义消息格式用于定义消息边界。于是就有了各种协议,HTTP和各类RPC协议就是在TCP之上定义的应用层协议。

RPC本质上不算是协议,而是一种调用方式,而像gRPC和thrift这样的具体实现,才是协议,它们是实现了RPC调用的协议。目的是希望程序员能像调用本地方法那样去调用远端的服务方法。同时RPC有很多种实现方式,不一定非得基于TCP协议

从发展历史来说,HTTP主要用于b/s架构,而RPC更多用于c/s架构。但现在其实已经没分那么清了,b/s和c/s在慢慢融合。很多软件同时支持多端,所以对外一般用HTTP协议,而内部集群的微服务之间则采用RPC协议进行通讯。

RPC其实比HTTP出现的要早,且比目前主流的HTTP1.1性能要更好,所以大部分公司内部都还在使用RPC。

HTTP2.0HTTP1.1的基础上做了优化,性能可能比很多RPC协议都要好,但由于是这几年才出来的,所以也不太可能取代掉RPC。

最后留个问题,大家有没有发现,不管是HTTP还是RPC,它们都有个特点,那就是消息都是客户端请求,服务端响应。客户端没问,服务端肯定就不答,这就有点僵了,但现实中肯定有需要下游主动发送消息给上游的场景,比如打个网页游戏,站在那啥也不操作,怪也会主动攻击我,这种情况该怎么办呢?





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • UDP
    UDP
    +关注

    关注

    0

    文章

    325

    浏览量

    33930
  • RPC
    RPC
    +关注

    关注

    0

    文章

    111

    浏览量

    11528
  • HTTP协议
    +关注

    关注

    0

    文章

    61

    浏览量

    9718

原文标题:既然有HTTP协议,为什么还要用RPC?

文章出处:【微信号:gh_c472c2199c88,微信公众号:嵌入式微处理器】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    dap协议与传统协议的区别 dap协议的工作原理详解

    。 DAP协议与传统协议的区别 去中心化 vs 中心化 传统协议 :大多数传统协议依赖于中心化的服务器或服务提供商,例如HTTP
    的头像 发表于 11-22 15:40 234次阅读

    socket 与 HTTP 协议的关系

    在计算机网络中,Socket和HTTP协议是两个非常重要的概念,它们在数据传输和网络通信中扮演着关键的角色。 1. Socket的概念 Socket是一种通信机制,它允许两个程序(一个客户端和一个
    的头像 发表于 11-12 14:12 188次阅读

    socket与HTTP协议的比较

    (套接字)是一种通信机制,它允许两个应用程序通过网络进行双向通信。在TCP/IP模型中,Socket位于传输层和应用层之间,提供了一种抽象的接口,使得应用程序可以忽略底层网络的细节,专注于数据的发送和接收。 1.2 HTTP协议 HTT
    的头像 发表于 11-01 16:14 230次阅读

    低功耗4G模组HTTP网络协议应用

    ​大家好,今天我们来学习合宙Air780E模组LuatOS开发4G通信中HTTP网络协议的应用,实现模组和服务器之间数据的传输。 一、HTTP概述 1.1 简介 HTTP
    的头像 发表于 11-01 07:23 182次阅读
    低功耗4G模组<b class='flag-5'>HTTP</b>网络<b class='flag-5'>协议</b>应用

    4G 模组 HTTP 网络协议应用 白嫖版!

    今天我们来白嫖的是Air780E模组LuatOS开发4G通信中HTTP网络协议的应用,实现模组和服务器之间数据的传输,详细介绍硬件环境、软件环境、功能验证等…
    的头像 发表于 10-30 14:22 764次阅读
    4G 模组 <b class='flag-5'>HTTP</b> 网络<b class='flag-5'>协议</b>应用 白嫖版!

    HTTP协议下的海外网络畅游:安全与效率的双重保障

    在全球化日益加深的今天,HTTP协议作为互联网上最为广泛使用的通信协议之一,为海外网络畅游提供了重要的技术支持。在HTTP协议下,海外网络畅
    的头像 发表于 09-24 08:08 184次阅读

    Dubbo源码浅析(一)—RPC框架与Dubbo

    时,就像调用本地过程一样方便。 1.2 RPCHttp的关系 用一句话来总结就是: RPC是一种概念,http是一种协议,可以认
    的头像 发表于 08-16 15:18 717次阅读
    Dubbo源码浅析(一)—<b class='flag-5'>RPC</b>框架与Dubbo

    鉴源实验室·HTTP协议网络安全攻击

    互联网的迅猛发展,HTTP(HyperText Transfer Protocol,超文本传输协议)已经成为网页传输的基础协议。它在客户端(如浏览器)和服务器之间传递信息,使得我们能够浏览网页、提交表单
    的头像 发表于 07-30 13:48 307次阅读
    鉴源实验室·<b class='flag-5'>HTTP</b><b class='flag-5'>协议</b>网络安全攻击

    TSMaster RPC 基础入门:编程指导和使用说明

    介绍RPC模块前,我们先浅聊一下RPC的相关说明,以及在什么样的情况下需要了解本文。1.RPC说明远程过程调用(RPC,RemoteProcedureCall)是一种网络通信
    的头像 发表于 07-13 08:21 833次阅读
    TSMaster <b class='flag-5'>RPC</b> 基础入门:编程指导和使用说明

    你了解清楚了嘛-TCP、HTTP、MQTT协议

    TCP、HTTP 和 MQTT 是三种不同层级和用途的协议是进行设备互联和传送数据的重要组成部分;TCP适用高可靠性传送,HTTP适用Web服务与API打开,MQTT是物联网设备通讯的不二之选。了解它们的特点和适用场景有助于在设
    的头像 发表于 07-11 11:34 2784次阅读
    你了解清楚了嘛-TCP、<b class='flag-5'>HTTP</b>、MQTT<b class='flag-5'>协议</b>

    IOT(物联网)的七大通信协议Http协议

    一、什么是http协议?嵌入式HTTP协议是一种轻量级的通信协议,专为嵌入式系统设计,用于实现设备与互联网之间的通信。
    的头像 发表于 05-24 08:11 2504次阅读
    IOT(物联网)的七大通信<b class='flag-5'>协议</b>之<b class='flag-5'>Http</b><b class='flag-5'>协议</b>

    PLC设备通过智能网关采用HTTP协议JSON文件对接MES、ERP等系统平台

    智能网关IGT-DSER集成了多种PLC的原厂协议,方便实现各种PLC、智能仪表通过HTTP协议与MES等各种系统平台通讯对接。PLC内不用编写程序,设备不用停机,通过网关的参数配置软件(下载地址
    发表于 05-13 12:04

    mqtt协议http协议区别

    的最大优点在于,用极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。 HTTP协议(HyperText Transfer Protocol)是因特网上应用最为广泛的一种网络传输协议,所有
    的头像 发表于 01-19 15:56 6904次阅读

    modbus协议与485协议区别

    进行详细探讨。 一、协议层面 Modbus协议:Modbus协议是一种开放的通信协议,它定义了一套从机和主机之间进行通信的规范。Modbus协议
    的头像 发表于 01-11 11:06 2.1w次阅读