Support Wikipedia Follow My Heart: Java RMI 学习笔记

2012年1月3日星期二

Java RMI 学习笔记

在我看来,Java RMI 远远不是一个简单的网络点对点消息传递技术。RMI技术的精髓在于,在程序运行时动态地在网络上部署和转移资源(包括源代码和数据)。因此,对于RMI技术的用户来说,必须完成大量“繁琐”的资源/代码访问权限的设置工作,以保证RMI技术在使用时的安全性。因此对于仅仅追求网络信息的简单点对点传播功能的初级用户来说,我觉得RMI技术显然是“杀鸡用牛刀”,而且也太复杂了一点。

不过鉴于RMI技术的强大,还是很有必要钻研一下的。Oracle给点RMI技术的教程我觉得太初级了一些,我觉得为什么它并没有把RMI技术的设计和使用精髓讲清楚。因此,我抛砖引玉,尝试着从其他角度做一点补充。详细的blog和测试代码请参照英文版博客文章“My Java RMI Tutorial”.

首先,Java RMI的连接建立工作流程图。

图片1

第一步:远程的某一个对象,将自己注册到全局的RMI Naming Service里面。这样无论哪里的客户端,都可以有办法找到它的注册信息(包含真实的网络通信地址)。

图片2

第二步:某一个需要用到远程对象的客户端上线后,通过全局的RMI Naming Service查找目标对象的注册信息(根据注册名称)。

图片3

第三步:客户端获取远程对象的真实网络地址后,建立网络连接。从远程对象那边下载接口代理(Stub)。这样以后调用远程对象的方法时,所需要的手续等同于调用本地stub对象的方法。网络层的动作被成功屏蔽。

 

RMI技术的精髓在于“动态部署资源”,也就是说,在实际通信过程中,客户端(或者远程对象端)可以动态下载完成计算所需要的资源。举个例子:

  1. 客户端事先知道的仅仅是stub对象端接口的定义文件。具体在远程对象那边是哪个类实现了这个接口,客户端是不知道的。甚至客户端都没有这个类的代码。因此,在建立连接后,客户端会动态地从远程对象那边下载所需要的对象定义信息。
  2. 同样的道理,在调用stub对象的方法实现计算时,客户端负责提供参数,远程对象完成计算。事先远程对象并不需要知道参数是什么。甚至参数的具体代码远程对象可能也没有(有点可能仅仅是接口的定义)。这样在计算之前,远程对象端会自动从客户端下载参数的具体类代码。
  3. 可能的场景还有,当远程对象完成计算,返回结果时,所返回的对象的具体实现代码,可能客户端也是没有的。因此,客户端也可能动态地从远程对象端下载相关代码。

这种运行时的动态资源部署,涉及到安全性的问题。为了避免恶意软件入侵,RMI技术的使用者需要通过SecurityManager来指定自己的类在接入RMI网络时,自身的哪些资源可以被动态下载。这一块内容对于初学者来说很麻烦,但是却是RMI技术的设计重点。

My Java RMI Tutorial”的示例代码 中有3组例子,分别对应了上面列出的三种场景,在代码中书写清楚了在每种情况下需要如何设置SecurityManager来覆盖必须的文件访问路径。希望这些例子能对您的工作学习有所帮助。

没有评论:

发表评论