【网络】什么是RPC?RPC与HTTP有什么关系?
文章目录
- RPC是什么
- RPC和HTTP的关系和区别
- [附]关于REST论文中提到的"HTTP不是RPC"
重点参考
凤凰架构-远程过程调用
既然有HTTP为什么还要有RPC?
RPC是什么
RPC(Remote Procedure Call):即远程过程调用,目的是为了让计算机能够跟调用本地方法一样去调用远程方法。
RPC本身并不是一个具体的协议,而是对不同应用程序间通信的一种描述,一种通信思想。它可以使用很多技术来实现,有大量不同底层实现的RPC库(如早期的DCOM、CORBA,现在的dubbo、protobuf、grpc等等)。
RPC通常是基于TCP/UDP协议的,传输效率高、可定制性强、数据包小。
以下是一个远程过程调用的核心流程。RPC包含的就是从User stub到Server stub的过程,包括了打包/解包、序列化/反序列化、发送/接收等通讯细节

RPC和HTTP的关系和区别
很多人喜欢把RPC与HTTP作比较,因为HTTP是web领域最常用的网络通信协议,而RPC也是进行网络通信的方法,并且有一些RPC库还是基于HTTP实现的。在大多数人看来,HTTP已经是比较万能的通信协议了,于是就对RPC的定位感到捉摸不透。
正如开头所说,RPC本身并不是一个具体的协议,而是一种设计,一种通信思想,通讯协议只是其中一部分。
RPC跟HTTP不是对立面,RPC也可以使用HTTP作为通讯协议。
TCP是70年代出来的协议,RPC是80年代出现的,HTTP是90年代才开始流行的。
RPC比HTTP出现的更早。一直以来,都有大量的不同底层实现的RPC库(如早期的DCOM、CORBA,现在的Thrift、Dubbo、Protobuf、gRPC等等)。
但也正因为RPC仅仅是一种思想,所以互联网厂商并没有一种统一的协议可以使用。随着Web的发展,浏览器为了能够与所有的网站服务通信,就需要一个统一的通信标准,于是HTTP就成为了这个通信标准。而且不同于RPC"面向过程"的思想,HTTP以"面向资源"的思想构建Web服务,并大获成功。
区别
-
"服务发现"机制不同。要向某个服务器建立连接,需要知道它的ip和端口。找到服务对应的ip和端口的过程,就是服务发现。
- HTTP 依靠DNS做服务发现。通过域名+DNS解析服务器的ip,默认80端口(如果要用其它端口,可以在服务端做反向代理)
(由于DNS也是服务发现的一种,所以也有基于DNS做服务发现的组件,如CoreDNS) - RPC 一般会有中间件来保存服务的ip和端口,比如consul等"服务发现"中间件,甚至Redis等存储服务。
- HTTP 依靠DNS做服务发现。通过域名+DNS解析服务器的ip,默认80端口(如果要用其它端口,可以在服务端做反向代理)
-
协议不同
- HTTP服务基于HTTP协议,HTTP是应用层协议,是位于TCP协议之上的。相比于TCP使用起来更方便,但效率更低。
另外,HTTP1.1之前是短连接,1.1之后默认是长连接,HTTP2.0又在前者的基础上做了很多改进,性能可能比某些RPC协议还要好。 - RPC通常基于TCP或UDP协议,效率更高,但使用起来更复杂。
TPC是长连接的,UDP是无连接的。
- HTTP服务基于HTTP协议,HTTP是应用层协议,是位于TCP协议之上的。相比于TCP使用起来更方便,但效率更低。
-
传输的内容不同
- HTTP 的设计目的是应用于Web服务,有固定的包格式,包括消息头、消息体。消息体的数据格式以字符串、图片音频文件为主,定制性弱。虽然数据最终都是以二进制的形式传输,但HTTP是应用层协议,只能使用接口提供的的固定的这些数据类型
- RPC 大都是基于TCP/UDP的,包格式由使用者定义,定制型更强、有效数据占比更高,且存储的直接就是二进制数据,用户想要传输什么,转为字节放入即可。
-
应用场景不同
- HTTP多用于B/S,RPC多用于C/S。但现在已经分的没这么清了,因为B/S和C/S在融合,很多软件同时支持多端(比如百度云盘,即支持网页端,还支持手机端和PC端)
- 现在HTTP多用于Web服务端与客户端的通信;RPC多用于服务器各个微服务之间的通讯,以及对延迟和带宽有要求的游戏通信
- HTTP虽然方便,但性能较低。对性能有要求时,就需要直接使用RPC实现通信目的,加快传输效率,例如分布式服务间、游戏C/S端的高效、低延迟的通信需求。
[附]关于REST论文中提到的"HTTP不是RPC"
摘自REST论文
如果想了解这个问题,不得不了解REST。关于REST,我在《【REST系列】详解REST架构风格》中有详细的解释
简单说。HTTP和RPC都是实现网络通信的方式,只是它们对待通信的理解方式有所不同:根据REST的思想得知,HTTP认为的通信是对资源的操作,而RPC认为的通信则是调用远程函数。
更简单地说。HTTP的设计是面向资源的,而RPC的本质是面向过程的。所以严格来说,HTTP确实不属于RPC。
平时我们只会觉得 它们都能传输我们想要传输的数据,而不会深究这些核心思想上的区别,这也无可厚非。
在REST思想中,Web通信实际上是对资源的操作。REST流行之前,Web通信还是以SOAP为主,而SOAP其实就是一个RPC的实现。从最终结果来看,HTTP"面向资源"的思想 在Web领域是成功的。
面向资源和面向过程,就像编程语言中的面向对象和面向过程。HTTP在Web领域的成功,并不能说明RPC思想不好,只能说HTTP比RPC更适合用于Web。它们各有优势,我们应当结合实际情况按需使用
相关文章:
【网络】什么是RPC?RPC与HTTP有什么关系?
文章目录RPC是什么RPC和HTTP的关系和区别[附]关于REST论文中提到的"HTTP不是RPC"重点参考 凤凰架构-远程过程调用 既然有HTTP为什么还要有RPC? RPC是什么 RPC(Remote Procedure Call):即远程过程调用,目的是为了让计算机能够跟调用…...
[手撕数据结构]栈的深入学习-java实现
CSDN的各位uu们你们好,今天千泽带来了栈的深入学习,我们会简单的用代码实现一下栈, 接下来让我们一起进入栈的神奇小世界吧!0.速览文章一、栈的定义1. 栈的概念2. 栈的图解二、栈的模拟实现三.栈的经典使用场景-逆波兰表达式总结一、栈的定义 1. 栈的概念 栈:一种…...
2.线性表的顺序表示
数据结构很重要! 数据结构很重要!!! 数据结构很重要!!!! 思考 1.线性表的顺序表示内容有哪些?(What) 2.为什么要学线性表的顺序表示? ? (Why)…...
eps文件删除了能恢复吗?恢复误删eps文件的三种方法
eps文件格式专为矢量图像和图形而设计。虽然没有被广泛使用,但它仍然受到各种插画家和平面设计师的钟爱。eps文件十分适合创建徽标和商标设计,主要应用见于广告牌、海报和横幅。可是在使用设备过程中,难免会遇到数据丢失问题,如果…...
【C++】运算符重载练习——Date 类
文章目录👉日期类介绍👈👉日期类实现👈📕 成员变量📕 构造函数📕 对应月份天数📕 赋值重载📕 比较运算符重载📕 计算 运算符重载👉源代码…...
Redis学习(13)之Lua脚本【环境准备】
文章目录一 Lua入门环境准备1.1 Lua简介1.2 Linux 系统安装Lua1.2.1 Lua 下载1.2.2 Lua 安装1.3 Hello World1.3.1 命令行模式1.3.2 脚本文件模式1.3.3 两种脚本运行方式1.4 Win安装Lua1.4.1 LuaForWindows的安装1.4.2 SciTE修改字体大小1.4.3 SciTE中文乱码1.4.4 SciTE快捷键工…...
关于BLE的一些知识总结
数据包长度对于BLE4.0/4.1来说,一个数据包的有效载荷最大为20字节对于BLE4.2以上,数据包的有效载荷扩大为251字节传输速率在不考虑跳频间隔的情况下,最大传输速率为:1)BLE4.0/4.1的理论吞吐率为39kb/s;2&am…...
Spring框架源码分析一
如何看源码(方法论)不要忽略源码中的注释使用翻译工具先梳理脉络,然后梳理细节即总分总,先总体过一遍,再看细节,再做一个总结大胆猜测(8分靠猜),小心验证,再调…...
CSS常用内容总结(扫盲)
文章目录前言相关概念【了解】脚本语言什么是脚本语言脚本语言有什么特点常见的脚本语言什么是动态语言,什么是静态语言动态语言和静态语言两者之间有何区别CSSCSS是什么CSS的特点一、CSS代码怎么写基本语法规则引入方式内部样式内联样式表外部样式代码风格二、CSS的…...
Java启蒙之语言基础
目录 一.Java标识符和关键字 1.1Java标识符 1.2Java关键字 二.数据类型和变量的概述和关系 2.1Java变量 2.2Java的数据类型 2.2.1数据类型的分类的概述 2.2.2数据类型的转换 3.Java运算符 总结 😽个人主页:tq02的博客_CSDN博客-领域博主 &#…...
数据库系统--T-SQL数据查询功能-多表查询(超详细/设计/实验/作业/练习)
目录课程名:数据库系统内容/作用:设计/实验/作业/练习学习:T-SQL数据查询功能-多表查询一、前言二、环境与设备三、内容四、内容练习题目:对应题目答案:五、总结课程名:数据库系统 内容/作用:设…...
Spring Boot 3.0系列【14】核心特性篇之Configuration相关注解汇总介绍
有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot版本3.0.3 源码地址:https://gitee.com/pearl-organization/study-spring-boot3 文章目录 前言@Configuration@ConfigurationProperties@EnableConfigurationProperties@ConfigurationPropertiesScan@Configuratio…...
[ubuntu][jetson]给jetson增加swap空间类似于给windows加虚拟内存
具体操作如下: #打开性能模式 sudo nvpmodel -m 0 && sudo jetson_clocks #增加swap空间,防止爆内存 swapoff -a sudo fallocate -l 15G /swapfile sudo chmod 600 /var/swapfile sudo mkswap /swapfile sudo swapon /swapfile…...
小黑子—Java从入门到入土过程:第二章
Java零基础入门2.0Java系列第二章1. 注释和关键字2. 字面量3. 变量3.1 基本用法3.2 使用方式3.3 注意事项4. 变量练习5. 计算机中的数据存储5.1 计算机的存储规则5.2 进制5.3 进制间转换二进制转十八进制转十十六进制转十十进制转其他进制6. 数据类型7. 定义变量的练习8. 标识符…...
ElasticSearch搜索详细讲解与操作
全文检索基础 全文检索流程 流程: #mermaid-svg-7Eg2qFEl06PIEAxZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7Eg2qFEl06PIEAxZ .error-icon{fill:#552222;}#mermaid-svg-7Eg2qFEl06PIEAxZ .error…...
web实现太极八卦图、旋转动画、定位、角度、坐标、html、css、JavaScript、animation
文章目录前言1、html部分2、css部分3、JavaScript部分4、微信小程序演示前言 哈哈 1、html部分 <div class"great_ultimate_eight_diagrams_box"><div class"eight_diagrams_box"><div class"eight_diagrams"><div class&…...
【LeetCode】33. 搜索旋转排序数组、1290. 二进制链表转整数
作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 目录 33. 搜索旋转排序数组 1290. 二进制链表转整数 33. 搜索旋转排序数组 33. 搜索旋转排序…...
IBM Semeru Windows 下的安装 JDK 17
要搞清楚下载那个版本,请参考文章:来聊聊 OpenJDK 和 JVM 虚拟机下载地址semeru 有认证版和非认证版,主要是因为和 OpenJ9 的关系和操作系统的关系而使用不同的许可证罢了,本质代码是一样的。在 Windows 下没有认证版,…...
Lambda表达式和steram流
目录 引言: 语法: Lambda 表达式实例: demo演示: Stream流: 引言: Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。 Lambda 允许把函数作为一个方法的参数(函…...
面试必会-MySQL篇
1. Mysql查询语句的书写顺序Select [distinct ] <字段名称>from 表1 [ <join类型> join 表2 on <join条件> ]where <where条件>group by <字段>having <having条件>order by <排序字段>limit <起始偏移量,行数>2. Mysql查询语…...
深入剖析AI大模型:大模型时代的 Prompt 工程全解析
今天聊的内容,我认为是AI开发里面非常重要的内容。它在AI开发里无处不在,当你对 AI 助手说 "用李白的风格写一首关于人工智能的诗",或者让翻译模型 "将这段合同翻译成商务日语" 时,输入的这句话就是 Prompt。…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...
mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
c# 局部函数 定义、功能与示例
C# 局部函数:定义、功能与示例 1. 定义与功能 局部函数(Local Function)是嵌套在另一个方法内部的私有方法,仅在包含它的方法内可见。 • 作用:封装仅用于当前方法的逻辑,避免污染类作用域,提升…...
