简单说一下什么是RPC

news2025/3/2 1:00:59

部分内容来源:JavaGuide 


RPC是什么

RPC是远程调用 


RPC的原理

RPC的五个部分

为了能够帮助小伙伴们理解 RPC 原理,我们可以将整个 RPC 的核心功能看作是下面 5 个部分实现的:

  1. 客户端(服务消费端):调用远程方法的一端
  2. 客户端 Stub(桩):这其实就是一代理类。代理类主要做的事情很简单,就是把你调用方法、类、方法参数等信息传递到服务端。
  3. 网络传输:网络传输就是你要把你调用的方法的信息比如说参数啊这些东西传输到服务端,然后服务端执行完之后再把返回结果通过网络传输给你传输回来。网络传输的实现方式有很多种比如最基本的 Socket 或者性能以及封装更加优秀的 Netty(推荐)。
  4. 服务端 Stub(桩):这个桩就不是代理类了。我觉得理解为桩实际不太好,大家注意一下就好。这里的服务端 Stub 实际指的就是接收到客户端执行方法的请求后,去执行对应的方法然后返回结果给客户端的类。
  5. 服务端(服务提供端):提供远程方法的一端

RPC原理图

服务端(client):以本地调用方式调用远程服务

客户端Stub(client stub):接收到调用后负责将方法,参数等封装成网络信息传输的消息体(序列化):RpcRequest

客户端Stub(clint stub):找到远程服务的地址,并将信息发送到服务提供端

服务端Stub(桩):收到信息后将消息反序列化成Java对象:RpcRequest

服务端Stub(桩):根据RpcRequest中的类,方法,方法参数等信息调用本地的方法

服务端Stub(桩):将结果封装成网络传输的消息体:RpcResponse(序列化)发送到消费端

客户端Stub(clint stub):接收到消息并将消息反序列化成Java对象:RpcResponse,这样就得到了最终结果


RPC理解误区 

我们总是会把RPC想成是目前的协议减重,例如HTTP里面减少一些东西实现我们的轻量级调用

但是其实我们也可以往协议里面新增一些东西

因为RPC只是一个远程调用,并不一定说是轻量级的远程调用吗,我们可以往调用协议里面添加多一些自己的东西


有什么常见的RPC框架 

Dubbo:作为一款高性能且轻量级的开源 RPC 框架,在国内互联网领域应用广泛,拥有完善的服务治理体系。

Motan:适用于 Java 的高性能 RPC 框架,具备良好的扩展性与稳定性,能满足多种业务场景需求。

gRPC:由 Google 开发的开源跨语言 RPC 框架,基于 HTTP/2 标准构建,在性能和效率上表现卓越。

Thrift:Facebook 推出的开源跨语言 RPC 框架,借助其多语言代码生成器,轻松实现不同语言间的服务调用。

OpenFeign:Spring Cloud 生态中的声明式 Web 服务客户端,简化了微服务间的调用,与 Spring Cloud 组件高度集成


HTTP和RPC

RPC属于网络协议的哪一层

四层网络协议:应用层,传输层,网络层,网络接口层

我们一般会在传输层指定我们是用TCP传输还是UDP传输

TCP是传输层的协议,而基于TCP造出来的HTTP和各类RPC协议

定义了不同消息格式的应用层协议


RPC本身并不是一个具体的协议,而是一种调用方式

而 RPC(Remote Procedure Call)又叫做远程过程调用,它本身并不是一个具体的协议,而是一种调用方式

举个例子,我们平时调用一个本地方法就像下面这样

res = localFunc(req)

如果现在这不是个本地方法,而是个远端服务器暴露出来的一个方法 remoteFunc,如果我们还能像调用本地方法那样去调用它,这样就可以屏蔽掉一些网络细节,用起来更方便,岂不美哉?

res = remoteFunc(req)


RPC 可以像调用本地方法那样调用远端方法

虽然大部分的RPC底层协议使用了TCP,然实际上不一定要使用TCP,改用UDP或者HTTP也可以实现类似的功能


纯裸TCP会有什么问题

 

TCP的三个特点

面向连接

可靠

基于字节流

字节流

纯裸TCP是没有任何边界的,你根本不知道到哪个地方才算是一条完整的消息

这个就是所谓的黏包问题

纯裸TCP是不能拿来直接使用的

我们需要加入一些自定义规则,用来区分边界

消息头和消息体

我们在消息头里面写清楚一个完整的包的长度是多少,然后根据这个长度接收数据,

截取出来后他们就是我们真正要传输的消息体

消息头里面还可以放一些其他东西,例如消息体是否被压缩过,或者消息体的格式之类的

这就是所谓的协议

所以基于TCP就衍生了非常多的协议,比如HTTP和RPC


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

因为HTTP其实是一种规定的,通用的协议,是一个统一的标准

如果是一些自己研发的软件,那么就可以自家造的RPC协议,连上自己公司服务器就OK了

例如某个软件又要支持网页,又要支持pc和手机,如果我们通信协议都用RPC,那是不现实的

所以我们的HTTP协议相当于我们的一个统一的规范


