本质上,RMI与RPC都是远过程调用,在实际应用情景中,这些技术用于分布式的不同系统间进行功能调用!但如果追究起来,这两个概念还是有一些区别的,RPC是一个很早就出现的概念,而RMI通常来说就是指不同的java系统间的远程调用:
RMI和RPC之间最主要的区别在于方法是如何被调用的。在RMI中,远程接口使每个远程方法都具有方法签名。如果一个方法在服务器上执行,但是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。
在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,通常形成“classname.methodname”的形式。这就向RPC服务器表明,被请求的方法在为“classname”的类中,名叫“methodname”。然后RPC服务器就去搜索与之相匹配的类和方法,并把它作为那种方法参数类型的输入。这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。
通常,我们接触的不用系统间的交互,从调用返回上看,会有同步调用,异步调用之分;从两端系统结构上看,会有同构的系统间调用,和异构的系统间调用。从上面的描述可以看出,RPC支持的是同步的异构系统调用,RMI支持的是同步的同构(都是java)系统调用!异步调用,通常指使用消息中间件来进行,如IBM的MQ或者Apache的ActiveMQ,这里暂不详述。