RMI的执行模型
2023-12-04 18:02:07
RMI的执行模型
上一回谈到了RMI基础通信结构,RMI工作的基本思想其实和RPC机制的原理十分相似,当然也有所不同,至少RMI强调类的高复用,提供一种机制来构建分布式系统。同样,我们先来看看RMI是如何工作的。
首先,需要一个远程接口,这个远程接口就是一个接口,声明了一组远程方法,有点类似本地的接口,本地接口里面可以声明方法,但是远程接口还包含了一些标识,这些标识用来标记远程接口中所有的方法,用来告诉RMI运行时,这个接口是远程接口,标示方法都是远程方法。一般而言,Java语言会提供特殊的或者注解来标识远程接口。
其次,我们需要一个远程对象的本地存根(stub)。我们可以把本地存根理解成一个动态代理。远程对象的本地存根知道要调用什么方法,在调用方法的时候,本地存根向RMI运行时注册一个请求,参数都是本地方法的参数,当然,这里面少不了接口标志,RMI运行时看到请求,就知道这是个远程调用,于是把参数封装成一个请求包发送给服务器端。
第三,我们需要一个远程对象的服务器端骨架(skeleton),服务器端骨架相当于是远程对象的代理,它负责处理来自客户端的远程调用。当服务器端骨架收到客户端的请求包的时候,解开请求包,还原参数,用这些参数调用实际的远程对象方法,远程对象方法执行完毕后,服务器端骨架封装执行结果返回给客户端。
到这一步,一个远程调用的过程就完成了。然后,客户端将远程调用结果传给本地存根。本地存根负责把结果返回给本地调用者。本地调用者拿到执行结果,就仿佛调用了一个本地方法一样。
RMI的这种工作流程,使得RMI可以高度透明地实现远程调用,大大降低了开发的难度。开发人员只需要定义好远程接口和本地接口,剩下的事情都可以由RMI运行时自动完成。
RMI的通信协议
RMI的通信协议主要有JRMP和IIOP两种。
JRMP是Java远程方法调用协议,它是RMI的主要通信协议,也是默认的通信协议。JRMP是一个二进制协议,它使用TCP作为传输协议。JRMP协议简单、高效,但是安全性较差。
IIOP是互联网互操作协议,它是CORBA的通信协议。IIOP是一个基于消息的协议,它支持多种传输协议,包括TCP、HTTP和SSL等。IIOP协议安全、可靠,但是性能不如JRMP。
RMI开发人员可以选择使用JRMP或IIOP作为通信协议。JRMP协议简单、高效,但是安全性较差。IIOP协议安全、可靠,但是性能不如JRMP。
RMI的代码生成工具
RMI提供了一个代码生成工具,叫做rmic。rmic工具可以根据远程接口生成本地存根和服务器端骨架。
使用rmic工具生成代码时,需要指定远程接口的类名。rmic工具会根据远程接口的类名生成本地存根和服务器端骨架的类名。
本地存根的类名是远程接口的类名加上_Stub后缀。服务器端骨架的类名是远程接口的类名加上_Skel后缀。
例如,如果远程接口的类名是MyRemote,那么本地存根的类名是MyRemote_Stub,服务器端骨架的类名是MyRemote_Skel。
RMI的安全机制
RMI提供了多种安全机制,来保护RMI通信的安全。
RMI的安全机制主要包括:
- 身份验证:RMI可以使用用户名和密码来验证客户端的身份。
- 授权:RMI可以使用访问控制列表(ACL)来控制客户端对远程对象的访问权限。
- 数据加密:RMI可以使用SSL/TLS来加密RMI通信的数据。
- 代码签名:RMI可以使用代码签名来验证远程对象的代码是否合法。
开发人员可以选择使用一种或多种安全机制来保护RMI通信的安全。