Spring框架学习【Spring使用Hessian实现远程调用】

本文详细介绍了Spring如何使用Hessian实现远程调用。Hessian是一种轻量级的二进制协议,基于HTTP协议。在客户端,Spring通过HessianProxyFactoryBean配置远程调用代理,并使用HessianClientInterceptor拦截请求。服务端则通过HessianServiceExporter接收请求,HessianExporter处理调用并返回响应。通过对相关源码的分析,理解了Spring对Hessian支持的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Spring中除了提供HTTP调用器方式的远程调用,还对第三方的远程调用实现提供了支持,其中提供了对Hessian的支持。

Hessian是由Caocho公司发布的一个轻量级的二进制协议远程调用实现方案,Hessian也是基于HTTP协议的,其工作原理如下:

(1).客户端:

a.发送远程调用请求:

客户端程序—>发送远程调用请求—>Hessian客户端拦截器—>封装远程调用请求—>Hessian代理—>通过HTTP协议发送远程请求代理到服务端。

b.接收远程调用响应:

远程调用结果—>HTTP响应—>客户端。

(1).服务端:

a.接收远程调用请求:

远程调用HTTP请求—>HessianServiceExporter接收请求—>HessianExporter将远程调用对象封装为HessianSkeleton框架—> HessianSkeleton处理远程调用请求

b.返回远程调用响应:

HessianSkeleton封装远程调用处理结果—>HTTP响应—>客户端。

本文章通过分析Spring对Hessian支持的相关源码,了解Spring对Hessian支持的具体实现。

2.Hessian的客户端配置:

Hessian的客户端需要做类似如下的配置:

[xhtml] view plaincopyprint?
  1. <bean id=”hessianProxy” class=”org.springframework.remoting.caucho.HessianProxyFactoryBean”>  
  2. <property name=”serviceUrl”>  
  3. <value>http://hostAddress:8080/serviceUrl</value>  
  4. </property>  
  5. <property name=”serviceInterface”>  
  6. <value>远程调用服务接口</value>  
  7. ]</property>  
  8. </bean>  

和HTTP调用器的配置类似,都需要配置远程调用请求的url,这个url要和服务端的url一致,Spring通过DispatcherServlet找到服务端对于的请求url。

HessianProxyFactoryBean是Spring中管理Hessian客户端的IoC容器,主要负责产生服务端远程调用代理和对客户端远程调用的拦截器设置。

3.HessianProxyFactoryBean:

HessianProxyFactoryBean生成远程调用代理和客户端远程调用拦截器设置,其源码如下:

[java] view plaincopyprint?
  1. public class HessianProxyFactoryBean extends HessianClientInterceptor implements FactoryBean<Object> {  
  2.     //远程调用代理对象   
  3.     private Object serviceProxy;  
  4.     //Spring IoC容器依赖注入完成后的回调方法   
  5.     public void afterPropertiesSet() {  
  6.         //首先调用父类HessianClientInterceptor的回调方法   
  7.         super.afterPropertiesSet();  
  8. //创建远程调用代理对象并设置拦截器,注意这个this参数,因为//HessianProxyFactoryBean继承HessianClientInterceptor,因此其本身也   
  9. //是Hassien客户端拦截器   
  10.         this.serviceProxy = new ProxyFactory(getServiceInterface(), this).getProxy(getBeanClassLoader());  
  11.     }  
  12.     //Spring IoC容器的接口FactoryBean产生对象的方法,客户端通过该方法获取被管   
  13. //理的远程调用代理   
  14.     public Object getObject() {  
  15.         return this.serviceProxy;  
  16.     }  
  17.     //获取对象的类型   
  18.     public Class<?> getObjectType() {  
  19.         return getServiceInterface();  
  20.     }  
  21.     //对象是否是单态类型,Spring默认管理的对象都是单态模式   
  22.     public boolean isSingleton() {  
  23.         return true;  
  24.     }  
  25. }  

HessianProxyFactoryBean最核心的功能就是在IoC容器回调方法中产生远程调用代理对象,在产生远程调用代理对象时,将代理对象的拦截器设置为其父类HessianClientInterceptor

4.HessianClientInterceptor拦截客户端的远程调用请求:

HessianClientInterceptor对客户端的远程调用进行拦截,为客户端的远程调用创建Hessian代理,通过Hessian代理调用服务端远程调用对象,其源码如下:

