分布式计算、云计算与大数据概论心得理解

第四章 RMI范型与应用

分布式对象范型

分布式对象范型是在消息传递模型之上提供抽象的一种范型,是基于分布式系统中对象一种计算范型,使用它用户可以访问网络上的对象(即分布式对象)。分布式对象范型的核心是操作调用,而传递的数据承担辅助角色。
在这里插入图片描述
上图展示了分布式对象范型,运行在主机A上的进程向驻留于主机B上的分布式对象发出方法调用,如果需要传递数据,将作为参数随调用传递。主机A上的进程发出的调用会导致主机B上的某个方法被执行,如果该调用存在返回值,也会从主机B传送到主机A。使用分布式对象的进程称为该对象的客户进程。该对象的方法称为客户进程的远程方法。

分布式对象范型的体系结构

下图描述了支持分布式对象范型的基本体系结构,一个分布式对象由某一进程提供,这里称之为对象服务器(object server),同时必须在系统中为分布式对象注册提供一种设施,这里称之为对象注册器(object registry),或简称为注册器(registry)。

在这里插入图片描述

peer-to-peer范型

1.peer-to-peer范型源于P2P网络(又称为对等计算网络),简称为P2P范型。P2P网络是无中心服务器。
2.在peer-to-peer范型中,各参与进程的地位是平等的,都具有相同的性能和责任(因此,称它们为peer)。每个参与者(进程)都可以向另一个参与者发起请求和接收响应。在一个基于P2P范型的分布式应用中,每一个参与的进程往往既承担的服务器进程的角色(资源提供者),又承担了客户进程的角色(资源请求者)。

如何访问某一分布式对象

1.对象客户(object client)进程从注册器中查询该对象的引用,然后使用对象的引用调用远程方法。对象客户通过客户代理调用远程方法。在分布式计算环境中,代理是指充当其他软件构件之间的协调者的软件构件。代理通过与客户主机上的软件交互,提供分布式对象系统的运行时支持。例如负责向远程主机传送方法调用所需的进程间通信,包括封装需要传输给远程对象的参数数据。
2.服务器端也需要类似体系结构,其中分布式对象系统的运行时支持处理消息接收和数据解封,并将调用转发到称为服务器代理的软件构件。服务器代理通过与分布式对象交互,在本地调用方法,并将解封数据作为参数传入。该方法调用出发服务器主机上某些任务的执行。方法的执行结果,被服务器代理通过双方的运行时支持和网络支持,转发给客户代理。

远程过程调用(RMI)

RMI源于远程过程调用RPC(Remote Procedure Call),RPC范型调用过程如下图所示。
在这里插入图片描述

本地过程调用和远程过程调用的区别

在这里插入图片描述

RMI简介

1.RMI(Remote Method Invocation)即远程方法调用,是分布式计算的关键。RMI是RPC模型的面向对象实现,是一种用于实现远程过程调用的应用程序编程接口,它使客户机上运行的程序可以调用远程服务器上的对象。由于RMI API只适用于Java程序,所以,我们一般称为Java RMI。
2.通过调用RMI的API,对象服务器通过目录服务导出和注册远程对象,这些对象提供一些可以被客户程序调用的远程方法。从语法上来看,RMI通过远程接口声明远程对象,该接口是Java接口的扩展。远程接口由对象服务器实现。对象客户使用与本地方法调用类似的语法访问远程对象,并调用远程对象的方法。

Java RMI体系结构

在这里插入图片描述
桩/框架(Stub/Skeleton)层:客户端的桩和服务器端的框架;
远程引用(remote reference)层:处理远程引用行为;
传输层(transport):连接的建立和管理,以及远程对象的跟踪。

stub和skeleton

-------桩(stub)是远程对象的一种代理结构,使得远程对象可以像本地对象那样被访问。桩提供了远程对象的所有能被调用的远程方法,调用者可以通过调用本地桩(远程对象代理)所提供的方法来实现远程对象的方法调用。在RMI中,桩声明了同远程对象所实现的接口相同的方法集合。
-----当调用方调用桩内的方法时,会以如下方式进行处理:
1.初始化一个与远程JVM(包含了远程对象)的连接
2.向远程JVM传输封装后的参数(调用方法名,参数等)
3.等待远程JVM上的方法调用结果
4.将返回结果或异常信息解包
5.调用方得到调用结果
-----可以看出,桩负责为调用方实现参数的序列化和反序列化,以及封装了网络层的通讯过程,简化了调用方的操作。
-----在远程主机JVM,每一个远程对象有一个对应的skeleton(Java2平台下不再需要skeleton)。Skeleton负责分析调用方传来的参数,并调用相应的实际对象。当skeleton接收到一个远程方法调用请求,它将按如下方式进行处理:
1.解包并分析接收到的参数信息
2.调用相应的实际对象上的方法
3.将调用结果封装并传输给调用方法
-------可以看出skeleton与stub的处理过程类似,但顺序正好相反,但在Java 2平台或更高的版本中已经不再需要skeleton,它的功能被反射机制所取代。

