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的调用过程:
图1 Spring HTTP invoker的调用过程
客户端
(1)向服务器发送远程调用请求:
远程调用信息-->封装为远程调用对象-->序列化写入到远程调用HTTP请求中-->向服务器端发送
(2)接收服务器端返回的远程调用结果:
服务器端返回的远程调用结果HTTP响应-->反序列化为远程调用结果对象
服务端
(1)接收客户端发送的远程调用请:
客户端发送的远程调用HTTP请求-->反序列化为远程调用对象-->调用服务器端目标对象的目标方法处理
(2)向客户端返回远程调用结果:
服务器端目标对象方法的处理结果-->序列化写入远程调用结果HTTP响应中-->返回给客户端。
(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的序列化机制在网络间传递对象。
联系客服