网络编程——RPC与HTTP基本介绍、历史追溯、主流应用场景、对比分析、为什么还需要使用RPC

news2024/11/25 9:49:59

一、HTTP与RPC基本介绍

  • HTTP协议(Hyper Text Transfer Protocol)超文本传输协议
    • 一个用于在网络上交换信息的标准协议,它定义了客户端(例如浏览器)和服务器之间的通信方式。如平时上网在浏览器上敲个网址url就能访问网页,这里用到的就是HTTP协议。
    • HTTP最早版本在1989年提出,经过多年发展,到1996年发布的HTTP/1.1版本一直沿用至今,而在2015年也出现了HTTP/2.0。
  • RPC(Remote Procedure Call)远程过程调用
    • 能够调用位于另一个地址空间(通常是网络上的另一台计算机)中的函数,而对程序员来说是透明的。仅仅是远程调用,还不算是RPC,因为RPC强调的是过程调用,调用的过程对用户而言是应该是透明的,用户不应该关心调用的细节,可以像调用本地服务一样调用远程服务。所以RPC一定要对调用的过程进行封装。
    • 它本身并不是一个具体的协议,只是一种协议的规范,它并没有具体实现,只有按照RPC通信协议规范实现的通信框架,也就是RPC框架,才是协议的具体实现,比如Dubbo、gRPC等。它包括了:接口规范+序列化反序列化规范+通信协议等
    • RPC的概念可以追溯到1970年代,但真正流行起来是1980年代中后期,随着分布式计算的兴起。1984年发布的ONC RPC和1986年的DCE RPC是最早的RPC实现。
      在这里插入图片描述

在面试题中可能会看到为什么有了HTTP,还需要RPC,但由上述介绍可知,RPC的提出及使用时间均比HTTP要早,故首先需要思考第一个问题——为什么有RPC还要有HTTP协议?

二、为什么有了RPC,还需要HTTP

2.1 历史追溯——B/S与C/S架构

首先,我们需要先了解 B/S 和 C/S 指的是两种常见的软件架构模型:

  1. C/S:Client/Server,即客户端/服务器架构。
    • 这种架构中,客户端和服务器是独立的两个程序,通过某种网络协议进行通信。
    • 客户端需要安装专用的软件来访问服务器提供的服务。服务器提供各种功能给客户端调用。典型的 C/S 架构应用如QQ、迅雷、游戏客户端等各种需要安装对应软件的服务
    • C/S架构的概念可以追溯到20世纪60年代随着分布式计算的兴起开始出现,但真正流行开来是80年代中后期。
  2. B/S:Browser/Server,即浏览器/服务器架构。
    • 这种架构中,客户端只需要使用 web 浏览器来访问 web 服务器提供的服务。web 服务器提供 HTML、JavaScript、CSS 等页面,浏览器负责展现。
    • 典型的 B/S 架构应用就是 web 应用。用户只需要一个浏览器就可以访问服务,而不需要安装任何客户端软件。
    • B/S架构是与万维网、HTTP协议同时出现的,大约出现于1989年。

因此由上可知,在刚开始C/S架构流行时,对于C/S架构下的软件,如聊天软件、办公软件等,它们只需要与自己公司的服务器通信,所以可以使用自家定制的RPC协议进行远程调用即可。但随着万维网与B/S架构的出现,浏览器产生了,而浏览器需要访问来自不同公司的很多网站,这不能通过RPC进行访问,所以需要一个统一的标准来与这些网站服务器通信。这就是HTTP协议发挥作用的地方。HTTP为B/S架构(浏览器/服务器架构)提供了一个统一的标准,让不同网站的服务器能够与浏览器交互。

2.2 RPC与HTTP主流应用场景

由以上分析可知,在多年前,RPC与HTTP有对应的主流应用场景

  • RPC 更多用于 C/S 架构,即客户端(Client)和服务器(Server)之间的通信。因为 C/S 架构通常是 within an organization(一个组织内部),所以可以使用自家定制的 RPC 协议来实现客户端和服务器之间的通信。
  • HTTP 主要用于 B/S 架构,即浏览器(Browser)和服务器(Server)之间的通信。因为浏览器需要一个统一的标准来访问不同网站的服务器,所以 HTTP 成为了 B/S 架构的标准协议。而HTTP发明的场景是用于web架构,而不是分布式系统间通信,这导致了在很长一段时间内,HTTP是浏览器程序和后端web系统通信用的东西,传输的文档格式是繁琐的HTML格式,因此没有人把HTTP作为分布式系统通信的协议。

