RPC是什么?和HTTP区别?

RPC 是什么?HTTP 是什么?

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

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

Socket 本质是个代码库,我们需要先创建类似于:
在这里插入图片描述
其中 SOCK_STREAM是指使用字节流传输数据。说白了就是 TCP 协议。
在这里插入图片描述
在定义了 socket 之后,我们就可以对这个 socket 进行操作。比如使用 bind() 方法绑定 IP 端口;用 connect() 方法发起建联,里面就包含了常见的 TCP 三次握手流程;在建立连接之后就可以使用 send() 方法发送数据;receive() 方法接收数据。
在这里插入图片描述
光这个“纯裸”的 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 协议,但也可以改用 UPD 或者 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。
可以看出这块二者也没有太大区别。

最后是传输的内容

传输内容是基于 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有什么区别?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/958279.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

08.七种排序算法实现(C语言)

目录 一.排序的基本概念 1.1 排序的概念 1.2 常见的排序算法 二.常见排序算法的实现 2.1 插入排序(直接) 1.基本思想 2.直接插入排序的特性 3.代码实现 2.2 希尔排序 1.基本思想 2.希尔插入排序的特性 3.代码实现 2.3 选择排序 1.基本思想 2…

Jmeter使用Request URL请求接口

简介 在Jmeter调试接口时,有时不清楚后端服务接口的具体路径,可以使用Request URL和cookie来实现接口请求。以下内容以使用cookie鉴权的接口举例。 步骤 ① 登录网站后获取具体的Request URL和cookie信息 通过浏览器获取到Request URL和cookie&#…

Apache Tomcat文件包含漏洞复现(详细教程)

1.漏洞原理 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,其安装后会默认开启ajp连接器,方便与其他web服务器通过ajp协议进行交互。属于轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发…

fpga学习入门 串口rs232回环

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

KETTLE-SAP抽数报错RFC_ERROR_SYSTEM_FAILURE

KETTLE调SAP 合并ECCS相关的函数时报错 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-342 from 2018-11-14 10.30.55 by buildguy) : Unexpected error 2025/01/23 17:56:02 - SAP input.0 - ERROR (version 8.2.0.0-342, build 8.2.0.0-3…

HTTP 配置与应用(局域网)

想做一个自己学习的有关的csdn账号,努力奋斗......会更新我计算机网络实验课程的所有内容,还有其他的学习知识^_^,为自己巩固一下所学知识,下次更新HTTP 配置与应用(不同网段)。 我是一个萌新小白&#xf…

C++AVL树(一)详解

文章目录 AVL树概念AVL树的插入平衡因子的更新旋转的规则左单旋右单旋抽象的情况h0h1h 2h 3 AVL树 概念 AVL树是一棵平衡二叉查找树,AVL树是空树,保证左右子树都是AVL树,AVL树要求高度差的绝对值不超过1,因为最好情况是1&#…

MCP Server 开发实战:无缝对接 LLM 和 Elasticsearch

在一文带你入门 MCP(模型上下文协议)文章中,我们快速介绍了 MCP 的基本概念,并且通过一个示例让读者初步感受到了 MCP 的强大能力。本文将进一步深入,带领读者一步步学习如何开发一个完整的 MCP Server。本文的完整代码…

Kubernetes v1.28.0安装dashboard v2.6.1(k8s图形化操作界面)

准备工作 Kubernetes v1.28.0搭建教程请参考:Kubernetes v1.28.0集群快速搭建教程-CSDN博客 查看当前集群nodes都是ready状态 查看当前pods都是running状态 下载并修改配置文件 下载 recommended.yaml ,下载好之后,进入文件编辑 下载地址…

设计模式的艺术-职责链模式

行为型模式的名称、定义、学习难度和使用频率如下表所示: 1.如何理解职责链模式 最常见的职责链是直线型,即沿着一条单向的链来传递请求。链上的每一个对象都是请求处理者,职责链模式可以将请求的处理者组织成一条链,并让请求沿着…

通过脚本申请免费SSL证书(泛解析SSL证书)

参考来源 1.https://github.com/acmesh-official/acme.sh/wiki/%E8%AF%B4%E6%98%8E 2.https://github.com/acmesh-official/acme.sh/wiki/dns-manual-mode 3.https://github.com/acmesh-official/acme.sh/wiki/dnsapi 安装 acme.sh 配置账号 配置默认CA 安装依赖 # Cento…

CrypTen项目实践

CrypTen是一个用于安全多方计算(MPC)的python库,基于PyTorch构建。 CrypTen facebookresearch/CrypTen: A framework for Privacy Preserving Machine Learning 目录 一、实践准备 二、实践操作 1.下载WSL 2.下载代码 3.创建虚拟环境&…

【CS61A 2024秋】Python入门课,全过程记录P3(Week5 Sequences开始,更新于2025/1/23)

文章目录 关于基本介绍👋新的问题Week5Mon Sequences阅读材料 关于 个人博客,里面偶尔更新,最近比较忙。发一些总结的帖子和思考。 江湖有缘相见🤝。如果读者想和我交个朋友可以加我好友(见主页or个人博客&#xff0…

Jenkins-基于Role的鉴权机制

jenkins自带了一些全局性的安全配置。 但无法通过job等相对细粒度的来控制使用者的权限。但它可以借助相关的插件实现细颗粒的权限控制。 插件: Role-based Authorization Strategy 需要在configure global security中配置授权策略如下: 保存后&#x…

SSM开发(一)JAVA,javaEE,spring,springmvc,springboot,SSM,SSH等几个概念区别

目录 JAVA 框架 javaEE spring springmvc springboot SSM SSH maven JAVA 一种面向对象、高级编程语言,Python也是高级编程语言;不是框架(框架:一般用于大型复杂需求项目,用于快速开发)具有三大特性,所谓Jav…

Linux——入门基本指令汇总

目录 1. ls指令2. pwd3. whoami指令4. cd指令5. clear指令6. touch指令7. mkdir指令8. rm指令9. man指令10. cp指令11. mv指令12. cat指令13. tac指令14. more指令15. less指令16. head指令17. tail指令18. date指令19. cal指令20. find指令21. which指令22. alias指令23. grep…

基于SpringBoot+Vue的旅游管理系统【源码+文档+部署讲解】

系统介绍 基于SpringBootVue实现的旅游管理系统采用前后端分离架构方式,系统设计了管理员、用户两种角色,系统实现了用户登录与注册、个人中心、用户管理、景点信息管理、订票信息管理、用户评价管理、景点咨询、轮播图管理等功能。 技术选型 开发工具…

光学遥感显著性目标检测2023-2024论文学习

GRSL 2023: Attention-Aware Three-Branch Network for Salient Object Detection in Remote Sensing Images 基于encoder-decoder框架,提出了一系列缝合模块,GCA,FDUC,MSDC,RA。 GRSL 2023:OR…

接口 V2 完善:基于责任链模式、Canal 监听 Binlog 实现数据库、缓存的库存最终一致性

🎯 本文介绍了一种使用Canal监听MySQL Binlog实现数据库与缓存最终一致性的方案。文章首先讲解了如何修改Canal配置以适应订单表和时间段表的变化,然后详细描述了通过责任链模式优化消息处理逻辑的方法,确保能够灵活应对不同数据表的更新需求…

graylog~认识一下-日志管理平台

1、介绍 Graylog 是一个开源的日志管理和分析平台,旨在帮助企业集中收集、存储、搜索和分析来自各种来源的日志数据。它提供了强大的实时日志处理能力,适用于大规模分布式系统和复杂的生产环境。 主要功能 集中化日志管理: 收集来自不同来源…