为什么有了 HTTP 还要 RPC

为什么,http,还要,rpc · 浏览次数 : 970

小编点评

**HTTP 协议** * 无状态协议,每次请求和响应之间没有关联的连接。 * 使用文本格式进行数据传输。 * 可扩展性强,可以处理大量请求。 * 容易调试。 **RPC 协议** * 有状态协议,可以维护会话状态。 * 使用二进制格式进行数据传输。 * 支持多种数据格式和传输协议。 * 具有更高的传输效率和更低的网络延迟。 * 支持同步调用、异步调用、流式调用等高级特性。 * 安全性更可靠。

正文

哈喽大家好,我是咸鱼

随着互联网技术的发展,分布式架构越来越被人们所采用。在分布式架构下,为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用

而这时候就需要一种协议来支持远程过程调用,以便实现不同应用程序之间的数据交换和信息传递。其中常用的协议包括 HTTP 协议和 RPC 协议

HTTP 协议和 RPC 协议都是用于计算机之间进行通信的协议。那么小伙伴们有没有想过它们之间有什么区别呢?有了HTTP为什么还要RPC呢?

为了解答上面的疑问,我们先从这两个协议的介绍开始

HTTP 和 RPC

  • HTTP

学过计算机网络的小伙伴们相信对下面这段话再熟悉不过了:

HTTP(HyperText Transfer Protocol,超文本传输协议)协议,主要用于在 Web 浏览器和 Web 服务器(B/S架构)之间传输超文本标记语言(HTML)文件,支持客户端和服务器之间的通信

HTTP 协议是网络传输协议中应用最为广泛的一种,HTTP 协议基于请求/响应模型,通过在客户端和服务器之间交换请求和响应来传输数据。

它简单、灵活、可扩展,而且最重要的是——它是一种无状态协议,也就是说,每次客户端和服务器之间交换请求和响应时,HTTP协议都是一张白纸,不会记住之前的任何信息

而无状态协议重要的一点优势是可靠,即使某个请求失败或者丢失,也不会影响到其他请求的处理

HTTP 协议使用文本格式进行传输,方便开发人员去阅读和调试,又因具有可跨平台、可扩展、可缓存、可重用等优点被广泛应用于 Web 开发中,常用于网页访问、图片加载等场景

看到这里,小伙伴可能会想,HTTP 这么神,它真的就一点缺点没有吗?当然肯定是有的

前面我们说到 HTTP 协议是无状态的,也就是说每次请求和响应之间是没有关联的,服务器不会记住之前的任何信息,所以会导致每次请求都要重新建立连接

在处理一些长连接或高并发的场景时,每次请求都需要重新建立连接,而这个过程不但会增加了网络开销和延迟,还会消耗服务器的资源,从而降低了效率。如果使用有状态的协议,服务器可以记住之前的信息,避免了重复建立连接的过程

除此之外,因为 HTTP 协议最初设计的目的是为了在客户端和服务器之间传输 HTML 文档,即数据传输格式是基于文本的

所以说 HTTP 协议不支持类型化的数据传输和自定义协议扩展,请求和响应的格式是固定的,这就导致了它不能很好地支持自定义数据结构和复杂逻辑

简单来说,HTTP 协议有点“死板”

  • RPC

RPC(Remote Procedure Call,远程过程调用)协议是一种进程间通信协议,用于实现分布式应用程序之间的远程调用,使得不同的应用程序可以像调用本地程序一样调用远程程序

RPC 协议基于函数调用模型。在 RPC 协议中,客户端调用远程服务器上的函数时,会将参数打包成消息并发送给服务器,服务器接收到消息后,解包参数并执行相应的函数,最后将结果打包成消息并发送回客户端、

这这个过程对于客户端来说是透明的,就像调用本地函数一样,即 RPC 可以实现在不同的进程或不同的机器之间进行函数调用

它具有网络传输速度快、协议扩展性好等优点(因为采用了二进制数据传输格式,相对于HTTP等基于文本的协议,二进制格式传输数据更加高效)。不但如此,RPC 的设计初衷就是支持多种数据格式和传输协议,这使得它可以很好地支持复杂的数据结构和逻辑

