在 这 里 插 播 一 条 关 于 RPC 的 简 介 :
RPC(Remote Procedure Call Protocol) : 远 程 过 程 调 用 :
两台服务器 A、B,分别部署不同的应用 a,b。当 A 服务器想要调用 B 服务器上
应用 b 提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需
要 通 过 网 络 来 表 达 调 用 的 语 义 传 达 调 用 的 数 据 。
说白了,就是你在你的机器上写了一个程序,我这边是无法直接调用的,这个
时候就出现了一个远程服务调用的概念。
RPC 是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序之间携带信息数据。在
OSI 网络通信模型中,RPC 跨越了传输层和应用层。RPC 使得开发包括网络分布式多程序
在 内 的 应 用 程 序 更 加 容 易 。
RPC 采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务
器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信
息。在服务器端,进程保持睡眠状态直到调用信息到达为止。当一个调用信息到达,服务
器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调
用进程接收答复信息,获得进程结果,然后调用执行继续进行。
RPC 需 要 解 决 的 问 题 :
(可以稍作了解,详情可查看别的博文)
通讯问题 : 主要是通过在客户端和服务器之间建立 TCP 连接,远程过程调
用的所有交换的数据都在这个连接里传输。连接可以是按需连接,调用结
束后就断掉,也可以是长连接,多个远程过程调用共享同一个连接。
寻址问题 : A 服务器上的应用怎么告诉底层的 RPC 框架,如何连接到 B
服务器(如主机或 IP 地址)以及特定的端口,方法的名称名称是什么,这
样才能完成调用。比如基于 Web 服务协议栈的 RPC,就要提供一个
endpoint URI,或者是从 UDDI 服务上查找。如果是 RMI 调用的话,还需
要一个 RMI Registry 来注册服务的地址。
序列化 与 反序列化 : 当 A 服务器上的应用发起远程过程调用时,方法的
参数需要通过底层的网络协议如 TCP 传递到 B 服务器,由于网络协议是基
于二进制的,内存中的参数的值要序列化成二进制的形式,也就是序列化
(Serialize)或编组(marshal),通过寻址和传输将序列化的二进制发送
给 B 服务器。
同理,B 服务器接收参数要将参数反序列化。B 服务器应用调用自己的方
法处理后返回的结果也要序列化给 A 服务器,A 服务器接收也要经过反序
列化的过程。