但是随着用户需要,许多软件同时支持多端,现在情况已经变化,B/S 架构和 C/S 架构在慢慢融合。越来越多的应用同时支持 Web 端、手机端和 PC 端。

  • 随着前端技术的发展,AJAX技术和JSON文档在前端界逐渐成为主流,HTTP调用摆脱HTML,开始使用JSON这一相对简洁的文档格式。之后随着RESTFUL思潮的兴起,越来越多系统用HTTP来提供服务。因此为了简化架构,现在很多应用选择使用 HTTP 作为统一的通信协议,来支持多端通信。这使服务器端只需要实现一次 HTTP 接口,就可以支持所有客户端。
  • 而 RPC 协议则主要用于 within an organization(一个组织内部),比如公司内部的微服务(Microservices)之间的通信。
  • 所以总的趋势是:HTTP 作为公用的标准协议不断普及,而自家定制的 RPC 协议则主要用于内部集群(Cluster)。

而由上介绍,我们可以知道HTTP既可以用于B/S端,也可以用于C/S端,那这样为什么不全部使用HTTP协议呢,即引出了接下来的经典面试问题——为什么有了HTTP,还需要RPC

3. 为什么有了HTTP,还需要RPC

3.1 HTTP与RPC对比分析

HTTP通常指的是HTTP1.1版本,在对HTTP1.1与RPC进行分析时,一般会从以下方面进行分析:

特点HTTP 1.1RPC
协议用途对外的异构环境,浏览器接⼝调⽤,APP接⼝调⽤,第三⽅接⼝调⽤等公司内部的服务调⽤,性能消耗低,传输效率⾼,服务治理
通信方式请求-响应模型,独立连接调用-返回模型,长连接
传输协议通过HTTP1.1传输,报文体积大自定义TCP协议传输,也可以基于HTTP协议
序列化文本或二进制 ,大多使用json ,也可以使用 protobuf 二进制编码文本或二进制
通信效率可支持连接池复用多次调用在同一连接中,通信效率较高
数据格式使用通用的数据格式,如JSON、XML等可以使用自定义的IDL来定义接口
接口定义和调用使用URL标识资源和进行请求与响应使用接口描述语言定义接口和方法
安全性和认证可使用TLS/SSL身份验证、加密和授权

如上所示, HTTP 1.1和RPC在传输协议和序列化方面确实存在差异。以下是对HTTP 1.1和RPC在这两个方面的差距的理解:

  • 传输协议差异:HTTP 1.1使用文本协议,其报文头部包含大量元数据,这使得每次通信的开销较高。相比之下,RPC可以使用自定义的传输协议,报文头部较小,只含有必要的元数据,从而减少了通信的开销。
  • 序列化差异:HTTP 1.1常用的序列化格式是文本格式,如JSON、XML等。尽管可以使用二进制编码协议如Protobuf对内容进行编码,但由于二进制编码的可读性较差,使用较少,且在打开网页时进行序列化json等文本格式的时间也可忽略不计,故通常在HTTP应用中,文本格式更为普遍。而在RPC中,由于通常用于服务间通信如游戏服务器,性能和效率更为重要,因此更常使用二进制编码协议。

另外,需要指出的是,随着HTTP的发展,出现了HTTP 2.0和HTTP 3.0。 HTTP/2和HTTP/3在传输协议和性能方面都对HTTP/1.1进行了重要改进。它们都采用了二进制协议格式,可以更高效地传输数据。同时,它们都支持多路复用,可以同时在一个连接上发送多个请求和响应,减少了网络延迟和资源浪费。HTTP/2还引入了头部压缩技术,可以减小报文头的大小,提高传输效率。而HTTP/3则采用了QUIC协议和UDP传输,可以更快地建立连接并传输数据,提高了实时性和可靠性。

总结来说,HTTP/1.1相对于RPC在传输协议和性能方面有一些不足,但是随着HTTP/2和HTTP/3的出现,HTTP协议在这些方面得到了很大的改进,使得它在某些场景下可以替代RPC来进行高效的数据传输。如当前流行的gRPC框架底层就使用HTTP2.0 协议进行通信。

当然2015年才出现HTTP 2.0,因此在2015年之前使用RPC可以从效率方面进行考虑,但如今已经出现了效率一样的HTTP2.0,为什么还需要继续使用RPC呢?

