0%

RMI协议初探

  • 概念引入

    • 底层协议概述

      RPC-远程过程调用,其能通过网络请求远程计算机程序上服务,而不需要了解底层网络技术 TCP/UDP 的协议。其跨越应用层与传输层

      即最终的通讯还是归根到 TCP/UDP 上,但 RPC 的使用允许开发者不需要了解底层网络协议。而 RMI 即是 JavaRPC 实现

      RMI 则集合了 Java 序列化和 JRMP Java 远程方法协议

    • JMS

      Java 消息服务允许应用程序发送消息至消息服务器的某个目的地,再由消息服务器去将其转发给另一个应用程序,而两程序之间可以没有直接的代码关联

    • RMIJMS 的区别

      • 传输方式

        JMS 服务的对象在物理上通过网络在两个 Java 虚拟机之间移动

        RMI 服务的对象则绑定在本地 Java 虚拟机中,只有函数参数和返回值通过网络传输

  • RMI 的底层架构

    • 架构概念

      RMI 为了隐藏网络通信的细节,采用了动态代理,如下:

      客户端与服务端各有一个代理,而代理都由服务端产生,后动态加载给客户端代理

      注意图中客户端/服务端与其代理之间的通信,其总结为下:

      1
      2
      3
      4
      5
      6
      7
      客户端(Client):服务调用方。

      客户端存根(Client Stub):存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。

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

      服务端(Server):服务的真正提供者。

      如果是从反序列化的文章跳转过来的,想必能意识到这里的打包解包实际上就是序列化与反序列化

    • socket 的层执行流程

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      1. server在远程机器上监听一个端口,这个端口是jvm或者os在运行时随机选择的一个端口。也就是说server在远程机器上在这个端口上导出自己。

      2. client并不知道server在哪,以及sever监听哪个端口。但stub知道这些东西(具体看下面),这样client可以调用stub上他想调用的任何方法。

      3. client调用stub上的方法

      4. stub链接server监听的端口并发送参数,详细过程如下:

      4.1 client连接server监听的端口
      4.2 server收到请求并创建一个socket来处理这个连接
      4.3 server继续监听到来的请求
      4.4 使用双方协定的协议,传送参数和结果
      4.5 协议可以是JRMP或者 iiop

      5. 方法在远程server上执行,并发执行结果返回给stub

      6. stub返回结果给client,就好像是stub执行了这个方法一样。
    • RMIRegister

      由上面过程中第二点所指出的,client 在客户端端口位置未知的情况下创建出来的 stub 知道,这就是注册中心 RMIRegister 的作用

      其提供一个有着 public_name-Stub_object 名值对的 hashmap

  • RMI反序列化(代办)