RMI原理详解
绪论
RMI(Remote Method Invoke),远程方法调用框架,JDK自带的一个远程过程调用框架。用户可以基于RMI框架构建自己的分布式应用,RMI为客户端和服务器之间提供底层的通信服务。
主要组成部分
RMI主要包括注册中心、跨JVM实例的内存对象管理、应用服务。
Ø 注册中心
提供服务的绑定、解绑、重绑、查找、列举,服务提供者需要将服务绑定到注册中心后,客户端才能够调用远程服务。Registry的接口的UML图如下:
Registry服务
注册中心涉及的类的UML图如下所示,主要包括客户端的存根RegistryImpl_Stub和服务端的骨架RegistryImpl_Skel,服务的注册调用是通过本地的存根对象和服务器的骨架进行通信的,RMI协议的通信是通过服务端UnicastRef和UnicastServerRef来进行的,这二者之间封装了顶层的socket的调用。
通信层次关系图如下所示:
其中TCPTransPoint提供了socket连接,完成客户端和服务器最底层的通信服务,其中服务端的处理流程图如下所示:
1. 服务端在RegistryImpl启动的端口出开启服务监听,提供一个线程进行socket的接收。
2. 接受线程将创建好的socket以及客户端的信息组装起来扔给业务线程池进行处理
3. 业务线程层从socket中获取相关信息,首先根据objectid确定要访问的服务,id为0的表示Registry服务,2表示DGC服务,接下来读取要访问的方法,通过一个int的数字进行标识,如0代表bind方法调用(对于一些普通的服务,是通过对方法method生成一个hash值,采用的是SHA算法)
4. 根据ObjectID从ObjectTable中获取对应的RemoteObject对象,接下来交给Dispatch进行分发处理(主要是根据method的hash值定位到具体的方法),注册服务的Dispatcher是RegistryImpl_Skel。
5. 相应的RemoteObject处理完成后将生成的对象反序列化后通过socket返回给客户端。
注意:服务的提供者不一定要和注册中心位于同一个JVM实例中,但是必须在同一台机器上,可以是同一个机器上的不同的网卡上的IP。服务的端口如果不指定的话,启动后系统会选取一个随机端口,对于要跨越防火墙的远程调用来说需要特别注意,每次一不同的端口启动的时候,如果防火墙上未配置此端口的可访问的ACL策略,访问会被拒绝。
Ø 服务的提供者
服务的提供者可以在虚拟机中提供对外的服务,开启服务的方式和注册服务的方式一样,服务开启的时候,会通过UnicastServerRef的exportObject方法导出相应的服务(继承了Remote的接口),此时导出的RemoteObject对象是弱引用的,如果不进行服务的注册的时候,接下来的GC可能会回收掉这个对象,只有当将服务绑定到注册中心后,注册中心会给服务提供者所在的JVM发送一个固定RemoteObject对象的请求,此时这个RemoteObject对象才有一个强引用,具体可以查看Target类的实现。绑定成功后,会在注册中心生存一个这个服务的Proxy对象,这个proxy对象也引用了一个unicastRef对象,用于和服务提供者所在的服务进行通信,当去注册后,会从RegistryImpl的binds中去掉对这个Proxy对象的引用,当这个proxy对象被注册中心所在的GC回收成功后,注册中心会发送一个GDC的请求到服务提供者所在的JVM,告知可以去固定这个RemoteObject服务对象,后续的GC会回收掉这个RemoteObject对象。
注意:服务提供者注册服务的时候要先查看下远端是否已经注册了该服务,重复注册的话会失败的,所以在代码的编写中一定要考虑这个服务提供者重启后的服务提供。如果存在应该重新绑定,而不是重复绑定。
Ø 客户端
客户端对象通过Naming的lookup对象去注册中心获取注册的服务对象,客户端首先是通过RegistryImpl_stub对象和注册中心的RegistrtImpl_Skel通信来获取服务的相关的信息,注册中心会将这个服务的接口访问信息(host:port)、ObjectId信息返回到客户端,客户端的RMILoaderClass会根据这些信息生成一个维护了unicastRef的Proxy对象,后续就可以通过这个对象直接与服务提供者进行通信请求服务了。在整个通信的过程中,Remote对象都是通过序列化为接口访问信息(host:port)、ObjectId信息返回给客户端的。
注意:如果服务提供者的信息一直发生变化,可以在通信失败后重新去注册中心拉取最新的信息,以排除是服务提供者信息变化的原因导致的失败。
RMI服务的优缺点
优点:
1. 使用简单,只需要按照规范定义自己的服务对象即可
2. 支持扁平化的服务需求,一个注册中心,多个服务提供者
3. 分布式客户端处理
4. 具有一定的安全性,传输中调用的方法和请求服务均是采用HASH和ObjectId对应
5. 具有分布式内存管理的功能,当一个服务不去注册后,会通过远程内存管理接口来进行内存的回收
缺点:
1. 注册中心和服务提供者必须在同一台机器上,不支持分布式部署的需求
2. 服务提供者服务挂掉以后,注册中心完全感知不到,导致客户端依然会去建立连接,没有服务可用性的检测机制
3. 服务挂掉后,重启的时候需要先去注册掉原来的服务,然后再进行新服务的绑定
4. 不支持重试机制,一次失败后直接操作失败
5. 客户端需要每次请求前都需要去注册中心获取最新的服务信息
6. 序列化效率太差,支持是用的java的序列化机制,数据量大的时候,传输的无用信息很多,日后可以考虑压缩算法
7. 没有负载均衡处理,不支持多个节点提供同样的服务
8. 只能用于JAVA平台中,无法和其他语言开发的服务进行对接
9. 所有的服务均要从注册中心获取,注册中心挂掉后,所以服务均不可用,存在单点问题
10.服务端的采用的还是BIO的模式,效率上较基于NIO的Netty框架差很远
11.缺少服务的统计信息,流量的监控信息
相关推荐
**RMI原理及应用详解** 远程方法调用(Remote Method Invocation,简称RMI)是Java平台提供的一种分布式计算技术,允许在不同的Java虚拟机(JVM)之间进行对象方法的透明调用。RMI的核心思想是使Java对象能够跨越...
【RMI原理详解】 远程方法调用(RMI,Remote Method Invocation)是Java提供的一种用于在分布式环境中调用远程对象的方法。RMI的核心思想是使客户端可以像调用本地对象一样调用远程对象,实现这一目标的关键在于...
### RMI原理详解 #### 前言与背景 RMI(Remote Method Invocation,远程方法调用)是一种Java平台上的技术,它允许开发者在不同JVM间的对象间进行方法调用,就像是本地方法调用一样简单。这项技术的出现极大地简化...
【RMI实例详解】 远程方法调用(RMI,Remote Method Invocation)是Java JDK 1.1引入的一种分布式对象技术,旨在简化分布在不同环境下的Java应用程序间的通信。RMI允许对象在不同的Java虚拟机(JVM)之间进行交互,...
RMI 工作原理 RMI的核心工作流程包括序列化、反序列化和远程调用代理。 - **序列化**:当客户端调用远程方法时,参数会被序列化并通过网络传输到服务器。 - **反序列化**:服务器接收到请求后,将序列化的参数反...
讲述 RMI 是什么,作用是什么,运行原理,主要用到的函数等。
### JNDI配置原理详解 #### 一、引言 JNDI(Java Naming and Directory Interface)是Java平台的一部分,它允许开发人员访问命名服务,从而可以存储和检索应用程序组件名称和服务之间的映射关系。本文将详细介绍...
Java RMI(Remote Method Invocation,远程方法调用)是Java...理解RMI的工作原理和实践,对于开发分布式Java应用至关重要。同时,由于RMI依赖于Java序列化,因此需要关注Java序列化的安全问题,例如防止反序列化攻击。
### Java RMI 分布式编程心得详解 #### 一、Java RMI 分布式编程概述 Java远程方法调用(Remote Method Invocation, RMI)是一种让位于不同Java虚拟机(Java Virtual Machine, JVM)上的对象能够互相调用彼此方法...
**RMI接口技术详解** RMI(Remote Method Invocation),即远程方法调用,是Java平台中用于实现不同Java虚拟机间对象通信的技术。RMI的目标是使得分布在网络上的对象能够像本地对象一样工作,实现位置透明性,隐藏...
《Synaptics RMI3 触摸芯片编程详解——基于S3508》 Synaptics公司作为全球领先的触控解决方案供应商,其RMI(Remote Input Interface)系列芯片在业界有着广泛的应用。RMI3是Synaptics推出的一种新型接口,而S3508...
【分布式实验 RMI技术详解】 分布式计算环境中的远程方法调用(Remote Method Invocation,RMI)是Java平台提供的一种强大的工具,它允许在不同的Java虚拟机(JVM)之间进行对象间的交互。华南理工大学的这个实验...
【RMI(远程方法调用)技术详解】 RMI(Remote Method Invocation)是Java平台上的一个核心特性,它允许在不同的Java虚拟机之间进行方法调用,实现了分布式计算。RMI使得开发分布式应用变得更加简单,它能够透明地...
### RMI 使用实例详解 #### 一、RMI 概述 远程方法调用(Remote Method Invocation,简称 RMI)是 Java 平台提供的一种分布式计算技术,它允许开发者创建可跨网络调用的方法,就像在本地调用一样简单。RMI 的设计...
#### 三、RMI实现步骤详解 根据给定的示例代码,我们可以详细分析RMI的实现过程: ##### 步骤一:定义远程接口 定义一个名为`FileServerInterface`的远程接口,该接口继承自`java.rmi.Remote`,声明了一个名为`...
通过本次实验,学生能够深入了解 Java RMI 的工作原理,并能够熟练地使用 RMI 开发简单的分布式应用程序。实验不仅涉及了远程接口的设计与实现,还涵盖了服务器端与客户端程序的编写、编译以及运行过程中的注意事项...
#### RMI系统架构与运行原理 RMI的核心组件包括客户端(Client)、服务器端(Server)、远程接口(Remote Interface)、存根(Stub)和骨架(Skeleton)。其中,远程接口定义了远程对象可公开的方法,存根和骨架...