3.2 为什么还需要使用RPC

根据上述对比分析,可以发现HTTP2.0协议已经优化编码效率问题,像 grpc 这种 rpc 库使用的就是 http2.0协议,那么为什么还需要使用RPC进行远程调用呢?

之前说过,RPC并不是一个具体的协议,只是一种协议的规范,它并没有具体实现,只有按照RPC通信协议规范实现的通信框架,也就是RPC框架,才是协议的具体实现,它包括了:接口规范+序列化反序列化规范+通信协议等。现在狭义的RPC一般指一些用IDL(Inteface Description Language)描述接口, 然后生成stub的框架, 比如grpc,thrift,dubbo等,其中grpc,dubbo3.0的传输用的都是HTTP2.0,也已经属于RPC和HTTP的融合体了,这种融合体的设计使得开发人员可以享受到HTTP的广泛支持,同时获得更好的性能和功能。

当我们使用比较成熟的RPC库时,RPC库通常提供了更多面向服务的高级特性,如服务发现、负载均衡和熔断降级等。

  1. 服务发现:RPC库可以提供服务注册和发现的机制,使得服务之间的通信更加灵活和可靠。通过服务发现,服务可以自动注册自己的地址和状态,并且客户端可以动态地发现可用的服务实例。这样,当服务实例发生变化时,客户端可以自动适应并调用可用的服务。
  2. 负载均衡:RPC库可以支持负载均衡算法,用于将请求动态地分配到不同的服务实例上。负载均衡可以根据实际情况,如服务实例的负载情况、网络延迟等,来决定将请求发送到哪个服务实例上,以实现请求的均衡分配和提高系统的性能和可伸缩性。
  3. 熔断降级:RPC库可以实现熔断降级机制,用于处理服务不可用或响应时间过长的情况。当某个服务出现故障或性能下降时,熔断降级可以自动切换到备用服务或返回默认值,以保证系统的稳定性和可用性。熔断降级还可以防止故障的扩散,避免整个系统崩溃。

总的来说,RPC框架是对HTTP协议的更高级封装,它提供了服务发现、负载均衡和熔断降级等面向服务的高级特性。这些特性使得RPC框架在构建分布式微服务系统时更加方便和可靠,能够提供更好的性能、可伸缩性和容错能力。

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

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

相关文章

Vue--》打造个性化医疗服务的医院预约系统(一)

今天开始使用 vue3 ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运…

智慧农场丨2023年数字经济发展助力生态农场规划

智慧农场丨2023年数字经济发展助力生态农场规划 导读:生态农场是保护环境和发展农业的新模式,它遵循生态平衡规律,在持续利用的原则下开发利用农业自然资源,进行多层次、立体、循环利用的农业生产,使能量和物质流动在生…

【大数据之Hive】二十三、HQL语法优化之数据倾斜

1 数据倾斜概述 数据倾斜指参与计算的数据分布不均,即某个key或者某些key的数据量远超其他key,导致在shuffle阶段,大量相同key的数据被发往同一个Reduce,导致该Reduce所需的时间远超其他Reduce,成为整个任务的瓶颈。  …

System.InvalidOperationException:对象当前正在其他地方使用

System.InvalidOperationException:对象当前正在其他地方使用 出现此情况,一般是对象被多个线程同时使用了 解决办法就是同一时间只允许单线程访问目标对象;

面试上海某小厂Java岗,全程一小时问的全是细节

之前分享很多大厂的面经,这次分享一家上海某小厂的 Java 岗位面试,面试的时间也挺长的,接近 1 个小时,无算法,全程抓着项目mysqlredisjava这 4 个方向问。 问题记录 项目 介绍你的项目 这个项目是企业里面做的还是学…

Redis数据结构 — Listpack

目录 listpack 结构 listpack 节点结构 quicklist 虽然通过控制 quicklistNode 结构里的压缩列表的大小或者元素个数,来减少连锁更新带来的性能影响,但是并没有完全解决连锁更新的问题。 于是,Redis 在 5.0 新设计一个数据结构叫 listpack…

助力环保问题检测,基于YOLOv5全系列模型【n/s/m/l/x】开发构建不同量级裸土检测识别模型,对比实验分析检测性能