HTTP和RPC的区别

服务发现

服务发现:找到IP地址和端口

HTTP中,你知道域名,就可以通过DNS服务去解析得到它背后的IP地址,默认80端口

RPC:需要一些中间服务区保存服务名和IP信息

例如ConsulEtcd,Nacos,Zookeeper甚至是Redis

由于DNS也是服务发现的一种,所以也有基于DNS去做服务发现的组件,比如CoreDNS


底层连接形式

HTTP1.1在底层TCP连接之后,会一直保持这个连接,以后的请求和响应都会复用这条连接

RPC,也是通过TCP长连接进行数据交互,不同的地方在于,RPC协议一般还会再创建一个线程池

请求量大的时候,建立多条连接放到池内,要发数据的时候就从池里取一条连接出来,用完放回去,下次再复用

一个是复用连接,一个是使用连接池

连接池有利于提升网络请求性能


传输的内容

序列化:结构体转为二进制数组

反序列化:二进制数组转为结构体

HTTP1.1叫超文本协议,支持音频视频

但HTTP设计初是用于做页面文本展示的,所以传的内容以字符串为主

Body这块,它使用JSON来序列化结构体数据

传输的内容冗余,例如我们都规定好了头部的第几位是Content-Type,就不需要每次都把这个字段传过来


为啥大部分公司内部微服务中抛弃了HTTP,选择使用RPC 

1. 可以使用体积更小的Protobuf或者其他序列化协议,去保存结构体数据

2.不需要像HTTP那样考虑各种服务器的行为,例如302重定向(没有定义非常多的标准和规则,因为公司内部软件,遇到的情况没那么多)

所以性能会更好一些


为什么有了HTTP2还要有RPC协议 

HTTP2的性能比大部分RPC协议都好,那为什么还有RPC协议呢?

因为HTTP2是2015年出来的,在这之前为了优化和避免一些HTTP1的问题,我们就有了RPC

后面HTTP2,HTTP3等出现后大部分公司用RPC的就少了一点


总结

HTTP和各类RPC协议就是在TCP协议上定义的应用层协议

RPC本质上不算是协议,而是一种调用方式

RPC比HTTP出现的要,所以大部分公司内部还在使用RPC

HTTP2.0在HTTP1.1的基础上做了优化,性能比很多的RPC协议要好,但是由于近几年才出来,所以也不太可能取代掉RPC

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

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

相关文章

Pany-v2:LFI漏洞探测与敏感文件(私钥窃取/其他)自动探测工具

地址:https://github.com/MartinxMax/pany 关于Pany-v2 Pany-v2 是一款 LFI(本地文件包含)漏洞探测工具,具备自动识别敏感文件的能力。它能够利用 LFI 漏洞检测并提取 id_rsa 私钥、系统密码文件以及其他可能导致安全风险的敏感信息。该工具…

北京大学DeepSeek与AIGC应用(PDF无套路下载)

近年来,人工智能技术飞速发展,尤其是大模型和生成式AI(AIGC)的突破,正在重塑各行各业的生产方式与创新路径。 北京大学联合DeepSeek团队推出的内部研讨教程《DeepSeek与AIGC应用》,以通俗易懂的方式系统解…

Vue进阶之Vue2源码解析

Vue2源码解析 源码解析目录解析package.json入口查找入口文件确定vue入口this.\_init_ 方法$mount 挂载方法Vue.prototype._renderVue.prototype._updateVue.prototype._patch vue2 vue3 源码解析 目录解析 vue2.6之后的版本都做的是兼容Vue3的内容,2.6版本前的内…

unity lua属性绑定刷新

我们现在有一个 角色属性类叫heroModel,内容如下,当heroModel中的等级发生变化的时候,我们需要刷新界面显示等级信息,通常我们是在收到等级升级成功的协议的时候,发送一个事件,UI界面接受到这个事件的时候,刷新一下等级…

Ubuntu20.04安装Redis

目录 切换到root用户 使用 apt install redis 安装redis 修改配置文件 ​编辑 重新启动服务器 使用Redis客户端连接服务器 切换到root用户 如果没有切换到root用户的,切换到root用户。 使用 apt install redis 安装redis 遇到y/n直接y即可。 redis安装好之…

OSPF BIT 类型说明

注:本文为 “OSPF BIT 类型 | LSA 类型 ” 相关文章合辑。 机翻,未校。 15 OSPF BIT Types Explained 15 种 OSPF BIT 类型说明 Rashmi Bhardwaj Distribution of routing information within a single autonomous system in larger networks is per…

【深度学习】强化学习(RL)-A3C(Asynchronous Advantage Actor-Critic)

A3C(Asynchronous Advantage Actor-Critic)详解 A3C(Asynchronous Advantage Actor-Critic) 是 深度强化学习(Deep Reinforcement Learning, DRL) 领域的重要算法,由 DeepMind 在 2016 年提出。…

在 Mac mini M2 上本地部署 DeepSeek-R1:14B:使用 Ollama 和 Chatbox 的完整指南

