1、基本定义
RPC(Remote Procedure Call) 即远程过程调用。主要作用是屏蔽网络编程细节,实现调用远程方法就像调用本地方法(同一个进程中的方法)一样的体验。同时屏蔽底层网络通信的复杂性,让我们更加专注业务逻辑的开发。
2、RPC通信
RPC是一个远程调用,肯定是需要跨服务器而非本机,所以需要网络编程才能实现,这就带来了以下几个问题:
Call ID 映射
在本机的函数调用中,函数体是直接通过函数指针来指定的,当函数调用时,编译器会自动调用相应的函数指针。
但是在远程调用中,因为是跨服务器的,两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有一个自己的ID,这个ID在所有的进程中都是唯一确定的。
客户端在远程调用时,需要带上这个ID。同时我们需要在客户端和服务端分别维护一个{ 函数 <-> Call ID}的映射表。 两端的表可以不需要完全相同,但是相同函数对应的Call ID必须相同。
当客户端需要远程调用的时候,就需要查一下此表,查询出对应的Call ID , 传输至服务端,服务端也查询映射表,来确定客户端需要调用的函数,最终执行相应的函数代码。
序列化和反序列化
网络传输的数据必须是二进制数据,但是调用方的请求的出入参数都是对象,对象是不能直接在网络中传输的,必须提前把它转换成可传输的二进制数据,这个过程就叫做“序列化”。
服务端必须要做到的是能够正确的从网络传输过来的二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的数据还原为请求对象,这个过程叫做“反序列化”。
在RPC调用中,对输入参数对象与返回值对象进行序列化和反序列化是一个必须的过程。
网络通信
RPC在大多数情况下,是一个高并发的调用场景,根据系统内核的支持、编程语言的支持以及IO模型本身的特点,在RPC框架的实现中,在网络通信的处理上,大多数会选择 IO多路复用的方式。
原文链接:https://blog.csdn.net/hero_java/article/details/116698182