Spring框架学习【Spring HTTP调用器实现远程调用】

1.Spring中,HTTPInvoker(HTTP调用器)是通过基于HTTP协议的分布式远程调用解决方案,和java RMI一样,HTTP调用器也需要使用java的对象序列化机制完成客户端和服务器端的通信。HTTP调用器的远程调用工作原理如下:

(1).客户端:

a.向服务器发送远程调用请求:

远程调用信息——>封装为远程调用对象——>序列化写入到远程调用HTTP请求中——>向服务器端发送。

b.接收服务器端返回的远程调用结果:

服务器端返回的远程调用结果HTTP响应——>反序列化为远程调用结果对象。

(2).服务器端:

a.接收客户端发送的远程调用请求:

客户端发送的远程调用HTTP请求——>反序列化为远程调用对象——>调用服务器端目标对象的目标方法处理。

b.向客户端返回远程调用结果:

服务器端目标对象方法的处理结果——>序列化写入远程调用结果HTTP响应中——>返回给客户端。

接下来我们将从客户端和服务器端分别分析HTTP调用器远程调用的具体实现。

2.HTTP调用器客户端配置:

使用HTTP调用器之前,首先需要对客户端其进行如下的配置:

[xhtml] view plaincopyprint?
  1. <!--客户端HTTP调用器代理-->  
  2. <bean id=”proxy” class=”org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean”>  
  3. <property name=”serviceUrl”>  
  4. <value>http://yourhost:8080/远程调用URL</value>  
  5. </property>  
  6. <property name=”serviceInterface”>  
  7. <value>远程调用服务接口全路径</value>  
  8. </property>  
  9. </bean>  
  10. <bean id=”客户端bean” class=”客户端Bean全路径”>  
  11.         <property name=”remoteService”>  
  12.                 <ref bean=”proxy”/>  
  13.         </property>  
  14. </bean>  

HTTP调用器客户端代理HttpInvokerProxyFactoryBean中封装远程调用服务URL和服务接口,客户端程序通过HTTP调用代理可以调用实现了指定接口的目标服务端对象。

3.HttpInvokerProxyFactoryBean创建远程调用代理对象:

HTTP调用器客户端代理HttpInvokerProxyFactoryBean是一个实现了Spring FactoryBean接口的IoC容器,其作用是对远程服务客户端封装,源码如下:

[java] view plaincopyprint?
  1. public class HttpInvokerProxyFactoryBean extends HttpInvokerClientInterceptor implements FactoryBean<Object> {  
  2.     //远程对象的代理   
  3.     private Object serviceProxy;  
  4.     //在IoC容器注入完成之后调用   
  5.     public void afterPropertiesSet() {  
  6.         //调用父类容器的回调方法   
  7.         super.afterPropertiesSet();  
  8. //getServiceInterface()方法用于获取配置的远程调用接口   
  9.         if (getServiceInterface() == null) {  
  10.             throw new IllegalArgumentException("Property 'serviceInterface' is required");  
  11.         }  
  12.         //使用ProxyFactory代理工厂生成远程代理对象,注意第二个参数this,因为   
  13.     //HttpInvokerProxyFactoryBean继承了HttpInvokerClientInterceptor,   
  14.         //所以代理对象的拦截器设置为HttpInvokerClientInterceptor   
  15.         this.serviceProxy = new ProxyFactory(getServiceInterface(), this).getProxy(getBeanClassLoader());  
  16.     }  
  17.     //向IoC容器索取被管理对象的方法,获取产生的远程调用代理对象   
  18.     public Object getObject() {  
  19.         return this.serviceProxy;  
  20.     }  
  21.     //获取对象类型,返回配置的远程调用接口   
  22.     public Class<?> getObjectType() {  
  23.         return getServiceInterface();  
  24.     }  
  25.     //是否是单态类型,默认Spring IoC容器产生的都是单态类型   
  26.     public boolean isSingleton() {  
  27.         return true;  
  28.     }  
  29. }  

通过上面对HttpInvokerProxyFactoryBean源码的分析我们看到,当通过getObject方法向Spring IoC容器索取远程调用对象时,触发afterPropertiesSet回调方法,创建远程调用的代理对象,最后将该远程调用代理对象返回。在创建远程调用代理对象时,使用其父类HttpInvokerClientInterceptor作为远程调用代理对象的拦截器,该拦截器将拦截对代理对象的方法调用。下面我们分析HttpInvokerClientInterceptor代理拦截器对代理对象的方法拦截处理。

4.HttpInvokerClientInterceptor拦截对远程调用代理的方法调用:

当客户端通过HTTP请求调用远程调用代理的方法时,将会触发HttpInvokerClientInterceptor拦截器的invoke方法对当前的请求进行封装处理,将客户端的java对象序列化传输到服务器端,在远程服务器端执行完请求之后,又将处理结果java对象序列化返回给客户端。其源码如下:

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值