RMI stub与skeleton之间的交互

在这里插入图片描述

对象注册

通过RMI API,可以利用若干种目录服务来注册分布式对象。JNDI(Java Naming and Directory Interface,Java名字和目录)就是一种这样的目录服务,可以将其用于未使用RMI API的应用中。另外,RMI注册表rmiregistry,是Java SDK提供的一种简单目录服务。

RMI基本应用开发

远程接口

-----一个不定义方法的标记接口。在RMI API中,分布式对象的创建开始于远程接口。而创建远程接口时,必须准守以下规则:
(1)远程接口必须直接或间接扩展Java.rmi.Remote接口,且必须声明为public,除非客户端于远程接口在同一包中;
(2)除与应用程序本身有关的违例之外,远程接口中的每个方法必须在自己的throws从句中声明java.rmi.RemoteException;
(3)在远程方法声明中,作为参数或返回值声明的远程对象必须声明为远程接口,而非该接口的实现类;

服务器端软件

-----对象服务器是指这样的一种对象,它可以提供某一分布式对象的方法和接口。每个对象服务器必须:
1)实现接口部分定义的每个远程方法;
2)向目录服务注册包含了实现的对象。
----一般建议将两部分作为独立的类分别实现。

stub和skeleton生成

1.在RMI中,分布式对象需要为每个对象服务器和对象客户提供代理,分别成为对象skeleton和stub。这些代理可通过使用Java SDK提供的RMI编译器rmic,编译远程接口实现生成。可在命令行下输入下述命令生成stub和skeleton文件:rmic
2.若编译成功,则生成两个代理文件,文件名都以实现类的类名为前缀,如SomeImpl_stub.class和SomeImpl_skel.class,在Java2平台下,只生成stub文件。对象的stub文件及远程接口文件,必须被每个对象客户所共享。

RMI应用构建步骤

1.为该应用的所有待生成文件创建一个目录。
2.在SomeInterface.java中定义远程服务器接口。编译并修改程序,直到不再有任何语法错误。
3.SomeImpl.java中实现接口,编译并修改程序,直到不再有任何语法错误。
4.使用RMI编译器rmic处理实现类,生成远程对象的stub文件 rmic SomeImpl
5.以从目录中看到新生成文件SomeImpl_Stub.class,每次修改接口实现时,都要重新执行步骤3和步骤4
6.创建对象服务器程序SomeServer.java,编译并修改程序,直到不再有任何语法错误。
7.激活对象服务器 java SomeServer

RMI应用的文件放置位置

在这里插入图片描述
在这里插入图片描述

测试和调试

------开发RMI应用时,建议遵循以下步骤:
1.构建最小RMI程序的一个模板。从一个远程接口开始,其中包括一个方法签名,一个stub实现,一个输出对象的服务器程序以及一个足以用来调用远程方法的客户程序。在单机上测试模板程序,直到远程方法调用成功。
2.每次在接口中增加一个方法签名。每次增加后都修改客户程序来调用新增方法。
3.完善远程方法定义内容,每次只修改一个。在继续下一个方法之前,测试并彻底调试每个新增方法。
4.完全测试所有远程方法后,采用增量式方法开发客户应用。每次增加后,都测试和调试程序。
5.将程序部署到多台机器上,测试并调试。

RMI客户回调

客户回调

----回调技术允许对特定时间的发生感兴趣的对象客户在对象服务器上注册自己,以便服务器可以在所等待事件发生时,向对象客户发起一次远程方法调用。下图比较了轮询与回调这两种技术。
在这里插入图片描述
------在RMI中,客户回调是允许对象客户在远程回调对象服务器上注册自己,以便服务器可以在所等待事件发生时,向客户发起远程方法调用的一个特征。注意,在客户回调中,远程方法调用编程是双向的(或称全双工的)。下图介绍全双工应用模式。
在这里插入图片描述
下图介绍了客户回调基本架构。如下图所示,每个客户对象都在回调服务器上注册自己,随后每当另一个客户对象为支持回调而在对象服务器上注册时即被通告。
在这里插入图片描述

支持客户回调的RMI应用的创建步骤

----开发服务器端软件的算法步骤:
1.为本应用即将生成的所有文件打开一个目录
2.在CallbackServerInterface.java中定义远程服务器接口,编译程序,直到没有任何语法错误
3.在CallbackServerImpl.java中实现该接口。编译程序,直到没有任何语法错误
4.使用RMI编译器rmic处理实现类,生成远程对象的stub文件,可以从当前目录中发现新生成的文件:rmic CallbackServerImpl
5.获取客户远程接口类文件的一个拷贝。此外也可以获取远程接口源文件的一个拷贝使用javac编译该程序,生成接口类文件CallbackClientInterface.class
6.创建对象服务器程序SomeServer.java。编译程序,直到没有任何语法错误
7.获取客户远程接口stub文件的一个拷贝CallbackClientImpl_stub.class
8.激活对象服务器:java SomeServer

