【RPC、WebSocket】

news2024/11/18 21:36:16

文章目录

    • 有HTTP协议为什么还要RPC
      • TCP
      • HTTP 和 RPC
      • HTTP 和 RPC 有什么区别
    • 有HTTP协议为什么还要WebSocket
      • 使用HTTP不断轮询
      • 长轮询
      • WebSocket
        • 怎么建立WebSocket连接

有HTTP协议为什么还要RPC

TCP

  • TCP三个特点:面向连接、可靠、基于字节流。

基于字节流

  • 字节流可以理解为一个双向的通道里流淌的数据,这个数据是二进制数据,简单来说就是一大堆 01 串。纯裸 TCP 收发的这些 01 串之间是没有任何边界的,会导致粘包问题。因此纯裸的TCP是不能直接拿来用的,你需要在这个基础上加入一些自定义的规则,用于区分消息边界。
    在这里插入图片描述

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

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

  • 于是基于 TCP,就衍生了非常多的协议,比如 HTTP 和 RPC。
    在这里插入图片描述

HTTP 和 RPC

  • TCP 是传输层的协议,而基于 TCP 造出来的
  • HTTP 协议(Hyper Text Transfer Protocol),又叫做超文本传输协议 HTTP 和各类 RPC 协议,它们都只是定义了不同消息格式的应用层协议而已。
  • RPC(Remote Procedure Call),又叫做远程过程调用。它本身并不是一个具体的协议,而是一种调用方式。

本地方法调用

res = localFunc(req)

该方法在远端服务器上暴露的一个方法,如果我们还能像调用本地方法那样去调用它,这样就可以屏蔽掉一些网络细节

res = remoteFunc(req)

在这里插入图片描述

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

  • 电脑上装的各种联网软件,比如 xx管家它们都作为客户端需要跟服务端建立连接收发消息,此时都会用到应用层协议,在这种C/S架构下,它们可以使用自家造的 RPC 协议,因为它只管连自己公司的服务器就 可以了。
  • 但浏览器,不仅需要访问自家公司服务器,还要访问其他公司服务器,因此它们需要有个统一的标准,HTTP 就是那个时代用于统一B/S的协议。
  • 但现在其实已经没分那么清了,B/S 和 C/S 在慢慢融合。很多软件同时支持多端,比如某度云盘,既要支持网页版,还要支持手机端和 PC 端

HTTP 和 RPC 有什么区别

服务发现

  • 向服务器发起请求时,需要知道IP地址和端口号,才能建立连接,这个找到服务对应的 IP 端口的过程,其实就是服务发现
  • HTTP 中,你知道服务的域名,就可以通过 DNS 服务去解析得到它背后的 IP 地址,默认 80 端口。
  • RPC中,会有专门的中间服务去保存服务名和IP信息,比如 Consul 或者 Etcd,想要访问某个服务,就去这些中间服务去获得 IP 和端口信息

底层连接形式

  • HTTP/1.1 协议,其默认在建立底层 TCP 连接之后会一直保持这个连接(Keep Alive),之后的请求和响应都会复用这条连接。(长连接)
  • RPC 协议,也是通过建立 TCP 长链接进行数据交互,但是RPC一般还会建一个连接池,在请求量大的时候,建立多条连接放在池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用

传输内容(最大区别)

  • 基于 TCP 传输的消息,都是消息头 Header消息体 Body
    • Header 是用于标记一些特殊信息,其中最重要的是消息体长度。
    • Body 则是放我们真正需要传输的内容,而这些内容只能是二进制 01 串
    • 但是对于结构体而言,需要通过 Json,Protobuf。把结构体转换为二进制字符串

在这里插入图片描述

  • 像 Header 里的那些信息,其实如果我们约定好头部的第几位是 Content-Type,就不需要每次都真的把"Content-Type"这个字段都传过来,类似的情况其实在 body 的 Json 结构里也特别明显。
  • RPC,因为它定制化程度更高,可以采用体积更小的 Protobuf 或其他序列化协议去保存结构体数据,同时也不需要像 HTTP 那样考虑各种浏览器行为,比如 302 重定向跳转啥的。因此性能也会更好一些
    在这里插入图片描述
    在这里插入图片描述

有HTTP协议为什么还要WebSocket

  • 从 HTTP 协议的角度来看,就是点一下网页上的某个按钮,前端发一次 HTTP请 求,网站返回一次 HTTP 响应。这种由客户端主动请求,服务器被动响应。
  • 玩挂机游戏,就需要服务器主动发消息给客户端。

使用HTTP不断轮询

  • 网页的前端代码里不断定时发 HTTP 请求到服务器,服务器收到请求后给客户端响应消息。
  • 它其实并不是服务器主动发消息到客户端,而是客户端自己不断偷偷请求服务器,只是用户无感知而已。