随着人工智能技术的飞速发展,本地部署大型语言模型(LLM)已成为许多技术爱好者的热门选择。本地部署不仅能够保护隐私,还能提供更灵活的使用体验。本文将详细介绍如何在 Mac mini M2(24GB 内存)上部署 DeepS…

docker-compose部署onlyoffice8.3.0并支持ssl,且支持通过nginx代理,关闭JWT配置

编写docker-compose文件 mkdir -p /data/onlyoffice && echo "version: 3services:onlyoffice:container_name: OnlyOfficeimage: onlyoffice/documentserver:8.3.0restart: alwaysports:- 8088:80- 64431:443environment:TZ: Asia/ShanghaiJWT_ENABLED: falsevol…

【tplink】校园网接路由器如何单独登录自己的账号,wan-lan和lan-lan区别

老式路由器TPLINK,接入校园网后一人登录,所有人都能通过连接此路由器上网,无法解决遂上网搜索,无果,幸而偶然看到一个帖子说要把信号源网线接入路由器lan口,开启新世界。 一、wan-lan,lan-lan区…

DeepSeek开源周Day5压轴登场:3FS与Smallpond,能否终结AI数据瓶颈之争?

2025年2月28日,DeepSeek开源周迎来了第五天,也是本次活动的收官之日。自2月24日启动以来,DeepSeek团队以每天一个开源项目的节奏,陆续向全球开发者展示了他们在人工智能基础设施领域的最新成果。今天,他们发布了Fire-F…

[密码学实战]Java实现SM2数字信封(结合SM4对称加密)生成与解析

一、代码运行结果 二、什么是数字信封 2.1 基本概念 数字信封(Digital Envelope) 是一种结合对称加密与非对称加密的混合加密技术,通过以下步骤实现高效安全的数据传输: 对称加密:使用SM4算法加密原始数据,处理速度快,适合大数据量。非对称加密:使用SM2公钥加密SM4密…

Oracle 查询表空间使用情况及收缩数据文件

本文介绍Oracle收缩数据文件的相关操作,运维工作中有时会需要通过收缩数据文件来释放磁盘空间。 数据文件初始化方式: 1.我们创建表空间一般有两种方式初始化其数据文件,即指定初始大小为32G(很大的值)或指定初始大小为…

Grafana接入Zabbix数据源

1. 对接 Zabbix 1.1 安装 Zabbix 插件 在线安装&#xff1a; 1.2 配置 Zabbix 数据源 点击 Configuration > Data Sources > Add data source。选择 Zabbix&#xff0c;填写&#xff1a; URL&#xff1a;http://<zabbix-server>/api_jsonrpc.phpUsername&#x…

华为在不同发展时期的战略选择(节选)

华为在不同发展时期的战略选择&#xff08;节选&#xff09; 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 来源&#xff1a;谢宁专著《华为战略管理法&#xff1a;DSTE实战体系》。本文有节选修改。 导言 从目前所取得的成就往回看&#xff0c;华为…

lua基础语法学习

lua基础语法学习 文章目录 lua基础语法学习1. 基础2. 输入输出3. 分支结构与循环结构4. 函数5. 元表与元方法6. 面向对象 1. 基础 注释 --单行注释--[[ 多行注释 --]]标识符 标识符以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上 0 个或多个字母&#xff0c;下划线&…

【个人开发】deepspeed+Llama-factory 本地数据多卡Lora微调【完整教程】

文章目录 1.背景2.微调方式2.1 关键环境版本信息2.2 步骤2.2.1 下载llama-factory2.2.2 准备数据集2.2.3 微调模式2.2.3.1 zero-1微调2.2.3.2 zero-2微调2.2.3.3 zero-3微调2.2.3.4 单卡Lora微调 2.2.4 实验2.2.4.1 实验1&#xff1a;多GPU微调-zero12.2.4.2 实验2&#xff1a;…

【SpringBoot】数据访问技术spring Data、 JDBC、MyBatis、JSR-303校验

Spring Boot 数据访问技术及特性 目录标题 Spring Boot 数据访问技术及特性摘要1. 引言2. Spring Data架构与原理2.1 Spring Data概述2.2 Spring Data核心组件2.3 Spring Boot与Spring Data的集成机制 3. Spring Boot与JDBC的整合3.1 JDBC整合流程3.2 数据源自动配置3.3 JdbcTe…

手机放兜里,支付宝“碰一下”被盗刷?

大家好&#xff0c;我是小悟。 近期&#xff0c;网络上关于“支付宝‘碰一下’支付易被盗刷”的传言甚嚣尘上&#xff0c;不少用户对此心生疑虑。 首先&#xff0c;要明确一点&#xff1a;“碰一下”支付并不会像某些传言中所描述的那样容易被隔空盗刷。这一观点已经得到了支付…

vue框架后遗症∶被遗忘的dom操作

用多了vue、react等前端框架&#xff0c;不得不说用数据驱动视图来开发真的很香&#xff0c;但是也免不了会有不用这些框架的项目&#xff0c;dom操作还是很有必要的&#xff0c;一开始学习网页设计的时候就教过&#xff0c;后面一直开发项目基本上用框架。虽然有些想不起来了&…