当前位置: 首页 > news >正文

RPC是什么?和HTTP区别?

RPC 是什么?HTTP 是什么?

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

在这里插入图片描述

此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不可靠,只要对可靠性有要求,一般就选 TCP 了。

Socket 本质是个代码库,我们需要先创建类似于:

在这里插入图片描述

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

在这里插入图片描述

在定义了 socket 之后,我们就可以对这个 socket 进行操作。
比如使用 bind() 方法绑定 IP 端口;
connect() 方法发起建联,里面就包含了常见的 TCP 三次握手流程;
在建立连接之后就可以使用 send() 方法发送数据;
accept() 方法接收数据。

在这里插入图片描述

光这个“纯裸”的 TCP 连接就可以收发数据了,那是不是就够了?

不行。

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

在这里插入图片描述

在这里插入图片描述

这里关注“基于字节流”,字节流可以理解为双向通道里流淌的二进制数据,就是一堆“01”串。“纯裸”的 TCP 连接收发的这些“01”串是没有任何边界的,你无法知道一条完整消息的起始位置。

在这里插入图片描述

由于无边界,所以当选择使用 TCP 发送“夏洛特烦恼”时,接收端无法区分你想表达的是“夏洛” 和“特烦恼”还是“夏洛特”和“烦恼”。这也就是所谓的“粘包”问题。

在这里插入图片描述

既然“纯裸” TCP 是不能直接拿来用的,那就需要在这个基础上加入一些自定义规则,来区分 消息边界。

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

这里的消息头中还可以放各种规则,比如消息体是否压缩、消息体格式之类的。只要上下游都约定好,互相能够解析就行了,这就是所谓的协议了。

在这里插入图片描述

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

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

TCP 是传输层的协议,而基于 TCP 造出来的各类协议,都是定义了不同规则的应用层协议。

在这里插入图片描述

HTTP 协议又叫做“超文本传输协议”,我们平时上网在浏览器中敲个网址就能访问网页,用到的就是 HTTP 协议。

在这里插入图片描述

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

RPC 让我们可以像调用本地方法一样,调用远端服务器的方法(remoteFunc),屏蔽掉一些网络细节。

在这里插入图片描述

基于这个思路,大佬们造成了非常多款式的 RPC 协议,如 gRPC、tRPC 等。

虽然大部分 RPC 协议底层使用的是 TCP 协议,但也可以改用 UDP 或者 HTTP。

为什么有 HTTP 还要有 RPC?

其实,TCP 是 70 年代的产物,HTTP 是 90 年代的产物,由于直接使用 TCP 会出现粘包问题,所以可想而知,70~90 年代之间会有很多协议产生,其中包含 80 年代产出的 RPC 协议

在这里插入图片描述

因此我们该问的不是“为什么有 HTTP 了,还要有 RPC?”,而是“为什么有 RPC 了,还要有 HTTP?”。

为什么有 RPC 还要有 HTTP 协议?

现在电脑上安装的各种软件,如xx管家、xx视频,它们作为客户端,需要与服务端建立连接,收发消息,都会用到应用层协议。在这种 C/S(client server)架构下,他们就能使用自家创造的 RPC 协议,因为只需要连接自己公司的服务器。

但是xx浏览器却不同,不管是 Chrome 还是 IE,它们不仅需要连接自家服务器,还需要访问其他公司的网站服务器,因此需要一个统一的标准。于是 HTTP 就是当时用来统一 browser server 的协议。

当时 HTTP 主要用于 B/S 架构,而 RPC 主要用于 C/S 架构,但是现在没有分那么清楚了,B/S 和 C/S 在慢慢融合。

很多软件需要支持多端,如网页端、PC端、移动端,如果通信协议都用 HTTP,那么服务器只用一套就够了,而 RPC 开始退居幕后,一般用于公司内部集群里各个微服务之间的通讯。

那么,既然有了 HTTP,为啥还要使用 RPC 呢?

为什么有了 HTTP, 还要用 RPC?

这个问题需要从二者的区别说起:

首先是服务发现

