一、定义

RMI: 远程方法调用(Remote Method Invocation),它支持存储于不同地址空间的程序级对象之间彼此进行通信,实现远程对象之间的无缝远程调用。
Java RMI: 用于不同虚拟机之间的通信,这些虚拟机可以在不同的主机上、也可以在同一个主机上;一个虚拟机中的对象调用另一个虚拟上中的对象的方法,只不过是允许被远程调用的对象要通过一些标志加以标识,底层是通过Socket通信来进行实现的。

代码使用可参考  https://www.jianshu.com/p/de85fad05dcb

二、RMI 主要组件

 

三、RMI远程调用步骤

RMI的交互图(借鉴网上已有的图)

四、如何开启RMI Registry服务

  • 进入JAVA_HOME/bin/,双击打开rmiregistry.exe,此时默认注册端口为1099,也可以在命令行指定端口去运行rmiregistry.exe  port 或者 rmiregistry  port。
  • java程序中使用API创建registry服务,LocateRegistry.createRegistry(port)。

五、RMI服务调用时序图

(借鉴网上已有的图)

六、RMI类调用时序图

  • Server发布服务类调用

  • Registry服务类调用

  • Client订阅服务类调用

七、RMI服务的优缺点

优点:

1.      使用简单,只需要按照规范定义自己的服务对象即可

2.      支持扁平化的服务需求,一个注册中心,多个服务提供者

3.     分布式客户端处理

4.     具有一定的安全性,传输中调用的方法和请求服务均是采用HASH和ObjectId对应

5.      具有分布式内存管理的功能,当一个服务不去注册后,会通过远程内存管理接口来进行内存的回收

缺点:

1. 注册中心和服务提供者必须在同一台机器上,不支持分布式部署的需求

2. 服务提供者服务挂掉以后,注册中心完全感知不到,导致客户端依然会去建立连接,没有服务可用性的检测机制

2. 服务挂掉后,重启的时候需要先去注册掉原来的服务,然后再进行新服务的绑定

3. 不支持重试机制,一次失败后直接操作失败

4. 客户端需要每次请求前都需要去注册中心获取最新的服务信息

5. 序列化效率太差,支持是用的java的序列化机制,数据量大的时候,传输的无用信息很多,日后可以考虑压缩算法

6. 没有负载均衡处理,不支持多个节点提供同样的服务

7. 只能用于JAVA平台中,无法和其他语言开发的服务进行对接

9.  所有的服务均要从注册中心获取,注册中心挂掉后,所以服务均不可用,存在单点问题

10. 服务端的采用的还是BIO的模式,效率上较基于NIO的Netty框架差很远

11. 缺少服务的统计信息,流量的监控信息

参考:

https://www.iteye.com/blog/liujianhuiouc-2235614

https://www.jianshu.com/p/a9f72cc9fb31

https://blog.51cto.com/guojuanjun/1423392

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