1.Spring远端调用的应用场景
应用使用远端过程调用非常方便,既不需要改变原来系统的相关实现接口,也不需要为远端调用功能增加新的封装负担。
2.Spring远端调用的设计概览
RMI
HTTP调用器
第三方远端调用库Hessian/Burlap
基于Java RMI的解决方案
Spring远端调用的类设计(客户端封装部分)
3.Spring远端调用的实现
3.1 Spring HTTP调用器的实现
1.设计原理和实现过程
作为Spring远端调用的一种实现方式,最为简单的应该是通过HTTP调用器的实现;在这种实现中,不需要依赖于第三方组件,并且,对于远程调用的实现来说,只需要通过HTTP协议就能实现,基于HTTP协议的远程调用的封装,Spring已经完成。
在这个HTTP调用器的设计中,并不需要依赖其他的第三方模块,主要通过HTTP协议,通过HTTP协议的对象序列化和反序列化,以及Spring的MVC模块来处理HTTP请求和响应的。
2.配置HTTP调用器客户端
使用HTTP调用器和使用Java RMI一样,需要使用Java 的序列化机制来完成客户端和服务端的通信。
3.HTTP调用器客户端的实现
使用ProxyFactory生成代理对象、为代理对象设置代理接口方法,并把ProxyFactory生成的代理对象设置给serviceProxy对象,也就是生成的代理对象,提供给了访问远端调用的客户端应用。
HTTP调用器客户端实现的时序
通过FactoryBean的封装,getObject实际上取得的是一个代理对象。
在SimpleHttpInvokerRequestExecutor的实现中,封装了整个HTTP调用器客户端实现的基本过程:
1,它会打开一个HTTP链接,
2,通过HTTP对象序列化,把封装好的调用场景,也就是在前面生成的RemoteInvocation传送到服务器端,请求服务响应
3,在服务端完成服务以后,会把执行结果,以对象序列化的方式回送给HTTP响应(HTTPResponse)
4,客户端应用,也就是在这个executeRequest方法中,会从HTTP响应中读出远端服务的执行结果
HTTP调用器客户端完成远端调用的基本过程:
首先由客户端应用调用代理方法,在调用发生以后,代理类会先运行拦截器,对代理的方法调用进行拦截。在拦截器的拦截行为中,先对本地发生的方法调用进行封装,具体来说,就是封装成MethodInvocation对象。然后,把这个MethodInvocation对象,通过序列化和HTTP请求发送到服务器端,在服务器端的处理完成以后,会通过HTTP响应返回处理结果,这个处理结果被封装在RemoteInvocationResult对象中。
4.配置HTTP调用器远端服务器端
通过简单的配置可以在服务器端导出远端服务,具体的远端服务是通过service属性中配置的Bean来提供的。
5.HTTP调用服务器端的实现
HTTP调用服务器端实现时序
3.2Spring Hession/Burlap的实现原理
1.设计原理和实现过程
2.Hession/Burlap客户端的配置
3.Hessian客户端的实现
Hessian客户端的实现时序
4.Burlap客户端的实现
5.Hessian/Burlap服务器端的配置
6.Hessian服务器端的实现
Hessian服务器端的设计时序
7.Burlap服务器端的实现
3.3Spring RMI的实现
1.设计原理和实现过程
在使用RMI实现远端调用服务的时候,它的网络通信实现是基于TCP/IP协议完成的,而不是通过前面看到的HTTP协议,从而完成数据的通信传输。
2.Spring RMI客户端的配置
3.Spring RMI客户端的实现
Spring RMI客户端实现的设计时序
RMI客户端基础设施的封装是由拦截器RmiClientInterceptor来完成的,这个拦截器的设置是在RmiProxyFactoryBean生成的代理对象中完成。
4.Spring RMI服务器端的配置
在RMI中,基于TCP/IP 协议,而不是HTTP来实现基本的网络通信,RMI的网络通信是Java RMI实现的一部分,所以这里不需要过使用Spring MVC的DispatcherServlet来配置远端服务的服务URL以及控制服务请求的转发。在服务器端的配置中,除了需要指定提供服务的Bean及代理的服务接口之外,还需要通过serviceName属性来配置服务的导出位置,同时使用registryPort来指定RMI监听的TCP/IP端口。
5.Spring RMI服务器端的实现
通过RmiServiceExporter来导出RMI服务。