服务建立连接的前提是需要知道对方的 IP 地址和端口号,寻找对方 IP 端口的过程叫做 服务发现。

在 HTTP 中,知道了服务域名,就可以通过 DNS 服务器解析 IP 地址,端口默认是 80 。

而 RPC 需要专门的中间服务来保存服务名的 IP 信息,比如 etcd (甚至是 Redis)。

可以看出服务发现方面,二者虽有区别,但不分高低。

在这里插入图片描述

其次是底层连接形式

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

在这里插入图片描述

而 RPC 协议也和 HTTP 协议类似,也是通过建立 TCP 长连接进行数据交互。但不同的地方在于,RPC 一般还会再建立一个连接池,在请求量大的时候,建立多条连接放在连接池中,需要发数据的时候就从池中取出一条连接,用完再放回去。

在这里插入图片描述

由于连接池有利于提升网络性能,所以有些编程语言的网络库中也会给 HTTP 加个连接池,比如 Go。

可以看出这块二者也没有太大区别。

最后是传输的内容

HTTP 和 RPC 传输内容都是基于 TCP 传输的消息,包含消息头 header 和 消息体 body,header 适合标记一些特殊信息,其中最重要的信息就是消息体的长度;body 则是放真正需要传输的内容,而这些内容只能是二进制数据。

在这里插入图片描述

所以 TCP 传输字符串和数字的问题不大,因为字符串可以编码,再变成二进制,而数字本身可以直接转为二进制。

但是结构体呢?

需要想办法转为二进制,现在的方案主要有 json、protoBuf 等。将这个结构体转为二进制的过程叫做序列化。

在这里插入图片描述

在这里插入图片描述

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

而 RPC 因为定制化程度更高,可以采用体积更小的 protobuf 文件或其他序列化协议,来保存结构体,同时不需要像 HTTP 那样考虑各种浏览器行为,如 302 定向跳转,因此性能会更好。这也是公司内部抛弃 HTTP 而选择 RPC 的主要原因。

在这里插入图片描述

当然,上面说的 HTTP 其实特指主流的 HTTP1.1。

HTTP2 在前者的基础上做了很多改进,性能可能比 RPC 还好,甚至连 gRPC 底层都是用的 HTTP2,那么问题又来了,“为什么既然有了 HTTP2,还要使用 RPC?”

因为 HTTP2 是 2015 年才出来的,那时候很多公司内部的 RPC 服务都运行很多年了,基于历史原因,也就没必要换了。

参考:
RPC是什么?HTTP是什么?RPC和HTTP有什么区别?

备注:
在 HTTP/1.1 和 RPC(远程过程调用)中,消息头(header)和消息体(body)都是以二进制数据的形式在 TCP 连接上进行传输的。然而,它们的具体格式和编码方式有所不同。

  1. HTTP/1.1:

    • 消息头:HTTP 消息头是以文本格式编码的,通常是 ASCII 字符。每个头部字段由字段名和字段值组成,字段之间用冒号分隔。头部的结束是通过一个空行(即两个连续的换行符)来标识的。
    • 消息体:HTTP 消息体可以是任意类型的二进制数据(如图像、视频、JSON、XML 等),其内容的类型通常通过 Content-Type 头部字段来指明。消息体的长度可以通过 Content-Length 头部字段来指示,或者使用 Transfer-Encoding: chunked 进行分块传输。
  2. RPC:

    • RPC 的实现可以有多种形式(如 gRPC、XML-RPC、JSON-RPC 等),每种实现的消息格式可能不同。一般来说,RPC 的消息头和消息体也可以是二进制数据。
    • 在一些 RPC 实现中,消息头可能包含一些元数据(如方法名、请求 ID、版本信息等),而消息体则包含实际的参数或返回值。具体的编码方式(如 Protocol Buffers、Thrift 等)会影响消息的二进制表示。

总结来说,虽然 HTTP/1.1 的消息头是以文本格式传输的,但在底层 TCP 连接上,它们都是以二进制形式发送的。
而 RPC 的消息头和消息体通常都是以二进制格式传输的,具体取决于所使用的协议和编码方式。

