RMI

Remote Method Invocation:远程方法调用

调用过程

  • Client调用Client Stub上的方法
  • Client Stub将方法和参数进行序列化(编码)成可传输消息体
  • 消息通过网络传输到Server
  • Server Stub将消息进行反序列化(解码)
  • Server根据解码结果调用方法,并将结果返回给Server Stub
  • Server Stub对返回结果进行序列化(编码)成可传输消息体
  • 消息网络传输到Client
  • Client Stub对消息进行反序列化(解码)
  • Client Stub将解码结果返回给Client

RPC

Remote Procedure Call:远程过程调用

框架组成

  • 客户端(Client):服务调用方
  • 客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端
  • 服务端存根(Server Stub):接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理
  • 服务端(Server):服务的真正提供者
  • Network Service:底层传输,可以是 TCP 或 HTTP

调用过程

  • Client通过本地调用的方式调用服务
  • Client Stub接收到调用请求后负责将方法、参数等编码成可传输消息体
  • Client Stub找到远程的服务地址,并且将消息通过网络发送给Server
  • Server Stub收到消息后进行解码操作
  • Server Stub根据解码结果调用本地的服务进行相关处理
  • Server进行业务逻辑处理
  • Server将处理结果返回给Server Stub
  • Server Stub将返回结果进行编码
  • Server Stub将结果通过网络发送至消费方
  • Client Stub接收到消息,并进行解码
  • Client得到最终结果

核心功能

  • 服务寻址
  • 数据流的序列化和反序列化
  • 网络传输

RPC VS PMI

不同点:

(1)方法调用方式不同

RMI中是通过在客户端的Stub对象作为远程接口进行远程方法的调用。每个远程方法都具有方法签名。如果服务器上添加了一个可执行方法,但是没有相匹配的签名被添加到这个远程接口Stub对象上,那么这个新方法就不能被客户端调用。RPC是通过网络服务协议向远程主机发送请求,请求包含了一个参数集和文本值,通常形成”classname.methodname”的形式,服务器就去搜索与之相匹配的类和方法,找到后就执行方法并把结果编码,通过网络协议返回。

(2)使用语言范围不同

RMI是J2EE的13大规范之一,只适用于Java;RPC是网络协议,与操作系统和语言无关。

(3)调用结果的返回形式不同

RMI的调用结果可以是Java的对象类型或者基本数据类型;RPC的调用结果统一由外部数据表示。