[java] view plaincopyprint?
  1. public class HessianClientInterceptor extends UrlBasedRemoteAccessor implements MethodInterceptor {  
  2.     //创建Hessiann代理工厂   
  3.     private HessianProxyFactory proxyFactory = new HessianProxyFactory();  
  4.     //Hessian代理   
  5.     private Object hessianProxy;  
  6. //设置Hessian代理工厂   
  7.     public void setProxyFactory(HessianProxyFactory proxyFactory) {  
  8.         this.proxyFactory = (proxyFactory != null ? proxyFactory : new HessianProxyFactory());  
  9.     }  
  10.     //设置Hessian序列化工厂   
  11.     public void setSerializerFactory(SerializerFactory serializerFactory) {  
  12.         this.proxyFactory.setSerializerFactory(serializerFactory);  
  13.     }  
  14.     //设置Hessian是否发送java集合类型对象   
  15.     public void setSendCollectionType(boolean sendCollectionType) {  
  16.     this.proxyFactory.getSerializerFactory().setSendCollectionType(sendCollectionType);  
  17.     }  
  18.     //设置远程调用时是否重载方法   
  19.     public void setOverloadEnabled(boolean overloadEnabled) {  
  20.         this.proxyFactory.setOverloadEnabled(overloadEnabled);  
  21.     }  
  22.     //设置远程调用用户名   
  23.     public void setUsername(String username) {  
  24.         this.proxyFactory.setUser(username);  
  25.     }  
  26.     //设置远程调用密码   
  27.     public void setPassword(String password) {  
  28.         this.proxyFactory.setPassword(password);  
  29.     }  
  30.     //设置是否使用Hessian的Debug调试模式   
  31.     public void setDebug(boolean debug) {  
  32.         this.proxyFactory.setDebug(debug);  
  33.     }  
  34.     //设置是否使用chunked端口发送Hessian请求   
  35.     public void setChunkedPost(boolean chunkedPost) {  
  36.         this.proxyFactory.setChunkedPost(chunkedPost);  
  37.     }  
  38.     //设置Hessian等待响应的超时时长   
  39.     public void setReadTimeout(long timeout) {  
  40.         this.proxyFactory.setReadTimeout(timeout);  
  41.     }  
  42.     //设置是否使用Hessain版本2协议解析请求和响应   
  43.     public void setHessian2(boolean hessian2) {  
  44.         this.proxyFactory.setHessian2Request(hessian2); &n
Spring为各种远程访问技术提供集成工具类。Spring远程访问通过使用普通POJOs,能更容易的开发远程访问服务。目前,Spring远程访问的主要技术如下: 1. 远程调用RMI(Remote Method Invocation): 通过使用 RmiProxyFactoryBean 和 RmiServiceExporter,并且,Spring支持两个传统的RMI(使用 java.rmi.Remote接口和java.rmi.RemoteException)和通过RMI调用器实现的暴露远程调用(支持任何Java接口)。 2. Spring的HTTP调用器(Spring’s Http Invoker): Spring提供了一种特殊的允许通过HTTP进行Java串行化的远程调用策略,支持任意Java接口(就像RMI调用器)。相对应的支持类是 HttpInvokerProxyFactoryBean和 HttpInvokerServiceExporter。 3. Hessian: 通过 HessianProxyFactoryBean 和 HessianServiceExporter,可以使用Caucho提供的基于HTTP的轻量级二进制协议来透明地暴露服务。 4. Burlap: Burlap是Caucho的另外一个子项目,可以作为Hessian基于XML的替代方案。Spring提供了诸如 BurlapProxyFactoryBean 和 BurlapServiceExporter 的支持类。 5. JAX RPC: Spring通过JAX-RPC为远程Web服务提供支持(J2EE 1.4's web service API)。 6. JAX-WS:Spring通过JAX-WS为远程Web服务提供支持(the successor of JAX-RPC, as introduced in Java EE 5 and Java 6)。 7. JMS:远程访问通过类JmsInvokerServiceExporter和JmsInvokerProxyFactoryBean使用JMS的底层协议实现。 二. 远程访问------RMI 1. RMI远程访问基本流程 1). 服务端定义远程访问接口; 2). 服务端通过RmiServiceExporter暴露服务接口 3). 客户端定义与服务端已暴露的相同接口 4). 客户端通过RmiProxyFactoryBean调用服务接口
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值