相关文章:

RPC是什么?和HTTP区别?

RPC 是什么?HTTP 是什么? 作为一个程序员,假设我们需要从A电脑的进程发送一段数据到B电脑的进程,我们一般会在代码中使用 Socket 进行编程。 此时,可选性一般就是 TCP 和 UDP 二选一,由于 TCP 可靠、UDP 不…...

Linux C\C++编程-建立文件和内存映射

【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…...

行政纠错——pycorrector学习

pycorrector是一个开源中文文本纠错工具,它支持对中文文本进行音似、形似和语法错误的纠正。此工具是使用Python3进行开发的,并整合了Kenlm、ConvSeq2Seq、BERT、MacBERT、ELECTRA、ERNIE、Transformer等多种模型来实现文本纠错功能。pycorrector官方仓库…...

Go的defer原理

Go 的 defer 原理 defer 是 Go 语言中的一个关键字,用于延迟执行一个函数调用。它通常用于处理资源释放、连接关闭等操作,确保这些操作在函数返回之前执行。 1. 什么是 defer? defer 关键字用于延迟执行一个函数调用,直到包含它…...

Windows 下本地 Docker RAGFlow 部署指南

Windows 下本地 Docker RAGFlow 部署指南 环境要求部署步骤1. 克隆代码仓库2. 配置 Docker 镜像加速(可选)3. 修改端口配置(可选)4. 启动服务5. 验证服务状态6. 访问服务7. 登录系统8. 配置模型8.1 使用 Ollama 本地模型8.2 使用在线 API 服务9. 开始使用10. 常见问题处理端…...

专题三_穷举vs暴搜vs深搜vs回溯vs剪枝_全排列

dfs解决 全排列&子集 1.全排列 link:46. 全排列 - 力扣&#xff08;LeetCode&#xff09; 全局变量回溯 code class Solution { public:vector<vector<int>> ans;vector<int> cur;vector<bool> used;vector<vector<int>> permute…...

【IEEE Fellow 主讲报告| EI检索稳定】第五届机器学习与智能系统工程国际学术会议(MLISE 2025)

重要信息 会议时间地点&#xff1a;2025年6月13-15日 中国深圳 会议官网&#xff1a;http://mlise.org EI Compendex/Scopus稳定检索 会议简介 第五届机器学习与智能系统工程国际学术会议将于6月13-15日在中国深圳隆重召开。本次会议旨在搭建一个顶尖的学术交流平台&#xf…...

华为E9000刀箱服务器监控指标解读

美信监控易内置了数千种常见设备监测器&#xff0c;能够监测超过20万项指标。这些指标涵盖了从硬件设备到软件系统&#xff0c;从网络性能到安全状态等各个方面。如下基于美信监控易——IT基础监控模块&#xff0c;对华为E9000刀箱服务器部分监控指标进行解读。 一、华为E9000…...

【LC】2544. 交替数字和

题目描述&#xff1a; 给你一个正整数 n 。n 中的每一位数字都会按下述规则分配一个符号&#xff1a; 最高有效位 上的数字分配到 正 号。剩余每位上数字的符号都与其相邻数字相反。 返回所有数字及其对应符号的和。 示例 1&#xff1a; 输入&#xff1a;n 521 输出&…...

QT QTreeWidget控件 全面详解

本系列文章全面的介绍了QT中的57种控件的使用方法以及示例,包括 Button(PushButton、toolButton、radioButton、checkBox、commandLinkButton、buttonBox)、Layouts(verticalLayout、horizontalLayout、gridLayout、formLayout)、Spacers(verticalSpacer、horizontalSpacer)、…...

欧几里得算法求最小公倍数和最大公约数

一.最大公约数 gcd(a,b)gcd(b,a%b) 递归式,当且仅当b0&#xff0c;易得0和a的公约数为a.(可作为递归的出口) 证明&#xff1a; int gcd(int a, int b) {if (b 0) return a;else return gcd(b, a % b); } 二.最小公倍数 给定整数a b&#xff0c;求a b的最小公倍数 有图可知…...

