稍微看了一下Spring的远程服务章节,讲到了RMI,Hessian,Burlap,Http invoker以及JAX-WS
1.RMI
原理:
1)在Spring服务端使用RmiServiceExporter将一个Spring bean包装在RMI的适配器里,并将这个适配器注册到服务端的RMI服务的ip和端口上,注册RMI服务
2)在客户端则使用一个代理工厂生成一个代理对象负责与远程的RMI服务进行通信,这个代理对象当做本地pojo这样使用
缺点:
1)由于使用任意端口交互,难以穿越防火墙
2)RMI基于Java,它使用了Java的序列化机制,因此服务端和客户端之间传输的对象必须保证是相同版本
2.Hessian共和Burlap
Hessian和Burlap分别是基于二进制和XML的远程调用技术,因此他们可以移植到其他非Java语言中,包括PHP,Python,C++,C#
原理:
1)在服务端配置一个叫HesseianServiceExporter的Spring MVC控制器,它负责接收请求并将请求翻译成POJO的调用
2)在客户端上的配置跟RMI差不多
缺点:使用私有序列化机制,对Java的序列化机制支持不好
优点:基于HTTP,解决了防火墙渗透问题
3.Spring HttpInvoker
工作流程跟前者差不多
优点:基于Http,解决了防火墙渗透问题和Java对象序列化问题
缺点:他是Spring框架提供的解决方案,所以服务端和客户端必须都是Spring应用
4.JAX-WS
是一个基于SOAP的Web服务,看起来搭建和调用流程跟前者都差不多,原理上完全没搞懂...
总的来说以上四种解决方案似乎都跟Java耦合,他们都需要在客户端程序里配置远程调用接口的代理类,会造成的问题就是
1.异步请求当代理类还未从服务端返回数据时代理类的处理逻辑该怎么做
2.客户端的代理类接口来自服务端,那么就需要服务端发布这个代理类的具体接口标准,加入这个接口更新,两边还需要同步