Java RMI和RPC有什么区别?

175

Java RMI和RPC之间的实际区别是什么?

我在一些地方读到RMI使用对象?


我认为Java中的RMI与.Net中的gRPC类似... - Yousha Aleayoub
8个回答

148

RPC基于C语言,因此具有结构化编程语义;而RMI是基于Java的技术,它是面向对象的。

在RPC中,您只能调用导出到服务器的远程函数,在RMI中,您可以引用远程对象并调用其方法,并且还可以传递和返回更多的远程对象引用,这些引用可以分布在许多JVM实例之间,因此它更加强大。

当需要开发比纯客户端-服务器架构更复杂的应用程序时,RMI非常突出。它非常容易在网络上分布对象,使所有客户端都能够通信,而无需显式地建立单独的连接。


23
这是不正确的。RPC也基于Java。JAX-RPC 1.1被2.0取代,然后改名为JAX-WS。在Java中,当提到RPC时,就是指SOAP和Web服务。这里有一篇IBM文章介绍了JAX-RPC 1.1变为JAX-WS的情况。http://www.ibm.com/developerworks/library/ws-tip-jaxwsrpc/ - MattC
3
我认为你所链接的文章指出了这个名称从 "JAX-RPC" 更改为 "JAX-WS" 的原因正是因为最初的名称不准确,因为这个规范涉及到的不仅仅是传统意义上的“RPC”。因此,这个回答谈论了RPC的传统含义,仍然是正确的。 - xji
2
是的,我的意思是RPC起源于C/Unix世界(至少最常见的RPC实现ONCRPC),因此它是基于该计算模型建模的;当然,任何其他编程语言都可以在其上实现。 - fortran
7
意见在语义使用上的一点差异不会使答案错误(或误导)。任何阅读此文的人都可以很容易地理解,“基于C”的基本意思是“面向过程的” - 任何学习过Java的人都知道POP与OOP的区别。 - Navin Israni
2
@xji JAX-RPC是基于Java的。原始的Sun RPC是基于C的,但这个想法可以在许多语言中实现,包括Java。 - user207421
显示剩余2条评论

47

RPC与RMI的主要区别在于RMI涉及到对象。我们不再使用代理函数来远程调用过程,而是使用代理对象

RMI更透明,这主要归功于对象、引用、继承、多态和异常的利用,因为这些技术已经集成到语言中。

RMI比RPC还要先进,允许动态调用,其中接口可以在运行时更改,以及提供了一个额外的抽象层对象适配器


18

1. 方法:

RMI使用面向对象的范例,用户需要知道他需要调用的对象和该对象的方法。

RPC不涉及对象,只是调用已经建立好的特定子程序。

2. 工作原理:

使用RPC,您获得的过程调用看起来与本地调用非常相似。RPC处理将调用从本地计算机传递到远程计算机所涉及的复杂性。

RMI执行相同的操作,但是RMI会传递对正在调用的对象和方法的引用。

RMI = RPC + 面向对象

3. 更好的方法:

与RPC相比,特别是在大型程序中,RMI是更好的方法,因为它提供了更干净的代码,如果出现问题,更易于识别。

4. 系统示例:

RPC系统: SUN RPC,DCE RPC

RMI系统: Java RMI,CORBA,Microsoft DCOM/COM+,SOAP(简单对象访问协议)


在我的应用程序中,我正在使用JAX-WS来公开/消费SOAP服务。我可以称其为RPC类型机制吗?据我所知,在JAX-WS中,我们是使用Java反射API调用远程方法。因此,它与RPC的定义相匹配。请确认! - Gunjan Shah
据我所知,JAX-WS标准要求可序列化的实例(或至少是序列化器实例来处理可能出现在上下文中的任何类/实例)。因此,基本上,您必须在服务器之间来回传递对象(除了实现安全性之外,没有其他保证可以防止开销或安全问题),而不仅仅是一个“小型远程引用”... - Mismatch

13

远程过程调用(RPC)是一种进程间通信方式,允许在本地或远程计算机上调用另一个进程中的函数。

远程方法调用(RMI)是一个API,使用面向对象的编程范式在Java中实现了RPC。

  1. 您可以将调用RPC视为调用C程序。RPC支持原始数据类型,而RMI支持将方法参数/返回类型作为Java对象。

  2. RMI易于编程,不像RPC那样复杂。您可以将业务逻辑视为对象,而不是原始数据类型的序列。

  3. RPC是语言无关的,而RMI仅限于Java。

  4. RMI比RPC略慢。

请查看此文章以获取C语言中的RPC实现。


6
RMI或远程方法调用与RPC或远程过程调用非常相似,客户端都向服务器发送代理对象(或存根),但微妙的区别在于客户端RPC通过代理函数调用函数,而RMI通过代理函数调用方法。由于是RPC的面向对象版本,因此RMI被认为略微优越。 来自这里
有关更多信息和示例,请看这里

5
在Java中,函数被称为方法(method),而在C/C++中方法被称为函数(function)。那么它们之间的区别是什么呢? - starcorn
1
不同之处在于(对于实例方法),存在一个调用对象。调用对象需要被发送(连同其代码一起)或需要存在于远程服务器上,但必须有一种方式在本地服务器上引用它。 - Ellen Spertus
忽略编程语言如何处理方法和函数的区别,从文学意义上讲,函数返回一个值,而方法修改状态。 - Dan
RPC通过代理函数调用函数,而RMI使用代理对象调用方法。对吧? - Noor Nawaz
客户端通常不会“向服务器发送代理对象(或存根)”。引用质量较差。 - user207421

6

RMI和RPC的区别在于:

  • RMI,即远程方法调用,它调用一个方法或对象。
  • RPC,它调用一个函数。

2
你隐含强调的 methodfunction 之间有什么不同,但没有明确说明?在 Java 中没有函数...但在面向对象编程中,据我所记,它们是同义词,invocationcall 也是如此。 - mins
RPC 调用一个过程/函数 - 直截了当。 - foo

6
RPC和RMI之间唯一真正的区别在于RMI涉及对象:我们不是通过代理函数调用函数,而是通过代理调用方法。

3

RPC 是一种基于 C 的老协议。它可以调用远程过程并使其看起来像本地调用。RPC 处理传递该远程调用到服务器并将结果返回给客户端的复杂性。

Java RMI 也实现了同样的功能,但略有不同。它使用对远程对象的引用。因此,它发送一个远程对象的引用以及要调用的方法的名称。这更好,因为在大型程序的情况下会产生更清洁的代码,并且对象在网络上的分布使多个客户端能够调用服务器中的方法,而无需单独建立每个连接。


3
“RPC”具体指的是哪个协议?据我所知,有24种RPC协议,其中一半适用于Java。 - foo
@foo 毫无疑问,他指的是Sun-RPC,但所有RPC都意味着远程过程调用,没有对象或方法,因此这并不是很相关。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接