道路裸土扬尘问题是城市环境中常见的环境污染问题之一。在以往的一些项目中也有实际接触到过类似的检测识别需求,本文的主要目的是单纯地从实验分析的角度来对比裸土这一数据场景下不同量级参数模型的实际性能。 首先看下整体效果: 接下来简单看下数据集…

uniapp微信小程序使用axios(vue3+axios+ts版)

版本号 "vue": "^3.2.45", "axios": "^1.4.0", "axios-miniprogram-adapter": "^0.3.5", 安装axios及axios适配器,适配小程序 yarn add axios axios-miniprogram-adapter 使用axios 在utils创建utils/…

ES6新特性基础总结

目录 简介 node.js安装 babel转码器 let命令 const命令 解构对象 字符串扩展 新增方法: 数组扩展 扩展运算符 伪数组 对象扩展 属性的简介表示法 属性名表达式 对象的扩展运算符 函数扩展 箭头函数 使用注意 Set数据结构 基本用法 size属性 特有方法 P…

【数据结构常见七大排序(二)】—选择排序篇【直接选择排序】And【堆排序】

目录 前言 1.直接选择排序 1.1基本思想 1.2直接选择排序实现过程 1.3动图助解 1.4直接选择排序源码 2.堆排序 2.1堆排序的概念 2.2堆排序源码 前言 选择排序有两种常见的【直接选择排序】、【堆排序】 1.直接选择排序 1.1基本思想 每一次从待排序的数据元素中选出最…

Kafka 入门到起飞 - 核心概念(术语解释)

在kafka之旅,我们会大量讨论Kafka中的术语,那么就让我们先来了解一下这些核心概念 消息(Message): kafka的数据单元称为消息,相当于DB里的一行数据或一条记录 消息由字节数组组成 批次: 生产者组一批数据再向kafka推送…

短视频seo矩阵源码开发与实践分享

在短视频矩阵系统源码开发中,需要注意以下几个细节: 1. 确定系统的功能需求:在开发短视频矩阵系统源码时,必须先明确系统的功能需求,包括用户的基本操作、系统数据的生成和处理等。 2. 定义数据库结构:短…

提高开发效率!5个对开发者有用的Kotlin扩展函数

本文已同步发表于我的微信公众号,搜索 代码说 即可关注,欢迎与我沟通交流。 文章目录 runCatching代替try catchView的可见性dp、sp、px之间相互转换by lazy 替代findViewByIdToast、Log Kotlin 中扩展函数是一种允许在已有的类中添加新函数,…

Day52| 300.最长递增子序列 、 674. 最长连续递增序列 、718. 最长重复子数组

300.最长递增子序列 1.题目: 给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 …

从编写metadata.yaml到测试processor文件成功

检查模型和客户端( Excel 原型图)字段是否对应 修改 applications\commands\metadata\cai_liao_ she_bei_metadata.yaml 文件 wen_jian_db_conf 下的 all 下的 content_field_name 选项,要根据 model 中写的文件路径找到对应的 model&#x…

论文阅读—2023.7.13:遥感图像语义分割空间全局上下文信息网络(主要为unet网络以及改unet)附加个人理解与代码解析

前期看的文章大部分都是深度学习原理含量多一点,一直在纠结怎么改模型,论文看的很吃力,看一篇忘一篇,总感觉摸不到方向。想到自己是遥感专业,所以还是回归遥感影像去谈深度学习,回归问题,再想着…

resultType和parameterType的基本使用和区别

我们在使用Mybatis的过程中不难发现Mapper文件中的select,insert,update,delect操作中都有一个parameterType 或 resultType属性。 resultType:返回值类型,类型即为对象类型,返回结果字段与对象属性匹配映射,类型中的属性名要与查…

数学建模-假设检验

原假设,备择假设P值,显著性水平单侧建议,双侧检验

IPUU的小工具拍了拍你(上)

IPUU是埃文科技旗下的综合性IP查询网站,提供多维度的IP数据信息。通过在线查询,用户可以获取目标IP地址的详尽信息,包括位置属性、网络属性、风险属性以及业务属性等,同时还可以查询域名信息。无论您是需要查看某个IP地址归属地&a…

VBA技术资料1-120

MF系列VBA技术资料 为了让广大学员在实际VBA编程中有切实可行的思路及有效的提高自己的编程技巧,我参考大量的资料,并结合自己的经验总结了这份MF系列VBA技术综合资料,而且开放源码(MF04除外),其中MF01-04属…