Spring Remote
Spring 远程调用提供了几种模式:RMI、Hessian、Burlap、HttpInvoker、JAX RPC/JAX-WS、JMS等。参考手册中提供了这几种远程调用方式的集成说明。这里根据一些资料进行一次归总,以了解各种方式的特点帮助进行选择。
1.RMI:是Java标准的远程方法调用接口,即Remote Method Invocation。它基于Java序列化机制实现远程方法的调用。
通常RMI的实现过程:
1)定义远程服务接口(从Remote接口派生的接口定义)
2) 实现定义的接口,使用UnicastRemoteObject.exportObject()方法导出该远程对象(也可以继承UnicastRemoteObject的方式去联接RMI系统)。
3)启动RMIRegistry,运行服务端代码部署RMI服务。
使用RMI的优势在于执行速度快,劣势在于不能跨语言,只能用于Java程序间的通讯。
Spring框架以两种方式支持RMI:传统RMI编程模式和RMI Invoker的编程模式。
2.Hessian:Hessian是一个采用二进制的RPC协议,使用简单的方法实现了RMI的功能。提供了Java、PHP、Python、C/C++多种语言支持。
Hessian通常通过Web应用来提供服务,通过接口暴露服务。Servlet(HessianServlet)和Spring的DispatcherServlet都可以把请求转发给Hessian服务。
Hessian的优势在于简单易用,通过接口暴露服务,二进制传输、效率较高。Hessian与WEB服务器结合非常好,借助WEB服务器的成熟功能,在处理大量用户并发访问时会有很大优势,在资源分配,线程排队,异常处理等方面都可以由成熟的WEB服务器保证。而RMI本身并不提供多线程的服务器。而且,RMI需要开防火墙端口,Hessian不用。缺点是缺乏安全机制,传输没有加密处理。
3.Burlap:Hessian和Burlap是Caucho Technology(http://www.caucho.com)提供的两种解决方法,是基于HTTP的轻量级远程服务。它们都致力于通过把它们的API和通信协议变得尽可能的简单,来简化Web服务,所不同的是Burlap是基于XML-RPC协议的,具有较好可读性。而Hessian的消息是二进制的,所以它在带宽上更占优势。
基于XML的RPC通常都是跨平台的,但其主要缺点是性能:
1)描述接口的冗余信息太多,与二进制协议相比,文件能大几倍甚至10倍;
2)基于XML的序列化反序列化效率不高。 所以其性能与RMI、Hessian等协议相比,至少要差一个数量级。
4)HttpInvoker:HttpInvoker是SpringFramework提供的JAVA远程调用方法,,它使用标准的Java串行化机制并通过HTTP协议来暴露服务。这是一个很重要的特征,特别是当你想传递给服务的方法参数是复杂的类型对象而不仅是简单的文本消息时尤为重要,可以作为RMI或Hessian/Burlap的替代品。但同时,它只能用于JAVA语言之间的通讯,并且要求客户端和服务端都使用SPRING框架。
在客户端方面,Spring HTTP Invoker提供两种类型的客户端:Java SE提供的标准API和Commons HttpClient API。默认情况下,它使用的是HttpClient
5)WebService:借助于开源Web服务引擎Apache Axis并通过JAX-RPC技术,Spring为实现基于SOAP的Web服务提供支持。Web Service由于是基于XML格式进行远程方法调用,在XML的序列化效率不高,性能比其它方式低。
以下是一个总结(摘自:基于Spring实现远程服务编程):
|
框架 |
优点 |
缺点 |
|
RMI |
全面支持Java对象串行化。因此,你能够通过网络发送复杂数据类型。 |
RMI仅是一种Java到Java型远程方案。如果你拥有任何非Java客户端的话,那么你无法使用它。另外,你还无法通过HTTP协议存取对象,除非你有专门的“通道”实现RMI通讯。注意,它需要一个RMI编译器(为了生成代理和框架)和一个外部注册表(用于查询服务)。 |
|
Hessian/Burlap |
跨防火墙工作良好 |
它们使用一种专利对象串行化机制。其中,Burlap仅支持Java客户端。它们能够串行化Hibernate对象,但是对集合对象执行“惰式”加载。 |
|
HTTP Invoker |
基于HTTP的Java到Java Remoting;通过HTTP实现Java串行化;容易建立。 |
服务器和客户端应用程序都需要使用Spring。 仅是一种Java方案。 |
|
EJB |
支持Remoting J2EE服务,应用程序安全以及事务处理 |
EJB是一种重量级技术。它要求使用一个J2EE容器。 |
|
Web服务 |
平台和语言独立 |
要付出SOAP操作所带来的开销,并且要求使用一个Web服务引擎。 |
在所有的模式中,服务可以作为Spring管理的Bean配置到你的应用中。这是用一个代理工厂Bean实现的,这个Bean使你能把远程服务当作本地对象一样置入到其他Bean的属性中。
客户端发起对代理的调用,好像是代理提供了这些服务的功能一样。代理代表客户端和远程服务交流。它处理连接的具体情况,并向远程服务发起远程调用。
在服务端,你能够把任何Spring管理的Bean的功能公开成为一个远程服务
不论开发的是使用远程服务的代码,还是实现那些服务的代码,或者二者兼而有之,在Spring中,使用远程服务纯粹是个配置问题。你不用写任何Java代码来支持远程调用。你的服务Bean不必关心它们是否被卷入到RPC里(虽然任何传递给远程调用的Bean或从远程调用返回的Bean可能需要实现java.io.Serializable)。
对比RMI,Hessian,Burlap,Httpinvoker,web service等5种通讯协议的在不同的数据结构和不同数据量时的传输性能,引用‘java 几种远程服务调用协议的比较’一文的测试结果:
RMI > Httpinvoker >= Hessian >> Burlap >> web service
RMI不愧是JAVA的首选远程调用协议,非常高效稳定,特别是在大数据量的情况下,与其他通讯协议的差距尤为明显。
HttpInvoker使用java的序列化技术传输对象,与RMI在本质上是一致的。从效率上看,两者也相差无几,HttpInvoker与RMI的传输时间基本持平。
Hessian在传输少量对象时,比RMI还要快速高效,但传输数据结构复杂的对象或大量数据对象时,较RMI要慢20%左右。
Burlap仅在传输1条数据时速度尚可,通常情况下,它的毫时是RMI的3倍。
Web Service的效率低下是众所周知的,平均来看,Web Service的通讯毫时是RMI的10倍。
参考:基于Spring实现远程服务编程 http://www.51cto.com/specbook/223/34262.htm
Spring in Action 学习笔记—远程调用
java 几种远程服务调用协议的比较

浙公网安备 33010602011771号