此外,RPC 协议可以使用更高效的编码和传输协议,还可以使用异步调用来提高响应速度

我们常说,世上没有完美的东西,HTTP 如此,RPC 也是如此

与 HTTP 相比,RPC 更加复杂。为了实现 RPC 协议的设计目标(高效、灵活和可扩展),它需要定义更多的接口和协议,同时需要更多的配置和管理。当然这会提高开发和运维的难度

为了支持跨语言、跨平台的远程调用,RPC 通常不包含安全机制。如果不采取额外的安全措施,就有可能存在身份伪造、数据篡改、拒绝服务等安全问题

为了保护网络安全,我们可以在 RPC 中实现额外的安全措施:

  1. 例如使用SSL/TLS协议进行加密通信
  2. 使用数字证书进行身份验证
  3. 使用访问控制列表进行授权
  4. 进行安全审计和漏洞扫描

前面我们说到,RPC 通常采用二进制数据传输格式,而不是基于文本的格式。二进制格式虽然传输效率高,但是需要额外的计算资源来序列化和反序列化参数和返回值

在 RPC 中,客户端和服务器之间需要将参数和返回值打包成二进制数据,并在网络上传输。这个过程需要将参数和返回值转换为二进制格式,并进行压缩和编码,以减少数据传输量

对于接收方,需要将接收到的二进制数据解码并转换为原始数据格式。这个过程需要消耗额外的计算资源

因此,RPC需要额外的网络带宽和计算资源来序列化和反序列化参数和返回值

HTTP 和 RPC 的区别

  1. 目的不同

HTTP 是一种无状态的协议,它的主要目的在客户端和服务器之间交换请求和响应来传输文本内容

RPC 是一种有状态的协议,它的主要目的是在客户端和服务器之间传递信息并调用远程函数

  1. 传输方式不同

HTTP 使用文本(如 HTML、XML、JSON等)作为载体,并且使用明文传输

RPC可以使用多种格式传输(例如二进制格式),并且可以使用额外的安全加密技术保证传输安全性

  1. 通信方式不同

HTTP 使用的是请求/响应模型,客户端向服务器发送请求并等待响应。客户端发送一个请求,服务器返回一个响应

RPC 使用的是调用/返回模型,客户端调用服务器上的远程函数并等待返回结果。RPC 支持多种不同的调用方式,如同步调用、异步调用、流式调用等

有了 HTTP 为什么还要 RPC?

虽然 HTTP 已经成为了网络通信的重要标准之一而且被广泛应用于互联网上的各种场景,但是在某些情况下,它并不能满足用户的需求

例如在一些复杂的分布式应用场景下(分布式系统中的服务调用、微服务架构中的服务间通信等),RPC 协议要比 HTTP 协议更适合

咸鱼将从以下几点来阐述一下 RPC 为什么更适合复杂的分布式应用场景

从时效性度来看

  • HTTP 协议的数据格式有一定的局限性,比如只能传输文本,传输效率低下
  • HTTP协议是基于请求/响应模型,每次请求都需要建立一个新的连接,这样会增加网络开销
  • 相比于 HTTP 协议,RPC 协议通常使用二进制数据格式进行传输,通常具有更高的传输效率和更低的网络延迟
  • 相比于 HTTP 协议,RRPC协议还支持异步调用和批量调用等高级特性,可以提高系统的性能和吞吐量

从安全性来看

  • HTTP 是一种文本协议,数据传输使用的是明文,这样就容易被中间人窃听或者篡改数据(不过可以使用SSL/TLS 协议对数据进行加密和认证)
  • 相比于 HTTP 协议,RPC 支持传输各种类型的数据(比如二进制),可以更快灵活地传输大量数据,并且也可以加密传输以保证安全性

从场景复杂度来看

  • 在复杂的业务逻辑和数据结构场景下,通常需要进行多次请求和响应操作,而 HTTP 作为无状态协议无法保持会话状态,每次请求和响应都需要重新建立连接和传输数据,这会导致网络延迟和性能下降
  • HTTP协议的请求和响应通常是基于文本或二进制数据格式,无法直接支持复杂的数据结构,例如对象、数组、枚举等
  • 相比于 HTTP 协议,RPC 是一种有状态协议,而且 RPC 可以通过定义接口和方法来封装业务逻辑,使得客户端可以通过简单的调用来完成复杂的操作
  • 相比于 HTTP 协议,RPC协议是一种面向对象的协议,它可以直接支持复杂的数据结构,例如对象、数组、枚举等

