【有书共读】《Spring源码深度解读》第12章远程服务
第12章 远程服务
RMI全部的宗旨就是尽可能地简化远程接口对象的使用。Java RMI极大的依赖于接口。在需要创建一个远程对象时,通过传递接口隐藏实现细节。客户端得到的远程对象正好与本地的根代码连接,右后者负责透过网络通信,程序员只需要关心如何通过自己的接口句柄发送消息。
12.1服务端实现
服务端定义了两个bean,一个是对接口实现类的发布,另一个是对RMI服务的发布。在RMIServiceExporter中实现了几个比较敏感的接口。BeanClassLoaderAware,DisposableBean,InitializingBean。DisposableBean接口保证在实现该接口的bean销毁时调用destory方法,BeanClassLoaderAware接口保证在实现该接口的bean初始化时调用setBeanClassLoader方法。InitializingBean接口则是保证在实现该接口的bean初始化时调用afterPropertiesSet方法,这个是功能的初始化入口。这个过程中一共经历了:
(1)验证service
(2)处理用户自定义的SocketFactory属性
(3)根据配置参数获取Registry
(4)构造对外发布实例
(5)发布实例
12.2HttpInvoker
HttpInvoker是一个新的远程调用模型,作为spring框架的一部分,来执行基于Http的远程调用,并使java序列化机制。
服务端实现:服务器的实现类HttpInvokerServiceExporter类实现了InitialzingBean接口以及HttpRequestHandler接口。在分析RMI服务时我们已经了解到,当某个Bean继承自InitialzingBean接口的时候,spring会确保这个bean在初始化时调用afterPropertiesSet方法,而对于HttpRequestHandler接口,因为我们在配置中已经将此接口配置成web服务,那么当有相应请求的时候,spring的web服务就会将程序引导至httpRequestHandler的handleRequest方法中。
客户端实现:在服务端调用HttpServletRequest提取客户端传来的RemoteInvocation实例,然后进行相应解析。所以,在客户端,一个比较重要的任务就是构建RemoteInvocation实例,并传送到服务端。在客户端类HttpInvokerProxyBean实现了InitialzingBean接口。同时,又实现了FactoryBean以及MethodInterceptor。在HttpInvokerProxyFactoryBean类的invoke方法中,主要有三个步骤:(1)构建RemoteInvocation实例
(2)远程执行方法
(3)提取结果
这三个步骤中最为关键的是元辰该方法的执行。执行远程调用的首要步骤就是将调用方法的实例写入输出流中。
客户端实现的逻辑
(1)创建httpPost
(2)设置RequestBody
(3)执行远程方法
(4)远程相应验证
(5)提取响应信息
(6)提取返回结果