什么是RPC

server/2024/10/25 11:29:55/

什么是RPC

RPC的全称是Remote Procedure Call,即远程过程调用,是一种计算机通信协议。它允许程序在不同计算机之间进行通信和交互,就像本地调用一样。简单解读字面上的意思,远程是指要跨机器而非本机,所以需要用到网络编程才能实现。

为什么要用RPC

RPC的作用就是体现在这样两个方面:

  • 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;
  • 隐藏底层网络通信的复杂性,让我们更专注于业务逻辑。

RPC通信流程

发起调用请求的那一方叫做调用方,被调用的一方叫做服务提供方。

为了实现这个目标,就需要在RPC框架里面对整个通信细节进行封装

RPC是一个远程调用,是需要通过网络来传输数据,并且RPC常用于业务系统之间的数据交互,需要保证其可靠性,所以RPC一般默认采用TCP来传输。常用的HTTP协议也是建立在TCP之上的。

网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是肯定没法直接在网络中传输的,需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程一般叫做“序列化”。

调用方持续地把请求参数序列化成二进制后,经过TCP传输给了服务提供方。服务提供方从TCP通道里面收到二进制数据。那如何知道一个请求的数据到哪里结束,是一个什么类型的请求呢?

答:把数据格式的约定内容叫做“协议”。大多数的协议会分成两部分,分别是数据头和消息体。数据头一般用于身份识别,包括协议标识、数据大小、请求类型、序列化类型等信息;消息体主要是请求的业务参数信息和扩展属性等。

根据协议格式,服务提供方就可以正确地从二进制数据中分割出不同的请求来,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象。这个过程叫作“反序列化”。
在这里插入图片描述

服务提供方再根据反序列化出来的请求对象找到对应的实现类,完成真正的方法调用,然后把执行结果序列化后,回写到对应的TCP通道里面。调用方获取到应答的数据包后,再反序列化成应答对象,这样调用方就完成了一次RPC调用。

上述流程比较复杂,对研发人员需要掌握太多RPC底层细节,整体不太友好。

可以采用动态代理的技术简化上述流程,通过字节码增强对方法进行拦截增强,以便于增加需要的额外处理逻辑。

服务提供者给出业务接口声明,在调用方的程序里面,RPC框架根据调用的服务接口提前生成动态代理实现类,并通过依赖注入等技术注入到声明了该接口的相关业务逻辑里面。该代理实现类会拦截所有的方法调用,在提供的方法处理逻辑里面完成一整套的远程调用,并把远程调用结果返回给调用方,这样调用方在调用远程方法的时候就获得了像调用本地接口一样的体验。

整个调用流程如下:

image-20241020211325576


http://www.ppmy.cn/server/134703.html

相关文章

在 typescript 中,如何封装一个 class 类来接收接口的响应数据

在 TypeScript 中,封装一个类来接收接口的响应数据是一个常见的需求,特别是在处理后端 API 响应时。这通常涉及到定义与后端 API 响应结构相匹配的接口(或类型),并在类中创建方法来处理这些数据。以下是一个简单的示例…

理解dbt artifacts及其实际应用

dbt是数据分析领域的一种变革性工具,它使数据专业人员能够对仓库中的数据进行转换和建模。它的强大功能之一是生成dbt artifacts:dbt运行的结构化输出,提供对dbt项目及其操作的深入了解。 dbt 构件介绍 dbt构件是每次dbt运行时生成的JSON文…

Excel功能区变灰是什么原因造成?怎么解决?

Microsoft Excel是广泛使用的电子表格软件,但有时用户可能会遇到功能区变灰的问题,这可能导致功能无法使用,影响工作效率和用户体验。本文将深入探讨Excel功能区灰色的原因及解决方案,帮助读者快速解决这一问题。 一、Excel功能区…

计算机毕业设计 基于Python的校园个人闲置物品换购平台的设计与实现 Python毕业设计 Python毕业设计选题【附源码+安装调试】

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

STM32G4系列MCU的启动项配置

目录 概述 1 配置方法 1.1 配置类型 1.2 启动模式类别 1.3 注意点介绍 2 应用案例介绍 2.1 主内存启动模式 2.2 GPIO配置启动模式 2.3 注意点介绍 3 物理内存映射 3.1 映射内存类别 3.2 注意点介绍 概述 本文主要介绍STM32G4系列MCU的启动项配置功能,包…

使用Redisson的布隆过滤器解决缓存穿透问题

使用Redisson实现缓存穿透的布隆过滤器示例 以下是一个使用Redisson库的RBloomFilter来解决缓存穿透问题的Java代码示例。在这个示例中,我们会通过布隆过滤器预先过滤无效的请求,以减少对数据库的压力。 代码示例 首先,确保在项目中引入Re…

vscode使用make编译c的问题

问题1:makefile:2: *** missing separator. Stop vscode的配置问题,看这哥们的文章即可:https://blog.csdn.net/m0_57464986/article/details/134220676 问题2:创建makefile文件 直接创建文件名为“makefile”的文件即可&#x…

Linux 命令—— ping、telnet、curl、wget(网络连接相关命令)

文章目录 网络连接相关命令pingtelnetcurlwget 网络连接相关命令 ping ping 命令是用于测试网络连接和诊断网络问题的工具。它通过向目标主机发送 ICMP(Internet Control Message Protocol)回显请求,并等待回复,以确定目标主机是…