带客户回调的RMI应用中的文件布局

在这里插入图片描述
在这里插入图片描述

桩下载与安全管理器

桩(stub)下载

-------在分布式对象系统的体系结构中,需要用代理于对象客户的远程方法调用交互。在Java RMI 中,该代理是服务器远程接口stub。Java RMI提供了客户动态访问stub的机制。使用动态stub下载,客户主机上就不再需要有stub类文件的拷贝了。取而代之的是,stub类可以在客户被激活时,按需从Web服务器传送到客户主机上。

RMI安全管理器

1.stub下载会带来系统安全问题。当从远程主机传输RMI stub等对象时,它的执行会使本地主机遭受到潜在的恶意攻击。
为了应对下载的stub所引起的威胁,Java提供类RMISecurityManager。RMI程序可以实例化该类的一个对象,实例化的对象能监视程序执2.行期间所引起的所有安全敏感动作。这些动作包括访问本地文件和使用网络连接,因为这些动作可能导致对本地资源以外修改或对网络资源的误用。
3.特别地,RMI运行时支持要求服务器进程在输出stub下载所需要的任何对象之前,安装安全管理器,客户进程在下载stub之前,也需要安装安全管理器。默认情况下,在每个支持Java的系统的特定目录中,都装有一个系统级安全策略文件。该系统安全策略文件定义的限制将被安全管理器执行。

Java安全策略文件的语法

----Java安全策略文件是一种文本文件,其中包含了定义特定许可授权的代码,下面是RMI应用中一个典型的java.policy文件。
grant {
// permits socket access to all common TCP ports, including the
// default RMI registry port (1099) – need for both the client and the server.
// permission java.net.SocketPermission “:1024-65535",connect,accept,resolve";
// permits socket access to port 80, the default HTTP port – needed
// by client to contact an HTTP server for stub downloading
permission java.net.SocketPermission "
:80”, “connect”;
};
----激活客户与服务器的形式如下:
java -Djava.security.policy=java.policy SomeClient
java -Djava.security.policy=java.policy SomeServer

指定stub下载和安全策略文件

**如果将从HTTP服务器上下载stub,那么应将stub类文件传输到HTTP服务器的相应目录中,例如,主机www.mycompony.com的stub目录,并确保该文件的访问权限是全球可读的。激活服务器时,指定下列命令选项:
java –Djava.rmi.server.codebase= -Djava.security.policy=<到安全策略文件的完整路径>
其中,是包含stub类的目录URL;<到安全策略文件的完整路径>指定该应用的安全策略文件;
例如:
java -Djava.rmi.server.codebase=
http://www.mycompany.com:8080/stubs/
-Djava.security.policy=java.policy HelloServer
----上述代码将启动HelloServer,并允许从Web服务器www.mycompany.com的目录stubs下载stub。

----下图展出了RMI应用所需的一组文件及这些文件的布局。服务器端的类文件包括服务器、远程接口、接口实现、stub类的类文件和应用的安全策略文件。在客户端所需的文件包括客户类,服务器远程接口类和应用安全策略文件。最后,stub类文件需要存储在HTTP主机上,可以从该服务器上下载stub。
在这里插入图片描述

支持stub下载的RMI应用的创建步骤

—开发服务器端软件的算法步骤:
1.为本应用即将生成的所有文件打开一个目录;
2.在SomeInterface.java中定义远程服务器接口。编译程序,直到没有任何语法错误。
3.在SomeImpl.java中实现该接口。编译程序,直到没有任何语法错误;
4.使用RMI编译器rmic处理实现类,生成远程对象的stub文件,可以从当前目录中发现新生成的文件:rmic SomeImpl;
5.创建对象服务器程序SomeServer.java,编译程序直到没有任何语法错误;
6.如果希望使用stub下载,将stub类文件拷贝到HTTP主机的相应目录中;
7.如果使用了RMI注册表,但没有激活,请激活RMI注册表。例如:
rmiregistry <端口号,默认1099>
8.也可以在对象服务器程序中使用代码激活RMI注册表;
9.为应用编辑一个Java安全策略文件,文件名为java.policy,将该文件放在相应目录中,或直接放在当前目录中;
10.激活服务器,指定希望stub下载的codebase和安全策略文件:
Java –Djava.rmi.server.codebase
=http://somehost.someu/edu/stubs/
-Djava.security.polict=java.policy

----开发客户端软件的算法步骤:
1.为本应用即将生成的所有文件打开一个目录;
2.获取远程方法接口类文件SomeInterface.class的一个拷贝;
3.开发客户程序SomeClient.java,编译程序生成客户类;
4.如果不希望stub下载,获取stub类文件的一个拷贝,并将其放在当前目录中;
5.为应用编辑一个Java安全策略文件java.policy,将该文件放在相应的目录或直接放在当前目录中;
6.激活客户,指定安全策略文件:
java –Djava.security.policy=java.policy SomeClient

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值