长轮询

  • HTTP 请求发出后,一般会给服务器留一定的时间做响应,比如 3 秒,规定时间内没返回,就认为是超时。
  • 如果我们的 HTTP 请求将超时设置的很大,比如 30 秒,在这 30 秒内只要服务器收到了扫码请求,就立马返回给客户端网页。如果超时,那就立马发起下一次请求。
    在这里插入图片描述
  • 像这种发起一个请求,在较长时间内等待服务器响应的机制,就是所谓的长训轮机制。我们常用的消息队列 RocketMQ 中,消费者去取数据时,也用到了这种方式。
  • 本质上还是客户端主动去取数据。

WebSocket

  • TCP 连接的两端,同一时间里,双方都可以主动向对方发送数据。这就是所谓的全双工
  • HTTP/1.1,也是基于TCP协议的,但是是半双工
  • HTTP设计之初,就是考虑网页场景,客户端发送请求,服务器响应。根本没想到客户端和服务器都要互相主动发大量数据
  • 对于网页游戏来说,客户端和服务器需要频繁主动发送数据,于是产生基于TCP的新协议。WebSocket。

怎么建立WebSocket连接

  • 一般都是在浏览器上刷的图文,这时候用的是 HTTP 协议,一会打开网页游戏,这时候要切换成WebSocket 协议。
  • 于是浏览器在 TCP 三次握手建立连接之后,都统一使用 HTTP 协议先进行一次通信。
    • 如果此时是普通的 HTTP 请求,那后续双方就还是老样子继续用普通 HTTP 协议进行交互,这点没啥疑问。
    • 如果这时候是想建立 WebSocket 连接,就会在 HTTP 请求里带上一些特殊的header 头
Connection: Upgrade
Upgrade: WebSocket
Sec-WebSocket-Key: T2a6wZlAwhgQNqruZ2YUyg==\r\n   
  • 浏览器想升级协议(Connection: Upgrade),并且想升级成 WebSocket 协议(Upgrade: WebSocket)。同时带上一段随机生成的 base64 码(Sec-WebSocket-Key),发给服务器。
  • 如果服务器正好支持升级成 WebSocket 协议。就会走 WebSocket 握手流程,同时根据客户端生成的 base64 码,用某个公开的算法变成另一段字符串,放在 HTTP 响应的 Sec-WebSocket-Accept 头里,同时带上101状态码,发回给浏览器。
  • 浏览器也用同样的公开算法将base64码转成另一段字符串,如果这段字符串跟服务器传回来的字符串一致,那验证通过。
HTTP/1.1 101 Switching Protocols\r\n
Sec-WebSocket-Accept: iBJKv/ALIW2DobfoA4dmr3JHBCY=\r\n
Upgrade: WebSocket\r\n
Connection: Upgrade\r\n

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Disabled PicPipeline: ImagesPipeline requires installing Pillow 4.0.0 or later

目录 一、scrapy是什么 二、问题以及原因 三、解决办法 1、确保系统已经安装了 Pillow 库。 2、安装 Pillow 库。 3、在项目根目录中添加 Pillow 的 .pth 文件。 一、scrapy是什么 Scrapy是一个用于从网站和Web应用中抓取数据的强大的Python库。Scrapy支持异步I/O和 Scr…

销售数据分析怎么做?这篇文章说清楚了

如何分析销售数据?分析销售数据有哪些指标?销售数据分析有什么作用? 销售数据是不是得通过数据分析软件啊? 本文将为您解答疑惑—— 一、分析销售数据的指标 从两个层面上来讲,一个是对销售情况的整体把控&#xf…

大学校友会管理APP系统开发 重温同学梦再叙校园情

互联网技术的深入发展,让各行各业对网络的依赖都逐渐加深,可以说网络在今天已经成为无数个你我他不可或缺的平台。学生时代是一生中最美好的时期,校友是社会高效重要的社会资本和无形资产,校友与校友之间信息交流也需要依靠互联网…

虚拟化转向容器的新方案,红帽正式推出虚拟化容器统一平台——openshift虚拟化

