Spring HTTP Invoker使用介绍
Spring HTTP invoker是spring框架中的一个远程调用模型,它的执行基于HTTP的远程调用,并使用JAVA的序列化机制在网络间传递对象,客户端可以很轻松的像调用本地对象一样调用远程服务器上的对象。 在JAVA语言中实现远程方法调用的框架比较多,下面先来做一个对比: (1)RMI: 使用JRMP协议(基于TCP/IP),不允许穿透防火墙,使用JAVA系列化方式,使用于任何JAVA应用之间相互调用。 (2)Hessian:使用HTTP协议,允许穿透防火墙,使用自己的系列化方式,支持JAVA、C++、.Net等跨语言使用。 (3)Burlap: 与Hessian相同,只是Hessian使用二进制传输,而Burlap使用XML格式传输(两个产品均属于caucho公司的开源产品)。 (4)Web Service:跨平台、跨语言、支持SOAP(简单对象访问协议)、提供wsdl的web service描述性语言,他结构比较庞大,依赖特定的web service实现,例如cxf、axis框架等。 (5)Spring HTTP Invoker: 使用HTTP协议,允许穿透防火墙,使用JAVA系列化方式,但仅限于Spring应用之间使用,即调用者与被调用者都必须是使用Spring框架的应用。它的缺点也很明显,只支持JAVA语言,依赖于Spring框架本身。 注意:项目中使用哪种远程调用机制取决于项目本身的要求。 一、Spring HTTP invoker调用原理
首先通过一张序列图来了解一下Spring HTTP invoker的调用过程: 图1 Spring HTTP invoker的调用过程 客户端 (1)向服务器发送远程调用请求: (2)接收服务器端返回的远程调用结果: 服务端 (1)接收客户端发送的远程调用请: (2)向客户端返回远程调用结果: 二、服务端实现
(1)IRemoteSyncServertInfo.java接口: public interface IRemoteSyncServerConvertInfo { public String syncConvertInfo(MessageLog tool) throws Exception; } (2)IRemoteSyncServertInfoImpl.java接口的实现类: public class RemoteSyncServerConvertInfoImpl implements IRemoteSyncServerConvertInfo { @Override public String syncConvertInfo(final MessageLog message) { //TODO } } (3)MessageLog.java客户端和服务器所传递的序列化对象: public class MessageLog implements Serializable{ private static final long serialVersionUID = 1L; //TODO } 注意:如果服务器端与客户端要传递的是对象,该对象必须是序列化对象,否则对应不上,例如 MessageLog implements Serializable;除了传递序列化对象还可以传递字符串等参数。 (2)在spring.xml的配置文件里进行配置: 在Spring配置文件中声明一个HttpInvokerServiceExporter类的bean,共四部分: --服务名称(如remoteSyncServerConvertInfoImpl) --服务类型(如com.assoft.dc.rmiserver.impl.RemoteSyncServerConvertInfoImpl) --服务实现类,一般引用其它bean(如serviceInterface) --服务端口(如registryPort) 图2 服务器端spring.xml配置文件 (3)在web.xml的配置文件里进行配置: 在web.xml中声明一个服务与spring配置文件提供的服务名称同名的Servlet(当然这个Servlet类Spring已经提供即HttpRequestHandlerServlet,它作用就是去拦截url- pattern匹配的请求,如果匹配成功,去ApplicationContext(remote-servlet.xml)中查找name与servlet-name一致的bean,完成远程方法调用。 图3 服务器端web.xml配置文件 三、客户端实现
(1)因为客户端依赖服务端的服务类,所以需要设置类路径依赖,可以将class文件(或者jar包)拷贝到客户端。 (2)在spring.xml的配置文件里进行配置: 在spring配置文件中创建一个类HttpInvokerProxyFactoryBean的bean,指定serviceUrl属性为服务器端的服务提供的URL,serviceInterface属性为服务器端配置的服务类型。 图4 客户端spring.xml配置文件 (3)Client.java客户端调用类: 图5 客户端调用类 (4)先把服务器端启动,然后运行客户端程序进行调用服务器端提供的接口方法,实现JAVA的序列化机制在网络间传递对象。 |
|