当前位置: 首页 > article >正文

简单说一下什么是RPC

部分内容来源: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

相关文章:

简单说一下什么是RPC

部分内容来源:JavaGuide RPC是什么 RPC是远程调用 RPC的原理 RPC的五个部分 为了能够帮助小伙伴们理解 RPC 原理,我们可以将整个 RPC 的核心功能看作是下面 5 个部分实现的: 客户端(服务消费端):调用…...

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

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

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

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

AWS SDK for Java 1.x 403问题解决方法和原因

问题表现 使用AWS SDK for Java 1.x访问S3,已经确认文件存在,且具有权限,仍然出现403 Forbidden应答。 解决方法 升级到AWS SDK for Java 2.x。 问题原因 AWS签名机制严格依赖请求的精确路径格式,任何URI的差异(如…...

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界面接受到这个事件的时候,刷新一下等级…...

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_conf_t

ngx_conf_t 定义在src/core/ngx_core.h typedef struct ngx_conf_s ngx_conf_t;ngx_conf_s 定义在 src/core/ngx_conf_file.h struct ngx_conf_s {char *name;ngx_array_t *args;ngx_cycle_t *cycle;ngx_pool_t *po…...

gtest 和 gmock讲解

Google Test(gtest)和 Google Mock(gmock)是 Google 开发的用于 C 的测试框架和模拟框架,以下是对它们的详细讲解: Google Test(gtest) 简介 Google Test 是一个用于 C 的单元测试框…...

Ubuntu20.04安装Redis

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

利用 DeepSeek 总结运维知识库的总结报告

一、背景 在运维工作中,知识库是重要的知识沉淀与共享工具。随着公司业务的发展,运维涉及的系统、设备和技术日益复杂,原有的运维知识库内容繁杂、缺乏条理,难以高效检索和利用。为了提升知识库的可用性,我尝试借助 D…...

Go基于协程池的延迟任务调度器

原理 通过用一个goroutine以及堆来存储要待调度的延迟任务,当达到调度时间后,将其添加到协程池中去执行。 主要是使用了chan、Mutex、atomic及ants协程池来实现。 用途 主要是用于高并发及大量定时任务要处理的情况,如果使用Go协程来实现每…...

一个原教旨的多路径 TCP

前面提到过 ECMP 和 TCP 之间的互不友好,pacing 收益和中断开销的互斥,在事实上阻碍了 packet-based LB 的部署,也限制了交换机,服务器的并发性能,同时潜在增加了 bufferbloat 的概率,而适用 packet-based …...

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…...

如何获取mac os 安装盘

发现虚拟机VirtualBox支持Mac虚拟,就想尝试一下。但是发现Mac的安装盘特别难拿到,因此留档。 第一种方法 在mac环境下,使用softwareupdate命令来获取mac安装,能获得当前设备支持的系统。 使用这个命令:/usr/sbin/soft…...

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

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

vue的双向绑定是怎么实现的

Vue.js 的双向绑定是通过 数据劫持(Data Observation) 和 发布-订阅模式(Publish-Subscribe Pattern) 实现的。具体来说,Vue 使用了以下核心技术: 数据劫持:通过 Object.defineProperty 或 Prox…...

在 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…...

如何配置虚拟机的IP上网

要配置虚拟机的IP地址以便上网,你可以按照以下步骤操作: 打开虚拟机软件,确保虚拟机的网络设置为“桥接模式”或“NAT模式”,这样虚拟机可以与物理网络连接。 在虚拟机操作系统中,打开网络设置界面,一般在…...

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

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

Python--内置模块和开发规范(下)

2. 开发规范 2.1 单文件应用 文件结构示例 # 文件注释 import os import jsonDB_PATH "data.json" # 常量放顶部def load_data():"""函数注释:加载数据"""if os.path.exists(DB_PATH):with open(DB_PATH, "r"…...

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

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

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

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

redis序列化设置

redis序列化设置 redis序列化设置序列化对象里有org.joda.time.DateTime1)、报错内容如下2)、解决方案:分别自定义时间的序列化和反序列化,以对象形式关联到redisTemplate redis序列化设置 redis序列化设置,通过自定义…...

Sqlserver安全篇之_TLS的证书概念

证书的理解 参考Sqlserver的官方文档https://learn.microsoft.com/zh-cn/sql/database-engine/configure-windows/certificate-overview?viewsql-server-ver16 TLS(Transport Layer Security)传输层安全和SSL(Secure Sockets Layer)安全套接字层协议位于应用程序协议层和TCP/…...

【HarmonyOS Next】 鸿蒙应用useNormalizedOHMUrl详解

【HarmonyOS Next】 鸿蒙应用useNormalizedOHMUrl详解 一、useNormalizedOHMUrl是什么? useNormalizedOHMUrl指的是是否使用标准化OHMUrl拼接。 在开发过程中,需要根据不同的环境或配置动态生成 URL。例如,在加载一些远程模块或者资源时,…...

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

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

怎么进行mysql的优化?

MySQL 的优化是一个系统性的工作,涉及多个层面,包括查询优化、索引优化、配置优化、架构优化等。以下是一些常见的 MySQL 优化方法: 查询优化 避免全表扫描:确保查询能够使用索引,避免 SELECT *,只选择需要…...

docker-compose方式启动Kafka Sasl加密认证(无zk)

首先参考文档,思考过程可以进行参考https://juejin.cn/post/7294556533932884020#heading-3 用的镜像是Bitnami,对SASL配置进行了简化,需要按照特定格式去配置jass验证 完整配置如下 镜像版本参考:https://hub.docker.com/r/bitn…...

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…...