编辑 | 宋慧 出品 | CSDN 云计算 云原生、容器化,是近年 IT 界主要的话题之一。 数字化转型的浪潮下,技术在朝向更加有利于业务快速迭代的方向发展。据 CSDN 最新年度《中国开发者调查报告》数据显示,近一半的公司(43%&#xff0…

爬虫|Python|ts格式的加密视频合并方法

前言: 爬虫的一些基本概念: 对于爬虫来说,没有道德(比如,某些爬虫上w的并发,那么,一些小站可能就会崩溃,其实爬虫也是可以作为网络攻击的,假设有需要攻击的网站&#x…

Shell 脚本传递参数的两种方式:位置传参与指令式传参

Shell 脚本传递参数的两种方式 方式一:数字传参 直接传参 数字传递可以用$1 $2 $3 ......获取第一个第二个第三个参数,$0获取命令(也就是你的文件名),$#可以查看总的参数个数 以下文件命名为param1(shel…

rk3568平台调试typec口实现uvc输出,网络共享等功能

一、修改kernel相关配置 注意:一定要知道主控接线,那个物理口是otg的,然后要找准与之所连接的phy和控制器。然后处理CC1 CC2识别芯片,fusb302。默认sdk自带有驱动,需要配上中断脚和提供VBUS 5V的脚。用来判断角色是DF…

( “ 图 “ 之 拓扑排序 ) 210. 课程表 II ——【Leetcode每日一题】

❓210. 课程表 II 难度:中等 现在你总共有 numCourses 门课需要选,记为 0 到 numCourses - 1。给你一个数组 prerequisites ,其中 prerequisites[i] [ai, bi] ,表示在选修课程 ai 前 必须 先选修 bi 。 例如,想要学…

使用 docker 搭建 mysql 主从配置

真正的配置文件是docker中 /etc/my.cnf 拉取镜像 docker pull mysql:5.7启动主数据库和从数据库 docker run -p 3306:3306 --restartalways --name mysql_v1 -v /var/mysql/mysql_v1:/var/lib/mysql -e MYSQL_ROOT_PASSWORDroot -d mysql:5.7 docker run -p 3307:3306 --res…

Neural Network笔记2

torch.nn: Containers: 神经网络骨架 Convolution Layers 卷积层 Pooling Layers 池化层 Normalization Layers 正则化层 Non-linear Activations (weighted sum, nonlinearity) 非线性激活 Convolution Layers Conv2d torch.nn.Conv2d(in_channels, out_channels, ke…

java版企业电子招投标系统源码 spring boot+mybatis+前后端分离

项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及…

一体化管理系统如何使企业受益?

在当今世界,大多数企业使用管理系统来制定政策和程序,以帮助实现其业务目标。管理体系是用于确保企业能够管理实现其目标所需的所有任务的流程和程序的结构。 公司或企业会有支持客户、采购、项目、考勤、财务等管理系统,这些管理系统通常在…

OBCP部分考点总结

备份恢复: 恢复的最小力度:租户级 分布式事务: 参与者或者协调者宕机,全部参与者发送prepare ok,客户端会commit sql引擎: 不能使用常量的场景:between and 应该可以使用常量,被…

菁染料CY3标记氨Cyanine3-amine合成方式2247688-56-6

CY3-amine是一种荧光染料,其分子式为C36H52Cl2N4O ,分子质量616.745,具有良好的荧光性能和化学稳定性。 产品名称:菁染料CY3标记氨基;三甲川花菁染料标记氨基 英文名称:Cy3-amine;Cyanine3-amine 品牌商&a…

论文ai生成-一键生成论文的软件

ChatGPT自动写论文 ChatGPT可以使用生成的文本来帮助撰写学术论文,其中包括文章的大纲、段落和句子。但是,它并不会像一个完全替代人的写作工具一样让你“自动”写作。 虽然ChatGPT可以生成相当准确的语言,但它并不完美,它并不能…

Websocket的基本认识、使用与封装

目录 一、Websocket是什么 二、Websocket的基本使用 使用介绍 第一步 第二步 第三步 第四步 常用API介绍 WebSocket(url[, protocols]) WebSocket.readyState WebSocket.send(data) WebSocket.close([code[, reason]]) WebSocket.bufferedAmount WebSocket.exten…

顺序表功能实现(入手版详解)

🍉博客主页:阿博历练记 📖文章专栏:数据结构与算法 🚚代码仓库:阿博编程日记 🌹欢迎关注:欢迎友友们点赞收藏关注哦 文章目录 🍓前言✨顺序表🔍1.顺序表的整体…

【SpringBoot】SpringBoot 优雅地校验参数

1、为什么要校验参数? 在日常的开发中,为了防止非法参数对业务造成影响,需要对接口的参数进行校验,以便正确性地入库。 例如:登录时,就需要判断用户名、密码等信息是否为空。虽然前端也有校验,…

剑指offer 栈习题训练经验总结(未完)

第一题 定义栈的数据结构&#xff0c;请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中&#xff0c;调用 min、push 及 pop 的时间复杂度都是 O(1)。 class MinStack {private:stack<int> s;stack<int> min_s;public:void push(int x) {s.push(x);if…

xxl-job 集成 SpringBoot 使用

文章目录 前言xxl-job 集成 SpringBoot 使用1. xxl-job 安装部署超链接2. 启动xxl-job3. 集成 SpringBoot 使用3.1. 添加依赖3.2. 执行器 配置3.3. 执行器组件配置3.4. XxlJob 开发步骤 4. &#xff08;BEAN模式&#xff09;示例5. GLUE(Java) 示例6. 注意 前言 如果您觉得有用…