代理模式-分布式计算.ppt
设计模式第九章第九章代理模式代理模式-分布式计算分布式计算设计模式回顾q状态模式允许一个对象基于内部状态而拥有不同的行为q通过将每个状态封装进一个类,我们把以后需要做的任何改变局部化了q状态转换可以由State类或Context类控制q使用状态模式通常会导致设计类的数目增加2设计模式目标q理解本地计算与分布式计算q分布计算角色与机制q远程方法调用(Remote Method Invocation)RMIq配置远程方法调用q远程方法中的参数传递qRMI与CORBA区别3设计模式本地计算与分布计算q本地计算:组件共享一个公共的地址空间进行通信。q分布计算:组件调用不同机器上的地址空间的组件进行通信。JVM组件组件JVMJVM本地计算分布计算4设计模式分布计算q分布计算角色:客户与服务器q分布计算机制:客户端以常规的方式进行方法调用,无须操心数据在网络上传输或者解析响应之类的问题。提供服务的对象可能不在同一个虚拟机内,甚至可能不是Java语言实现的对象。在客户端为服务器对象安装一个代理(proxy),客户调用此代理进行常规方法调用。客户端代理负责与服务器进行联系。在服务器端安装第二个代理对象。该服务器代理与客户端代理进行通信,以常规方式调用服务器对象上的方法。clientServer发送请求数据返回响应数据在客户端与服务器之间传递对象5设计模式clientproxyproxyserver调用本地代理发送请求数据调用本地服务方法返回方法结果返回响应数据返回方法结果RMICORBASOAP6设计模式RMI、CORBA与SOAPq三种通信技术:RMI:Java的远程方法调用技术,支持Java的分 布式对象之间的方法调用;CORBA:通用对象请求代理架构,支持任何编程语言编写的 对象之间的方法调用,使用Internet Inter-ORB协议 (IIOP)支持对象间通信;SOAP:简单对象访问协议,使用基于XML的传输格式。7设计模式Java RMIClientServer对象A远程接口B远程对象BB的代理:存根的代理:存根(stub)远程引用层远程引用层RRL通信模块通信模块远程方法调用返回值B的代理:主干的代理:主干(skeleton)远程引用层远程引用层RRLJava RMI架构通信模块通信模块命名服务注册对象对象B引用引用远程对象远程对象B引用引用8设计模式一般RMI概念服务器:远程接口B:列出了可以远程调用的所有方法;远程对象B:实现远程接口B的类实例化对象;主干(skeleton):将客户端发送的参数反向序列化并调用远程对象上所需方法。方法返回,获得返回值并序列化发送回服务器通信模块。远程引用层(RRL):为远程对象B创建一个远程对象引用。同时维护远程对象 与其引用之间的映射。客户端:存根(stub):以远程对象B的引用(唯一标识)、远程接口B方法描述来构造 一个代理对象;远程引用层(RRL):远程对象B的引用到达RRL时,生成stub,并维护远程对象B 的引用与stub之间的映射。9设计模式配置远程方法调用-1q使用RMI创建C/S应用程序的步骤:服务器端:定义远程接口,继承Remote接口(java.rmi包),其声明远程调用的方法,每一方法必须声明抛出RemoteException异常。编写实现远程接口的类(服务器类),该类的对象就是远程对象。实现远程接口 继承服务器类:使用rmic工具,将上述服务器类生成存根和主干rmic v1.2 服务器类 编写一个主类,实例化服务器类,生成远程对象,并且向注册库 命名注册远程对象,利用的方法:public static void bind(String name,Remote obj)public static void rebind(String name,Remote obj)10设计模式配置远程方法调用-2q使用RMI创建C/S应用程序的步骤:客户端:编写客户机类,调用远程对象上的方法。利用的方法:public static Remote lookup(String name)注意:name以URL格式给出:rmi:/:/(port默认1099)启动注册库 start rmiregistry port 运行服务端主类,创建远程对象并向注册库注册该对象引用。运行客户机。11设计模式RMI C/S应用举例ClientServer调用远程方法sayHello()返回结果:”Hello Client”Step 1:定义远程接口,HelloInterface.java12设计模式RMI C/S应用举例Step 2:编写服务器类HelloImplementor,实现远程接口HelloInterface13设计模式RMI C/S应用举例Step 3:生成stub和skeleton:rmic v1.2 testrmi.HelloImplementor Step 4:编写一个主类HelloHelper,实例化服务器类HelloImplementor,生成远程对象,并且向注册库命名注册远程对象14设计模式RMI C/S应用举例Step 5:编写客户机类,调用远程对象上的方法15设计模式演示start rmiregistry 运行注册库 16设计模式远程方法中的参数传递q传递非远程对象 将对象传递给本地方法,传递的只是对象的引用。将非远程对象传递给远程方法,传递的只是对象的拷贝 非远程客户信息对象ClientServerCustomer调用远程方法find,参数Customer对象返回结果比较客户端非远程对象信息在远程方法调用前后是否一样17设计模式远程方法中的非远程对象传递18设计模式远程方法中的非远程对象传递19设计模式远程方法中的非远程对象传递20设计模式演示21设计模式远程方法中的参数传递q传递远程对象 将远程对象传递给远程方法,那么远程方法接收到的是一个存根对象.collagestudentServerClient调用远程方法add,传递远程对象student返回结果Stub对象22设计模式远程方法中远程对象传递23设计模式远程方法中远程对象传递24设计模式远程方法中远程对象传递25设计模式演示26设计模式RMI与CORBAq与RMI不同,CORBA允许Java对象与其他语言编写的对象之间进行相互调用。其依赖于客户端与服务器端同时具有对象对象请求代理(ORB).q使用IDL描述接口.27设计模式总结q理解本地计算与分布式计算q分布计算角色与机制q远程方法调用(Remote Method Invocation)RMIq配置远程方法调用q远程方法中的参数传递qRMI与CORBA区别28