【IT168技术文档】
一.引言
从根本上分析,Remoting实际上是一种企业分布式计算的组件。在同一服务器(Java虚拟机)内进行调用的服务(或类)并不需要把自己暴露为一种远程服务;但是,如果你需要与一个外部程序(在不同的服务器上或在一个不同的组织中)进行通讯的话,那么,必须把它实现为一个远程服务。Spring框架为把业务类暴露为远程服务提供了一种独特而灵活的方式。
Spring Remoting架构的核心是服务对象,这些对象其实是一些POJO,也称作Spring bean。Spring框架能够把这些服务对象与基础结构细节(例如它们暴露为远程服务的方式)隔离开来;这样以来,开发者就可以专注于实现服务对象的业务接口而不是牵涉到这些细节中去。
这个Remoting模型提供了对业务服务的远程抽象。它负责编排和反编排方法参数并且还负责处理服务方法中抛出的任何异常—使用未检查的RemoteAccessException异常对它们进行包装。为了实现各种服务,Spring使用了若干设计模式。例如,它使用代理设计模式把你对HTTP POST请求的调用翻译成指向输出服务的URL。
本文将着重探讨如何使用Spring实现一个远程服务。也就是说,要展示使用Spring Remoting API把一个普通Java对象(POJO)转化成一个远程服务;这样以来,外部程序就可以从其业务实现中调用该服务。该演示使用一个示例贷款处理应用程序把一个业务服务实现为一个远程HTTP服务并且从一个测试客户端调用该类中的业务方法。
二.Spring Remoting工作机制
在本节中,让我们更为细致地分析Spring的Remoting工作机制。要把一个普通的Java类实现为一个远程服务,需要提供如下一些内容:
1.远程服务输出器(exporter)—这些类用于创建为客户端程序所调用的远程服务端点。服务导出器还管理任何用来查询远程服务的注册表。
2.代理工厂Bean—它们是用于创建代理的工厂类,客户端能够使用这些代理连接到远程服务。
3.HTTP Invoker—如前面所提及,Spring HTTP Invoker使用了一种Remoting模型,你可以使用这种模型实现跨HTTP的远程调用,同时使用Java串行化技术传递Java对象。这样使得从一个普通Java类中实现一个远程服务容易得多了,并且允许你专注于远程服务的业务接口而不必亲自考虑远程基础结构的实现细节。
该技术依赖于RMI Invoker的基础结构,但是使用HTTP作为传输协议。
在客户端方面,Spring HTTP Invoker提供两种类型的客户端:Java SE提供的标准API和Commons HttpClient API。默认情况下,它使用的是HttpClient。
接下来,让我们看一下Spring框架所支持的远程(Remoting)技术。
Spring框架支持的远程技术列举
Spring框架支持多种Remoting技术。下面,我们来对它们作逐一简单介绍。
①远程方法调用(RMI)
RMI是一种分布式Java技术,远程Java对象的方法能够从一个不同的Java虚拟机上进行调用。它基本上是远程过程调用(RPC)的Java版本,但是,它还提供了连同相应的请求一起传递多个对象的能力。RMI使用真正的对象串行化来编排与反编排方法的参数而不会截断其相应类型。
Spring以两种方式支持RMI:传统型RMI和使用RMI Invoker的远程技术。
②Hessian
Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议。它使用一种定制的串行化技术来实现跨网络发送Java对象。除了对Java支持外,Hessian还提供对于例如PHP,Python,C++和C#等其它语言的实现支持。
③Burlap
Burlap是一个轻量级的用于实现Web服务的XML-RPC协议。类似Hessian,它还使用一种专利性串行化机制来实现Java对象的串行化。有关Hessian/Burlap的更多信息,恕在此不多及。
④HTTP Invoker
Spring提供一种专门的Remoting策略—HTTP Invoker,它使用标准的Java串行化机制并通过HTTP协议来暴露服务。这是一个很重要的特征,特别是当你想传递给服务的方法参数是复杂的类型对象而不仅是简单的文本消息时尤为重要。
⑤EJB
Spring还支持EJB组件模型。EJB组件还提供其它的J2EE/Java EE服务,例如基于角色的认证和授权以及声明性和编程性事务管理。然而,EJB模型是一个重量级的组件模型,所以大多数业务应用程序往往敬而远之。
⑥Java消息服务(JMS)
JMS API是一种消息发送标准—允许Java应用程序异步地创建、发送、接收和处理消息。它提供了松耦合的和可靠的分布式通信。默认情况下,JMS Remoting使用Java串行化,但是一个JMS提供者(例如,WebLogic JMS或JBossMQ)能够使用另外一个不同的机制(例如XStream API)以便允许通过其它技术实现消息发送。
⑦Web服务
借助于开源Web服务引擎Apache Axis并通过JAX-RPC技术,Spring为实现基于SOAP的Web服务提供支持。Web服务提供真正的平台独立的远程技术,但是它们的建立非常复杂,而且与常规HTTP远程调用相比还需要额外的SOAP消息处理的开销。因此,在不是真正需要平台独立性的情况下,你应该尽可能避免使用Web服务。另外,你还能够使用XFire(由Codehaus开发的一个轻量级SOAP库)对Web服务进行暴露。
其实,每一种远程技术都有其优点与不足,表格1对它们进行了简单的对比。
框架 |
优点 |
缺点 |
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服务引擎。 |
表格1:各种Spring Remoting技术优缺点比较