一、什么是RPC
RPC:远程过程调用。从一台客户端上通过参数传递的方式调用另一台服务器上的一个函数或方法,并得到返回的结果。
- 客户端发起请求,服务端返回响应,RPC在使用形式上像调用本地函数一样去调用远程的函数。
- 需要把数据转换为字节流,传给服务端,再把字节流转换成自己能够读取的格式。
二、RPC组成部分
- 客户端(Client) :服务调用方。
- 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
- 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
- 服务端(Server):服务的真正提供者。
- 网络传输模块(Network Service):底层传输,可以是TCP或HTTP。
三、RPC调用流程
RPC框架包含三个重要组件,分别是客户端、服务端和注册中心。交互过程如下:
- 服务端在启动后,会将它提供的服务列表发布到注册中心,客户端向注册中心订阅服务地址;
- 客户端会通过本地代理模块Proxy调用服务端,Proxy模块收到负责将方法、参数等数据转化成网络字节流;
- 客户端从服务列表中选取其中一个的服务地址,并将数据通过网络发送给服务端;
- 服务端接收到数据后进行解码,得到请求信息;
- 服务端根据解码后的请求信息调用对应的服务,然后将调用结果返回给客户端。
四、功能实现
实现功能主要为服务寻址、序列化和反序列化、网络传输。
服务寻址
RPC中所有函数或方法都有自己的ID,在所有进程中都唯一。客户端在做远程过程调用时,必须附上这个ID,即客户端会查一下表,找出相应的Call ID,然后传给服务端,服务端也会查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
序列化和反序列化
- 序列化:将消息对象转换为二进制流。
- 反序列化:将二进制流转换为消息对象。
远程的数据传输,由于客户端和服务端不在同一个服务器上,涉及不同的进程,不能通过内存传递参数,此时就需要将客户端先将请求参数转成字节流(编码),传递给服务端,服务端再将字节流转为自己可读取格式(解码),这就是序列化和反序列化的过程。反之,服务端返回值也逆向经历序列化和反序列化到客户端。