Posted on 2006-01-17 16:05
JDeodar 阅读(473)
评论(0) 编辑 收藏 所属分类:
J2EE
Remoting -- 远程调用
分布式计算第一法则:不要分布你的对象--Martin Fowler《企业应用架构模式》
经典的Java远程方案的根源,RMI(Remote Method Invocation)是JDK1.1中引入的。基于Java的序列化机制通信协议时可接插的。
所有的RMI服务必须要实现某个继承自java.rmi.Remote的接口。
保持远程通信无状态——这也是任何远程调用应该谨记的法则。如果真需要有状态的会话,可以考虑用EJB的有状态的Session Beans,或是具备HttpSession功能的web service。
一、经典的J2SE远程方案:RMI
A、访问和曝露RMI服务
访问RMI服务,只需通过java.rmi.Naming查找一个RMI的URL地址即可。每次查找都将返回一个服务器端RMI服务实例的一个代理:和EJB不同,没有组件池的概念。
Spring环境中的设置
在Spring的bean工厂或应用上下文中,可以用RmiProxyFactoryBean类来定义RMI服务的客户端代理。
也可以借助RmiServiceExporter类曝露为RMI服务,不过被曝露的bean组件必须遵循RMI服务的实现要求。
为了避免让客户端直接针对RMI接口编程,RMI服务的实现类在实现RMI服务接口之外,也可以实现与RMI无关的业务接口(business interface)[同样方法的业务接口]。这样,客户端只需要依赖普通的业务接口,不需要依赖RMI接口。
坏处:必须时刻保持“业务接口”与“远程接口”之间的同步。
B、用RMI调用器实现透明远程调用
借助Java反射机制,通过RMI调用器(RMI invoker)发送方法调用。
二、经典的J2EE远程机制:EJB
三、基于WSDL的web Services:JAX-RPC
J2EE1.4版本最大的进步就在于对web services的支持,其下的基础规则是WSDL(Web Service Description Lanuage,web service描述语言)和SOAP(Simple Object Access Protocol,简单对象访问协议)。
WSDL是一种XML格式,用于将网络服务描述为一组对消息的端点操作,消息中包含面向文档或者面向过程的信息。操作和消息都将被抽象地描述,并随后被绑定到具体的网络协议和消息格式,用于定义一个端点。彼此连接的具体端点就可以组合为抽象端点(服务)。
--WSDL就是对远程服务的平台无关的描述。
A、访问web service
每个基于WSDL的web service都由一个服务(service)构成,其中定义了一个或者多个端口(port)。每个端口对应服务器上的一个服务端点(service endpoint),一个由WSDL定义的web service中可以汇聚多个端点。这与经典的远程服务(EJB)不同,后者不支持这样的分隔。
为了访问一个服务,JAX-RPC需要下列参数:
1、WSDL文档的URL
2、WSDL服务的命名空间URL
3、WSDL服务的名称
JAX-RPC提供了三种访问服务端点的途径:
1、静态存根:--不推荐
2、动态代理:--一种通过Java接口访问远程服务的有效途径,并且是可配置的。
3、动态调用接口(DII):--提供了最大限度的解耦。
B、Spring环境中的配置
曝露一个JAX-RPC服务
C、Servlet和EJB端点
JAX-RPC规范描述了两种服务端点的实现:servlet端点(Servlet endpoint)模型和EJB端点(EJB endpoint)模型。
四、轻量级远程方案:Hessian和Burlap
RMI环境的配置相当麻烦,并且使用的网络端口常常被防火墙禁止。基于WSDL和SOAP的web service又很难以一种可移植的方式导出,并且由于它们的协议臃肿冗长,会浪费大量的带宽。基于HTTP的轻量级远程调用协议解决了上述两个问题:它们可以在任何标准的servlet容器之上运行,并且可以穿越任何防火墙。
1、访问和曝露Hessian和Burlap服务
2、在Spring环境中的配置
--JPetStore展示Spring环境中使用Hessian和Burlap、RMI和JAX-RPC(借助Apache Axis)来曝露远程服务,同时提供远程服务客户端的示例。
Replacing Other EJB Services -- 替换其他的EJB服务
1、持久化
2、远程调用机制
3、CMT
4、线程管理
5、SLSB实例池
6、声明性、基于角色的安全性