与为什么有了 HTTP 还要 RPC相似的内容:

为什么有了 HTTP 还要 RPC

哈喽大家好,我是咸鱼 随着互联网技术的发展,分布式架构越来越被人们所采用。在分布式架构下,**为了实现复杂的业务逻辑,应用程序需要分布式通信实现远程调用** 而这时候就需要一种协议来支持远程过程调用,以便实现不同应用程序之间的数据交换和信息传递。其中常用的协议包括 HTTP 协议和 RPC 协议 H

[转帖]散片CPU是小作坊做的吗?CPU散片和盒装有什么区别?如何选购

http://www.lotpc.com/yjzs/9506.html 很多用户在装机选购CPU时,都会有这样的疑惑,不知道到底选散片U还是盒装U,相同的型号下,散片U相比盒装U实惠了不少,那么CPU散片和盒装有什么区别?散片CPU是小作坊做的吗?下面装机之家晓龙来帮广大粉丝科普一下。 CPU散片和

[转帖]dd命令祥解

http://blog.chinaunix.net/uid-11728685-id-5825650.html 先简要介绍dd的参数,后边通过几个实例介绍dd的应用,参考了其他网友的资料,在此一并感谢 小菜水平有限文中有什么错误请大家指正,关于dd还有什么好的使用方法,可以贴出来,小菜会及时更新 dd

[转帖]HTTP与HTTPS超文本传输协议的区别是什么

https://www.likecs.com/show-308649882.html 随着越来越多的网站使用HTTPS加密,现在HTTPS的使用已经成了硬性要求了。虽然说https是http的安全版,但两者还是有不少区别的。本文从https、http的概念和原理入手,讲解他们的不同,让读者朋友能够真

[转帖]删除数据后的Redis内存占用率为什么还是很高?

https://zhuanlan.zhihu.com/p/490569316 有时候Redis明明做了数据删除,数据量已经不大了,但是使用top命令的时候,还会发现Redis占用了很多内存? PS:关于 Redis的高并发及高可用,到底该如何保证?可以参考下这个帖子:httss://http://z

[转帖]固态硬盘差价为什么那么大?便宜的固态硬盘和贵的固态硬盘区别

http://www.lotpc.com/yjzs/8879.html 在目前的市场上,主流硬盘主要分为固态硬盘和机械硬盘,而现如今,基本都是首选固态硬盘了,而机械硬盘往往被作为存储盘使用,固态硬盘相比机械硬盘在读写速度提升还是十分显著的,并且可以让我们实实在在的能够感受到速度体验,就例如系统安装在

浅谈:HTTP 和 HTTPS 通信原理

1.HTTP基本概念 1.1 HTTP是什么? HTTP (超文本传输协议)协议被用于在 Web 浏览器和网站服务器之间传递信息, HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了 Web 浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此, HTTP 协议

HTTP请求:requests的进阶使用方法浅析

上篇文章讲解了requests模块的基础使用,其中有get、put、post等多种请求方式,使用data、json等格式做为请求参数,在请求体中添加请求头部信息的常见信息,如:headers、cookies,以及对请求响应的处理方法。接下来讲解一下requests的高级用法。

[转帖]将 Cloudflare 连接到互联网的代理——Pingora 的构建方式

https://zhuanlan.zhihu.com/p/575228941 简介 今天,我们很高兴有机会在此介绍 Pingora,这是我们使用 Rust 在内部构建的新 HTTP 代理,它每天处理超过 1 万亿个请求,提高了我们的性能,并为 Cloudflare 客户带来了许多新功能,同时只需要我

记录一次gcc的编译

在deepin23上编译gcc13.2 deepin20素以软件版本过老被人诟病,换成最新的deepin23之后情况大有好转,但是gcc版本为11.2,鄙人对此仍有意见,所以特意研究了如何编译一份较新的gcc来用。 1.下载源码包 http://mirrors.ustc.edu.cn/gnu/gcc