三个小问题带你了解RPC

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通过三个问题了解RPC
一、什么是RPC?
假设有一个计算器接口,Calculator,以及它的实现类CalculatorImpl,我们现在需要实现2+3这个计算,如果是在单机系统里,因为它们都位于同一地址空间,所以直接调用Calculator 的add方法即可。

现在把单机系统改造成分布式系统,把请求方放在Server A里,把具体的实现放在Server B里,因为ServerA、ServerB位于不同的地址空间,不能直接调用,这时候就需要用到远程过程调用,也就是RPC。

总结一下,什么是RPC?简单来说,RPC就是一个场点请求调用的过程位于另一个场点上,它主要用于解决分布式系统中,服务之间的调用问题。

二、RPC是如何实现的?
RPC主要由五个部分组成,分别是客户端、客户端stub、通信网络、服务端stub、服务端。

其中客户端就是服务调用方,客户端stub存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。

服务端Stub接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。

服务端是服务的真正提供者。

如何用程序实现一个简单的RPC?
如果想要自己实现一个RPC,主要就是实现三个技术点,分别是:服务寻址、序列化和反序列化和网络传输。

1.还是以之前计算器的为例,我们如何告诉远程机器我们要调用的是add方法,而不是其他的方法,在本地调用中,函数体是直接通过函数指针来指定的,我们调用add,编译器就自动帮我们调用它相应的函数指针。

但是在远程调用中,两个场点的地址空间不同,函数指针显然是行不通的。

所以在RPC中,给每个函数都赋予了一个ID号,客户端和服务端分别维护一个{函数<--> Call ID} 的对应表。

客户端在远程过程调用时,必须附上这个ID。

服务端也通过查表,来确定客户端需要调用的函数,然后执行相应函数的代码。

2. 客户端怎么把参数值传给远程的函数呢?在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。

在RPC中,由于底层的网络通讯是基于二进制形式的,因此这里Client Stub传给通信网络的数据也必须是二进制的,客户端把参数先转成字节流,传给服务端后,再把字节流转成自己能读取的格式。

这个过程叫序列化和反序列化。

同理,从服务端返回的值也需要序列化反序列化的过程。

3. 远程调用往往用在网络上,客户端和服务端是通过网络连接的。

所有的数据都需要通过网络传输,因此就需要有一个网络传输层。

网络传输层把Call ID和参数字节流传给服务端,然后再把调用结果传回客户端。

网络传输可以用socket实现。

总结一下,用程序实现rpc一个完整的流程就是
三、如何用程序实现一个简单的RPC?
先看一下程序的目录结构,一个client包,一个server包,client里包含了一个请求的类,类里定义了要请求的方法和参数,然后一个rpc接口的实现,负责序列化请求,发送消息,然后将结果反序列化,client里包含的是主函数。

Server里包含了Calculator这个接口及其实现,Server负责将请求序列化,调用本地服务,以及返回序列化结果。

相关文档
最新文档