当前位置:网站首页>RPC协议详解
RPC协议详解
2022-07-05 18:13:00 【敲代码的小小酥】
一、什么是RPC协议
远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
具体的调用过程为:
1.服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务;
2.客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体;
3.客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端;
4.服务端存根(server stub)收到消息后进行解码(反序列化操作);
5.服务端存根(server stub)根据解码结果调用本地的服务进行相关处理;
6.本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub);
7.服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方;
8.客户端存根(client stub)接收到消息,并进行解码(反序列化);
9.服务消费方得到最终结果;
而RPC框架的实现目标则是将上面的第2-9步完好地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感觉上像调用本地服务一样的调用远程服务。
二、实现RPC需要解决的问题
通信问题
远程调用,肯定两个机器之间需要通信。主要是通过在客户端和服务器之间建立TCP连接,远程过程调用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
通常这个连接可以是按需连接(需要调用的时候就先建立连接,调用结束后就立马断掉),也可以是长连接(客户端和服务器建立起连接之后保持长期持有,不管此时有无数据包的发送,可以配合心跳检测机制定期检测建立的连接是否存活有效),多个远程过程调用共享同一个连接。
服务寻址
上面提到,RPC是面向本地调用。那么用户进行了本地调用,如何找到对应的远程调用,需要RPC底层进行实现。需要管理ip,端口,服务列表等信息。常见的是使用zookeeper来进行管理。
对生产者而言:
服务启动的时候,将自己提供的服务注册到注册中心;
生产者挂掉时,注册中心注销停止的服务;
生产者定时向注册中心发送心跳,如果心跳异常,注册中心也注销生产者服务。
对消费者而言:
订阅注册中心的服务,获取ip,端口等服务信息;
当生产者上线下线时,注册中心会通知调用者;
服务下线后,消费者不再消费该服务。
网络传输
当A机器上的应用发起一个RPC调用时,调用方法和其入参等信息需要通过底层的网络协议如TCP传输到B机器,由于网络协议是基于二进制的,所有我们传输的参数数据都需要先进行序列化(Serialize)或者编组(marshal)成二进制的形式才能在网络中进行传输。然后通过寻址操作和网络传输将序列化或者编组之后的二进制数据发送给B机器。
当B机器接收到A机器的应用发来的请求之后,又需要对接收到的参数等信息进行反序列化操作(序列化的逆操作),即将二进制信息恢复为内存中的表达方式,然后再找到对应的方法(寻址的一部分)进行本地调用(一般是通过生成代理Proxy去调用,通常会有JDK动态代理、CGLIB动态代理、Javassist生成字节码技术等),之后得到调用的返回值。
服务调用
B机器进行本地调用(通过代理Proxy和反射调用)之后得到了返回值,此时还需要再把返回值发送回A机器,同样也需要经过序列化操作,然后再经过网络传输将二进制数据发送回A机器,而当A机器接收到这些返回值之后,则再次进行反序列化操作,恢复为内存中的表达方式,最后再交给A机器上的应用进行相关处理,一般是业务逻辑处理操作。
三、RPC 与 REST 的区别?
RPC 与 REST 最大的区别就在于 RPC 提供了更好的抽象,RPC 甚至将网络传输细节彻底隐藏了,而 REST 没有。具体来说,REST 至少要求用于提供 URL 以及请求参数,而 RPC 隐藏了与网络传输的相关实现细节。另一方面,RPC 可以基于任何网络通信协议,而 REST 通常基于 HTTP(或者 HTTPS)协议。RPC 调用者并不会关心具体的协议是:HTTP、TCP 还是其他任何自定义协议。
四、优缺点
优点:
帮助客户端通过传统使用高级语言的过程调用与服务器进行通信。
可以在分布式环境以及本地环境中使用。
支持面向进程和面向线程的模型。
对用户隐藏内部消息传递机制。
只需极少的努力即可重写和重新开发代码。
提供抽象,即对用户隐藏网络通信的消息传递性质。
省略许多协议层以提高性能。
缺点:
客户端和服务器对各自的例程使用不同的执行环境,并且资源(例如,文件)的使用也更加复杂。因此,RPC 系统并不总是适合传输大量数据。
RPC 非常容易发生故障,因为它涉及通信系统,另一台计算机和另一个进程。
RPC 没有统一的标准;它可以通过多种方式实现。
RPC 只是基于交互的,因此,在硬件架构方面,它不提供任何灵活性。
边栏推荐
- About statistical power
- 消除`if()else{ }`写法
- [paddlepaddle] paddedetection face recognition custom data set
- The 10th global Cloud Computing Conference | Huayun data won the "special contribution award for the 10th anniversary of 2013-2022"
- VC编程入门浅谈「建议收藏」
- 关于服装ERP,你想知道的都在这里了
- 星环科技数据安全管理平台 Defensor重磅发布
- EasyCVR平台通过接口编辑通道出现报错“ID不能为空”,是什么原因?
- Vulnhub's darkhole_ two
- Thoroughly understand why network i/o is blocked?
猜你喜欢

Use JMeter to record scripts and debug

Fix vulnerability - mysql, ES

Nanjing University: Discussion on the training program of digital talents in the new era

Sophon kg upgrade 3.1: break down barriers between data and liberate enterprise productivity

Thoroughly understand why network i/o is blocked?

How to obtain the coordinates of the aircraft passing through both ends of the radar

The 10th global Cloud Computing Conference | Huayun data won the "special contribution award for the 10th anniversary of 2013-2022"

隐私计算助力数据的安全流通与共享

分享:中兴 远航 30 pro root 解锁BL magisk ZTE 7532N 8040N 9041N 刷机 刷面具原厂刷机包 root方法下载

Memory management chapter of Kobayashi coding
随机推荐
nacos -分布式事务-Seata** linux安装jdk ,mysql5.7启动nacos配置ideal 调用接口配合 (保姆级细节教程)
Introduction to Resampling
彻底理解为什么网络 I/O 会被阻塞?
【PaddleClas】常用命令
U-Net: Convolutional Networks for Biomedical Images Segmentation
Gimp 2.10 tutorial "suggestions collection"
检查命名空间和类
New words new words new words new words [2]
ClickHouse(03)ClickHouse怎么安装和部署
Let more young people from Hong Kong and Macao know about Nansha's characteristic cultural and creative products! "Nansha kylin" officially appeared
模拟百囚徒问题
jdbc读大量数据导致内存溢出
nano的CAN通信
【在優麒麟上使用Electron開發桌面應】
Record a case of using WinDbg to analyze memory "leakage"
Huaxia Fund: sharing of practical achievements of digital transformation in the fund industry
About statistical power
图扑软件数字孪生 | 基于 BIM 技术的可视化管理系统
Nanjing University: Discussion on the training program of digital talents in the new era
项目中遇到的问题 u-parse 组件渲染问题