Java 远程通讯技术及原理分析( 五 )


4.1 RPC与RMI

  1. RPC跨语言,而RMI只支持Java 。
  2. RMI调用远程对象方法,允许方法返回Java对象以及基本数据类型,而RPC不支持对象的概念,传送到RPC服务的消息由外部数据表示 (External Data Representation, XDR) 语言表示,这种语言抽象了字节序类和数据类型结构之间的差异 。只有由 XDR 定义的数据类型才能被传递,可以说 RMI 是面向对象方式的Java RPC 。
  3. 在方法调用上,RMI中,远程接口使每个远程方法都具有方法签名 。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用 。在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式 。这就向RPC服务器表明,被请求的方法在为 “classname”的类中,名叫“methodname” 。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入 。这里的参数类型是与RPC请求中的类型是匹配的 。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方 。
  4. RPC本身没有规范,但基本的工作机制是一样的,即:serialization/deserialization+stub+skeleton,宽泛的讲,只要能实现远程调用,都是RPC,如:rmi .net-remoting ws/soap/rest hessian xmlrpc thrift potocolbuffer 。
  5. 在Java里提供了完整的sockets通讯接口,但sockets要求客户端和服务端必须进行应用级协议的编码交换数据,采用sockets是非常麻烦的 。一个代替Sockets的协议是RPC(Remote Procedure Call), 它抽象出了通讯接口用于过程调用,使得编程者调用一个远程过程和调用本地过程同样方便 。RPC 系统采用XDR来编码远程调用的参数和返回值 。但RPC并不支持对象,所以,面向对象的远程调用RMI(Remote Method Invocation)成为必然选择 。采用RMI,调用远程对象和调用本地对象同样方便 。RMI 采用JRMP(Java Remote Method Protocol)通讯协议,是构建在TCP/IP协议上的一种远程调用方法 。
 
4.2 JMS与RMI
  1. 采用JMS服务,对象是在物理上被异步从网络的某个JVM 上直接移动到另一个JVM 上(是消息通知机制),而RMI对象是绑定在本地JVM 中,只有函数参数和返回值是通过网络传送的(是请求应答机制) 。
  2. RMI一般都是同步的,也就是说,当client调用Server的一个方法的时候,需要等到对方的返回,才能继续执行client端,这个过程调用本地方法感觉上是一样的,这也是RMI的一个特点 。JMS 一般只是一个点发出一个Message到Message Server,发出之后一般不会关心谁用了这个message 。所以,一般RMI的应用是紧耦合,JMS的应用相对来说是松散耦合应用 。
 
4.3 Webservice与RMI
RMI是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言,客户端和服务端都必须是java 。webservice没有这个限制,webservice是在http协议上传递xml文本文件,与语言和平台无关 。
4.4 Webservice与JMS
Webservice专注于远程服务调用,jms专注于信息交换 。
大多数情况下Webservice是两系统间的直接交互(Consumer Producer),而大多数情况下jms是三方系统交互(Consumer Producer) 。当然,JMS也可以实现request-response模式的通信,只要Consumer或Producer其中一方兼任broker即可 。
JMS可以做到异步调用完全隔离了客户端和服务提供者,能够抵御流量洪峰;WebService服务通常为同步调用,需要有复杂的对象转换,相比SOAP,现在JSON,rest都是很好的http架构方案;
JMS是java平台上的消息规范 。一般jms消息不是一个xml,而是一个java对象,很明显,jms没考虑异构系统,说白了,JMS就没考虑非java的东西 。但是好在现在大多数的jms provider(就是JMS的各种实现产品)都解决了异构问题 。相比WebService的跨平台各有千秋吧 。
5 可选实现技术 
目前java领域可用于实现远程通讯的框架或library,知名的有:JBoss-Remoting、Spring-Remoting、Hessian、Burlap、XFire(Axis)、ActiveMQ、Mina、Mule、EJB3等等,来对每种做个简单的介绍和评价,其实呢,要做分布式服务框架,这些东西都是要有非常深刻的了解的,因为分布式服务框架其实是包含了解决分布式领域以及应用层面领域两方面问题的 。
当然,你也可以自己根据远程网络通信原理(transport protocol+Net IO)去实现自己的通讯框架或library 。
那么在了解这些远程通讯的框架或library时,会带着什么问题去学习呢?
  1. 是基于什么协议实现的?
  2. 怎么发起请求?


    推荐阅读