Selenium配合Cookies实现网页免登录

文章目录 前言1 方案一&#xff1a;使用Chrome用户数据目录2 方案二&#xff1a;手动获取并保存Cookies&#xff0c;后续使用保存的Cookies3 注意事项 前言 在进行使用Selenium进行爬虫、网页自动化操作时&#xff0c;登录往往是一个必须解决的问题&#xff0c;但是Selenium每次…...

DeepSeek R1模型解读与使用

字节在春节前发布了doubao-1.5&#xff0c;它的官方介绍竟然是这样的&#xff1a; 这次发布了四个型号&#xff0c;doubao-1.5-pro-32k, doubao-1.5-pro-256k, doubao-1.5-lite-32k, doubao-1.5-vision-pro-32k&#xff0c;价格全部与上一个版本doubao模型一致&#xff0c;加量…...

Windows电脑不小心点击了关机,关机过程中如何阻止

如果电脑正在关机的过程中&#xff0c;想要阻止关机&#xff0c;可以尝试以下方法&#xff1a; 如果关机过程较慢&#xff0c;可以按下键盘组合键 Win R 打开运行窗口。输入 shutdown -a 后按回车键&#xff0c;这将中断关机操作&#xff08;适用于 Windows 系统&#xff09;…...

CNN-GRU卷积门控循环单元时间序列预测(Matlab完整源码和数据)

CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09; 目录 CNN-GRU卷积门控循环单元时间序列预测&#xff08;Matlab完整源码和数据&#xff09;预测效果基本介绍CNN-GRU卷积门控循环单元时间序列预测一、引言1.1、研究背景与意义1.2、研究现状1…...

【吉林乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移内容测评

标题中的“吉林省乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84无偏移”揭示了这是一个地理信息系统&#xff08;GIS&#xff09;相关的数据集&#xff0c;主要用于描绘吉林省的乡镇边界。这个数据集包含了一系列的文件&#xff0c;它们是ArcGIS软件能够识别和处理的Shape…...

fpga学习入门 串口rs232回环

奇偶检验位这里是省略了 做好回环后可以使用上位机做回环测试&#xff0c;top文件写的方式就是将rx&#xff08;fpga端&#xff09;接受到的模块&#xff08;pc端&#xff09;tx发送出去&#xff0c;这两个端口用杜邦线连接&#xff0c;同理模块的rx连接fpga的tx&#xff0c;…...

智启未来,AI筑梦科技新星”------华清远见成都中心2025冬令营圆满结束

2025年1月11日-16日&#xff0c;华清远见成都中心为期6天的“智启未来&#xff0c;AI筑梦科技新星”2025冬令营活动圆满结束。此次活动吸引了众多对人工智能和无人驾驶技术充满热情的学生参与&#xff0c;共同开启了一段点燃科技梦想的精彩旅程。 报道接待 以AI无人驾驶小车为核…...

接上篇基于Alertmanager 配置钉钉告警

Alertmanager 是一个用于处理和管理 Prometheus 警报的开源工具。它负责接收来自 Prometheus 服务器的警报&#xff0c;进行去重、分组、静默、抑制等操作&#xff0c;并通过电子邮件、PagerDuty、Slack 等多种渠道发送通知。 主要功能 去重&#xff1a;合并相同或相似的警报&a…...

DDD - 如何设计支持快速交付的DDD技术中台

文章目录 Pre概述打造快速交付团队烟囱式的开发团队(BAD)大前端技术中台(GOOD) 技术中台的特征简单易用的技术中台建设总结 Pre DDD - 软件退化原因及案例分析 DDD - 如何运用 DDD 进行软件设计 DDD - 如何运用 DDD 进行数据库设计 DDD - 服务、实体与值对象的两种设计思路…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

C# 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言&#xff1a; 在Java编程中&#xff0c;类的生命周期是指类从被加载到内存中开始&#xff0c;到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期&#xff0c;让读者对此有深刻印象。 目录 ​…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...