首页 > 其他分享 >HTTP 和 RPC

HTTP 和 RPC

时间:2024-07-30 11:40:12浏览次数:10  
标签:协议 服务 TCP RPC HTTP 连接

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

RPC(Remote Procedure Call),又叫做远程过程调用。它本身并不是一个具体的协议,而是一种调用方式。虽然大部分 RPC 协议底层使用 TCP,但实际上它们不一定非得使用 TCP,改用 UDP 或者 HTTP,其实也可以做到类似的功能。

TCP 在 70 年代被使用,而 HTTP 直到 90 年代才流行,刚学到的裸 TCP 会有问题于是有很多自定义协议,就包括了 80 年代的 RPC。

各种联网软件,比如 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 区别
服务发现
建立连接的前提是,你得知道 IP 地址和端口。这个找到服务对应的 IP 端口的过程,其实就是服务发现。

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

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

底层连接形式
主流的 HTTP/1.1 协议为例,其默认在建立底层 TCP 连接之后会一直保持这个连接(Keep Alive),之后的请求和响应都会复用这条连接。

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

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

但是这里两者的区别也并不大。

传输内容
Header 是用于标记一些特殊信息,其中最重要的是消息体长度。

Body 则是放我们真正需要传输的内容,而这些内容只能是二进制 01 串。传输字符串可以简单转换,但结构体也得想个办法将它也转为二进制 01 串,这样的方案现在也有很多现成的,比如 Json,Protobuf。

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

HTTP 设计初是用于做网页文本展示的,所以它传的内容以字符串为主。Header 和 Body 都是如此。在 Body 这块,它使用 Json 来序列化结构体数据。看 HTTP/1.1 的问题,前面也反复提到,在 Header 中的信息一直重复,眼中影响传输效率。

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

当然,如果是 HTTP/2,因为做了许多改进,性能可能比很多 RPC 协议好,且 gRPC 底层就是直接用 HTTP/2。(之所以还是 RPC 协议作为很多内部的传输协议,是因为 HTTP/2 出的很晚,在2015 年)

标签:协议,服务,TCP,RPC,HTTP,连接
From: https://www.cnblogs.com/NETYZreall/p/18332034

相关文章

  • [HTTP] HTTP 协议 Response Header 之 Content-Length、Transfer-Encoding与Content-E
    0引言在近期项目一场景中,一WebAPI(响应内容:7MB-40MB、数据项:5W-20W条)的网络传输耗时较大,短则5s,长则高达25s,前端渲染又需要耗时9s-60s。在这个场景中,前端的问题暂且不表。那么针对后端的问题,个人认为还是有较大的优化空间:1)启用HTTP内容压缩策略【最重要】2)调整数据......
  • HTTP 与 HTTPS
    HTTPS在TCP三次握手后,还需进行SSL/TLS的握手过程,才可进入加密报文传输。HTTP默认端口号是80,HTTPS默认端口号是443。同时,HTTPS协议需要向CA(证书权威机构)申请数字证书,来保证服务器的身份是可信的。HTTPS通过混合加密、摘要算法以及身份证书,来完成对HTTP传递明文的内容......
  • HTTP/1.1、HTTP/2、HTTP/3
    HTTP/1.1相比HTTP/1.0性能上的改进:使用长连接的方式改善了HTTP/1.0短连接造成的性能开销。支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来,就可以发第二个请求出去,可以减少整体的响应时间。但HTTP/1.1还是有性能瓶颈:请求/响应头部(Header)未经压缩就发......
  • HTTP 特性
    HTTP常见到版本有HTTP/1.1,HTTP/2.0,HTTP/3.0,不同版本的HTTP特性是不一样的。这一章主要针对HTTP/1.1展开,最突出的优点是「简单、灵活和易于扩展、应用广泛和跨平台」。缺点分别是「无状态、明文传输」,同时还有最大的缺点「不安全」。对于无状态的问题,解决方案有很多种,其中......
  • HTTP 缓存
    避免发送HTTP请求的方法就是通过缓存技术,HTTP设计者早在之前就考虑到了这点,因此HTTP协议的头部有不少是针对缓存的字段。HTTP缓存有两种实现方式,分别是强制缓存和协商缓存。强制缓存只要浏览器判断缓存没有过期,则直接使用浏览器的本地缓存,决定是否使用缓存的主动性在于浏......
  • HTTP基本概念
    HTTP是超文本传输协议,也就是HyperTextTransferProtocol。HTTP协议是一个双向协议,是一个在计算机世界里专门用来在两点之间传输数据的约定和规范。是超越了普通文本的文本,它是文字、图片、视频等的混合体,最关键有超链接,能从一个超文本跳转到另外一个超文本。1xx类状态码属......
  • 你能将 HTTPS 功能添加到 python Flask Web 服务器吗?
    我正在尝试构建一个Web界面来模拟网络设备上的静态接口,该网络设备使用摘要式身份验证和HTTPS。我想出了如何将摘要式身份验证集成到Web服务器中,但我似乎无法找到如何使用FLASK获取https,如果您可以向我展示如何实现,请评论我需要使用下面的代码做什么来实现这一点。from......
  • CentOS 7 yum无法使用解决方法Could not retrieve mirrorlist http://mirrorlist.cent
    在centos7中使用yum命令事后报错:LoadingmirrorspeedsfromcachedhostfileCouldnotretrievemirrorlisthttp://mirrorlist.centos.org/?release=7&arch=x86_64&repo=os&infra=stockerrorwas14:curl#6-"Couldnotresolvehost:mirrorlist.centos.org;......
  • 【前端 · 面试 】HTTP 总结(十一)—— HTTPS 概述
    最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。争取每个知识点能够多总结一些,至少要做到在面试时,针对每个知识点都可以侃起来,不至于哑火。HTTPS前言通过前面内容的学习,相信大家对HTTP的概念、特点、请求方法及缓存等的......
  • web基础以及http协议
    ⼀、web基本概念和常识Web:为⽤户提供的⼀种在互联⽹上浏览信息的服务,Web服务是动态的、可交互的、跨平台的和图形化的。Web服务为⽤户提供各种互联⽹服务,这些服务包括信息浏览服务,以及各种交互式服务,包括聊天、购物、学习等等内容。Web应⽤开发也经过了⼏代技术的不断......