我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:白小姐 > 分布式应用 >

分布式处理技术是什么

归档日期:07-17       文本归类:分布式应用      文章编辑:爱尚语录

  可选中1个或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。

  RMI(Remote Method Invocation) 远程方法调用是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。

   当我们想与多个用户或客户机共享一个中央资源(如一个数据库)时,就会使用分布式计算。

   分布式计算用来利用多个系统的组合计算能力,以便比在单个系统上更有效或更快地解决问题。

  可以用多种方法配置多个计算机系统以共享处理,包括共享内存、共享磁盘或只是共享一条公共通信通道。最新的技术允许物理上相隔很远的系统能够在处理计算问题时协同工作。

  关于利用计算能力这一主题,因特网及伴随的通信协议 TCP/IP 的出现已使无数的计算机系统史无前例地连接起来。对一些应用程序来说,能够利用如此多的计算功能来解决问题是令人满意的。甚至更吸引人的是,大多数计算机系统都有充足的空闲时间,可以帮助解决其它问题。将来,网格计算会利用分布式计算能力进行出售,这与电力行业出售电能非常相似。

  RMI 是 Enterprise JavaBeans 的支柱,是建立分布式 Java 应用程序的方便途径。只要按照 RMI 规则设计程序,可以不必再过问在 RMI 之下的网络细节了,如: TCP 和 Socket 等等。任意两台计算机之间的通讯完全由 RMI 负责。调用远程计算机上的对象就像本地对象一样方便。

   服务器程序:服务器程序将创建多个远程对象,并使每个对象能够被引用。等待客户端调用创建好的远程对象上的方法。

   客户端程序:从服务端程序中得到一个或多个远程对象的引用。客户端能用此引用调用远程对象上的方法。

   对等计算程序:双方地位相等,互为对方的服务器和客户端。

  在 Java 中,远程对象是实现远程接口的类的实例 , 远程接口声明每个要远程调用的方法。在需要创建一个远程对象的时候,我们通过传递一个接口来隐藏基层的实施细节,客户通过接口句柄发送消息即可。远程接口具有如下特点:

   远程接口必须为 public 属性。如果不这样,除非客户端与远程接口在同一个包内,否则 当试图装入实现该远程接口的远程对象时,调用会得到错误结果。

  远程对象实现类必须扩展远程对象 java.rmi.UnicastRemoteObject 类,并实现所定义的远程接口。远程对象的实现类中包含实现每个远程接口所指定的远程方法的代码。这个类也可以含有附加的方法,但客户只能使用远程接口中的方法。因为客户是指向接口的一个句柄,而不是它的哪个类。必须为远程对象定义构造函数,即使只准备定义一个默认构造函数,用它调用基础类构造函数。因为基础类构造函数可能会抛出 java.rmi.RemoteException ,所以即使别无它用必须抛出 java.rmi.RemoteException 例外。

  包含 main 方法的类可以是实现类自身,也可以完全是另一个类。下面通过 RmiSampleServer 来创建一个远程对象的实例,并通过 java.rmi.registry.LocateRegistry 类的 createRegistry 方法从指定端口号启动注册服务程序,也可以通过执行 rmiregistry 命令启动注册服务程序,注册服务程序的缺省运行端口为 1099 。

  /* 创建和安装一个安全管理器,令其支持 RMI. 作为 Java 开发包的一部分

   代码范例 3 中将将远程对象名字绑定到对远程对象的引用上:

  客户机类的主要功能有两个,一是通过 Naming.lookup 方法来构造注册服务程序 stub 程序实例,二是调用服务器远程对象上的远程方法。

  客户端是通过 Naming.lookup 方法来构造注册服务程序 stub 程序实例,通过该实例的引用来发起对远程对象方法调用的,所以在运行运行客户端应用前必须为远程对象实现创建根 (stub) 和干 (Skeleton) 。要创建存根程序和骨架文件,应以包含远程对象实现的已编译类包全名运行 rmic 编译器。存根( Stub )是远程对象在客户端的代理,它将 RMI 调用传递给服务器端的骨架( Skeleton ),后者负责将该调用传递给实际的远程方法。在命令行模块下运行 RMIC 调用:

  依次做完上述步骤后,我们现在来运行一下我们的 RMI 应用。先运行服务端程序,运行结果如图 14.1 所示。

  负责指定 rmi 系统远程对象行为的接口和类在 java.rmi 包中定义的,接下来我们了解一下几个核心接口和类:

  在 rmi 中,远程接口声明了可从远程 java 虚拟机中调用的方法集,远程接口必须满足下列条件:

   远程接口中的方法申明必须满足:远程方法申明在其 throws 子句中除了要包含与应用程序有关的异常之外,还必须包括 RemoteException 异常 ( 或她的父类 ) ;在远程方法申明中,作为参数或返回值申明的远程对象必须申明为远程接口,而非该接口的实现类。

  RemoteException 类是在远程方法调用期间由 RMI 运行所抛出的异常,在使用了 rmi 系统的应用程序中,远程接口中申明的远程方法在其 throws 子句中必须指定 RemoteException 或者其超类。

   UnicastRemoteObject 定义了单个调用的远程对象,其引用只有在服务器进程运行时才有效。

   类 Activatable 是抽象类,它定义的 activatable 远程对象在其远程方法被调用时开始执行,并在必要时自己关闭。

  LocateRegistry 类用于获得对特定主机的引导远程对象注册服务程序的引用 ( 创建 stub), 或者创建能在特定端口接受调用的远程对象注册服务程序,注册服务程序实现将远程对象名与远程对象引用关联的简单命名语法,服务器重新启动不会记住这些名字和远程对象之间的绑定。

  Naming 类提供了存储和获得远程对象注册服务程序中的远程对象进行引用的方法

   当远程对象使用 rmi 注册服务程序在本地主机上进行过注册后,远程主机上的调用程序就可以按名称查询远程对象,获得其引用,然后在对象上调用远程方法。

  类 UnicastRemoteObject 创建并导出远程对象,该类实现的远程服务具有以下特点:

   将这种对象的引用至多仅在创建该远程对象的进程生命周期内有效。

   通过 TCP 传输与远程对象通信调用,参数和结果使用流协议在客户端和服务器之间进行通信。

  在远程机器中,每个远程对象都可以有相应的 skeleton , skeleton 负责将调用分配给实际的远程对象实现,他的主要功能如下:

  JNDI 诞生的理由似乎很简单。随着分布式应用的发展,远程访问对象访问成为常用的方法。虽然说通过 Socket 等编程手段仍然可实现远程通信,但按照模式的理论来说,仍是有其局限性的。 RMI 技术, RMI-IIOP 技术的产生,使远程对象的查找成为了技术焦点。 JNDI 技术就应运而生。 JNDI 技术产生后,就可方便的查找远程或是本地对象。

  JNDI(The Java Naming and Directory Interface , Java 命名和目录接口 ) 是一组在 Java 应用中访问命名和目录服务的 API 。为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。借助于 JNDI 提供的接口,能够通过名字定位用户、机器、网络、对象服务等。

   命名服务:就像 DNS 一样,通过命名服务器提供服务,大部分的 J2EE 服务器都含有命名服务器。

   目录服务:一种简化的 RDBMS 系统,通过目录具有的属性保存一些简单的信息。目录服务通过目录服务器实现,比如微软 ACTIVE DIRECTORY 等。

   包含大量命名和目录服务,可以使用相同 API 调用访问任何命名或目录服务。

   允许把名称同 JAVA 对象或资源关联起来,不必知道对象或资源的物理 ID 。

   使得开发人员能够集中使用和实现一种类型的命名或目录服务客户 API 上。

  JNDI 的结构由一个 API 和一个 SPI 组成, Java 应用程序实用 JNDI API 访问各种各样的命名和目录服务。

  前面提到命名服务是将名称与对象相关联。这种关联被称为绑定。一组这样的绑定被称为上下文, Jndi 上下文可以用来查找,捆绑 / 解除捆绑,创建或者破坏绑定名称操作在 JNDI 中,上下文是使用text 接口来表示的,而这个接口也正是与命名服务进行交互的主要接口。

  通过上面对 JNDI 的了解我们可以利用 JNDI 来管理 RMI 远程对象的注册服务,我们将代码范例 3 进行如下改写:

  表示服务端程序已经将远程对象在 JNDI 是进行了注册,等待客户端进行调用。

   RMI 运行在一个 java 虚拟机上的对象调用运行在另一个 java 虚拟机上的对象的方法 . 。 RMI 的用途就是为 java 程序之间的远程通信提供服务。

  n 对客户端:需要一些特定的代码来引用远程对象,一旦客户端的代码拥有对远程对象的引用,对远程对象上的调用与对本地对象方法的调用除了速度以外没什么区别。

  n 对服务端:必须定义类并实例化类的远程对象,服务器的代码必须能够登记对象并向客户端导出它们的方法,这样,这些方法就能够被远程调用了。

  n 客户端和服务端的代码都必须定义或能够访问一个接口,该接口中申明了可以远程调用的方法,并且两者还可以设置一个安全管理器。

  n 当调用远程对象上的方法时,客户端可以将对象作为参数来传递,并且,远程对象上的方法可以返回对象,这些是通过序列化来实现的。

   JNDI 为开发人员提供了查找和访问各种命名和目录服务的通用、统一的方式。

本文链接:http://frankstella.net/fenbushiyingyong/824.html