|
|
摘要:随着网络技术、面向对象技术(OOT)的成熟,分布计算技术不再是试验室里的高新技术,分布计算已成为软件设计的主流技术。纯面向对象编程语言Java使分布计算更容易实现。本文介绍先阐述如何判断一个系统是不是分布式系统?并分析在分布计算中,Socket通信协议和RPC的不足,然后论述如何使用Java RMI实现分布计算。
关键字:RMI 分布计算 RPC
1、 引言
分布计算是计算机界由来已久的话题,但过去大多数分布计算应用是专有的,适用范围很窄。随着网络技术飞速发展,对象技术的成熟,现在,分布计算具有跨越网络透明访问异构网络信息资源并进行处理的能力,使它成为新一代计算技术的主流。
Java语言的跨平台性、可移植性使它能够支持网络应用程序的设计。同时JAVA语言提供的远程方法调用(Remote Method Invocation,RMI)特性,使客户机上的程序可以调用服务器上的远程对象,这样就使程序员能够很容易编写出分布计算程序,并在网络环境下进行分布计算。
2、 分布计算及Socket和RPC存在的问题
计算机网络的出现和网络技术的迅速发展,使得原先在物理位置上分散的各种微机、工作站和服务器等计算资源可以通过网络实现互联和交互,协同完成大规模、复杂的计算任务。而Intranet/Internet技术的发展,使软件工程学科出现了一个新的领域??基于网络的分布计算。
分布计算是一个发展迅速的领域,与传统的集中式计算相比,分布计算具有以下优点:
◇分布计算包含更多计算单元的协同服务;
◇分布计算具有更好性价比;
◇分布计算具有更好的可靠性和可用性;
◇分布计算具有更好的透明性;
◇分布计算具有更好开放性和可伸缩性;
但关于分布计算定义,还没有形成一个统一的意见。文献[1]给以关于分布式系统的定义:“分布式系统是基于网络互相连接的若干计算单元系统协同计算的软件实现。”并且给出一个分布系统应该具有的若干属性:
◆ 任意数目的分布计算单元(PE),每个PE称之为物理资源。
◆ 任意数目的进程,每个进程称之为逻辑单元。
◆ 进程之间通过消息传递进行通信。
◆ 进程之间以协作的方式交互。
◆ 通信延迟不可忽略。
◆ 任何单个逻辑或物理的资源故障不会导致整个系统的崩溃。
◆ 在资源故障的情况下系统必须具有重新配置和处理故障的能力。
我们可以根据以上定义的属性,来判断一个系统是不是分布计算系统。
分布式系统可以看成彼此不共享内存的网络计算机协同完成多处理机任务,这就意味着分布系统即可以看作为服务器,也可以看作为客户机。因此,文献[2]提出的分布式系统的定义是:“分布式系统由一系列的节点组成,这些节点在需的时候会根据其定义的接口向其他节点提供服务。”同样在文献[3]中也给出不同定义。由这些定义我们可以这样认为:分布计算是利用分布在网络的各种信息资源和在网络上动态配置的多台计算机进行信息处理的过程,它是通过基于网络的分布式系统来实现的。
分布式系统中,要求分布在不同节点上对象能够互相通信。而通信基本机制就是:Socket协议通信。Socket协议使用层协议对交换的消息进行编码和解码,因而使用Socket进行设计比较复杂而且容易出错。在面向过程的语言中取代Socket的是远程过程调用RPC(Remote Procedure Call), 而RPC采用中性语言实现,并且返回的是用外部数据表示的值,对数据表示协议依赖很强,很难应用到面向对象分布计算系统中。而远程调用方法RMI(Remote Method Invocation)实质上模拟了应用在分布计算系统中的RPC,使用Java远程信息交换协议JRMP(Java Remote Messaging Protocol)进行通信,而JRMP是专为Java的远程对象通信制定的协议。因此,RMI就具有Java的可移植性,是分布应用的纯Java解决方案,更具有面向对象的特征。
3、 用Java RMI进行分布计算
RMI的实现主要基于以下三层来完成,如图所示。
Stub&skeleton层:这是RMI应用层与其他部分的接口,它传输给远程引用层的数据是从调度流中提取而来。调度流使用对象序列化机制实现的,通过这个机制,Java对象可以在地址空间进行传递。Stub是客户端的代理,它实现了所有远程对象的接口;Skeleton是服务器端的实体,它包括了一个被具体远程对象所支持的接口。
远程引用层:主要处理低端传输接口,也负责执行专门的远程引用协议,这个协议是独立于客户端的stub和服务端的skeleton之外的。
传输层:实现具体的客户端到服务器端的网络连接。主要执行以下动作:建立远程地址空间的连接;对连接进行管理和监控连接状态;监听新的调用;建立并维护地址空间的远程对象表;建立新调用的连接;定位远程调用的调度程序,并建立与此调度程序的连接。
而在Java语言中,RMI是一种Java虚拟机之间对象相互调用对方的函数,也是启动对方进程的一种机制,主要使用Java.rmi和Java.rmi.Server包中定义的接口和类。使用Java RMI开发分布计算程序流程如下图所示:
(1)定义远程类的接口:服务器对象必须通过远程接口声明服务;
(2)实现远程接口:必须提供一个Java服务器类,给类实现你向外部世界公布的接
(3)编译服务器:必须用javac编译服务器类;
(4)运行存根编译器:RMI提供一个成为rmic的存根编译器,对.class文件运行rmic;(5)启动RMIregistry;
(6)启动服务方应用程序;
(7)使用RMI注册表注册所有远程对象实例,使客户可以达到他们;
(8)编写客户端代码:必须使用java.rmi.Naming类定位远程对象,然后通过做远程对象代理的存根来调用方法;
(9)编译客户端代码;
(10)启动客户。
4、用Java RMI实现分布计算
笔者曾用Java RMI技术实现复杂矩阵乘法问题以及精确计算圆周率小数点后n位(当n很大时)的问题,这里限于篇幅仅给出复杂矩阵乘法程序的部分代码:
■定义远程接口
import java.rmi.*;
public interface MatrixInt extends Remote//继承Remote接口
{
public static void Multiply(int MatricX[][],int MatrixY[][],int MatrixZ[][])
throws RemoteException;
public static void OutputMatric(int Matrix[][])throws RemoteException;
}
■编写远程服务器上实现接口的方法
import java.rmi.server.*;
public class MatrixXY extends UnicastRemoteObject implements MatrixInt
{public MatrixXY () throws java.rmi.RemoteException{super();}
public static void Multiply(int MatrixX[][],int MatrixY[][],int MatrixZ[][])//矩阵相乘方法
{…… }}}
public static void OutputMatrix(int Matrix[][])
{……}}
■创建远程服务器实现接口方法的对象
import java.rmi.*;
public class Server{
public static void main(String[] args)
{new Server();}
try{MatrixInt c=new MatrixXY();Naming.rebind("rmi://loacalhost:1099/Service",c);}
catch(Exception e){System.out.println("Error"+ e); }}
■客户端程序代码
import java.rmi.*;
import java.rmi.server.*;
public class client{
public static void main(String[] args){
int MatrixX[][]={{1,4,5},{3,5,8},{9,13,7}};int MatrixY[][]={{5,7,9},{6,2,7},{2,5,7}};
int MatrixZ[][]=new int[3][3];
try{MatrixInt c=(MatrixInt)Naming.loopup(“rmi://remotehost/service”);
c.Mutiply(MatrixX,MatrixY,MatrixZ);
System.out.println(“The result is /n“);c.OutputMatrix(MatrixZ);}
catch(Exception e){System.out.println(“error”+e);}}
5、结束语
Java RMI是解决分布计算方案之一,它能开发出可移植,功能强大的分布计算程序。但Java RMI不能用于与非Java语言开发的对象进行通信,这正是它的不足之处,但可以借助CORBA与其它语言书写的对象进行通信,这也是分布计算领域研究的热点问题之一。
The Application of Distribution Based on Java RIM
PengTao ZhaoPengWei
(ShenYang Normal University IT College 110034)
With the maturity of object-oriented technology, distributed computing technology has walked out the laboratory and become mainstream in software design.The pure object-oriented computing Java makes distributed computing more easy.In this article at first we introduce how to judge if system is distributed computing system or not and analyze defect the defect of Socket and RPC,then we demonstrate how Java RMI works.
Key word: RMI distributed computing RPC
|
|