《Spring技术内幕:深入解析Spring架构与设计原理》笔记之七(Spring远端调用的实现)

1.Spring远端调用的应用场景

应用使用远端过程调用非常方便,既不需要改变原来系统的相关实现接口,也不需要为远端调用功能增加新的封装负担。

2.Spring远端调用的设计概览

RMI

HTTP调用器

第三方远端调用库Hessian/Burlap

基于Java RMI的解决方案

Spring远端调用的类设计(客户端封装部分)

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之七(Spring远端调用的实现)_第1张图片

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调用器客户端实现的时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之七(Spring远端调用的实现)_第2张图片

通过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调用服务器端实现时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之七(Spring远端调用的实现)_第3张图片

3.2Spring Hession/Burlap的实现原理

1.设计原理和实现过程

2.Hession/Burlap客户端的配置

3.Hessian客户端的实现

Hessian客户端的实现时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之七(Spring远端调用的实现)_第4张图片

4.Burlap客户端的实现

5.Hessian/Burlap服务器端的配置

6.Hessian服务器端的实现

Hessian服务器端的设计时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之七(Spring远端调用的实现)_第5张图片

7.Burlap服务器端的实现

3.3Spring RMI的实现

1.设计原理和实现过程

在使用RMI实现远端调用服务的时候,它的网络通信实现是基于TCP/IP协议完成的,而不是通过前面看到的HTTP协议,从而完成数据的通信传输。

2.Spring RMI客户端的配置

3.Spring RMI客户端的实现

Spring RMI客户端实现的设计时序

《Spring技术内幕:深入解析Spring架构与设计原理》笔记之七(Spring远端调用的实现)_第6张图片

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服务。

你可能感兴趣的:(spring)