RMI与Web服务。 什么是最好的Java2Java远程处理?

我对Web服务和RMI都很陌生,我不知道在不同的Web应用程序之间进行远程处理的更好的方法是什么,当这些应用程序都是用Java编写的,也就是说不同的编程语言无关紧要的时候WS的优势)。

虽然一方面我会猜测在使用Web服务时会有性能开销(有没有人有一些数字来certificate这一点?),另一方面,在我看来,Web服务更加松散耦合,可以用来实现更多面向服务的体系结构(SOA)(这对于RMI是不可能的,对吗?)。

虽然这是一个相当普遍的问题,你的看法是什么?

谢谢

Web服务确实允许松耦合的架构。 使用RMI,您必须确保类定义在所有应用程序实例中保持同步,这意味着即使只有其中一个被更改(不一定,但它是由于串行UUID和什么而不得不经常需要)

另外它的扩展性不是很好,如果你想拥有负载平衡器,这可能是一个问题。

在我看来,RMI最适合小型的本地应用程序,这些应用程序与Internet没有关系,但仍然需要解耦。 我用它来处理电子通信的Java应用程序,我对结果非常满意。 对于需要更复杂的部署和在互联网上工作的其他应用程序,我宁愿使用Web服务。

无论您使用Web服务还是更“本地”的方法取决于环境。 如果您必须通过代理或公司防火墙,则Web服务更可能工作,因为它们仅依赖于HTTP。 RMI要求您为应用程序打开另一个端口,这在某些环境中可能很困难(不是技术上的)。

如果你知道这个问题不是问题,你应该考虑使用RMI。 SOA不像技术那么依赖于良好的服务devise。 如果你有一个EJB容器,你可以通过RMI调用会话bean,并且如果你真的需要的话,还可以把它们公开为Web服务。

性能取决于您计划交换的数据。 如果你想把复杂的对象networking从一个应用程序发送到另一个应用程序,那么RMI可能会更快,因为它通常是以二进制格式传输的。 如果您有任何forms的文本/ XML内容,Web服务可能会相当或甚至更快,因为那样您根本就不需要转换任何东西(用于通信)。

HTH,
马丁

有一件事比WS更有利于WS,WS是通过HTTP端口80/443工作的,通常在防火墙上不被阻塞,可以在NAT后面工作等等.RMI有一个非常复杂的底层networking协议,要求你打开RMI端口,如果客户端是NATTED可能无法工作。 其次,在RMI中,您将slef限制为JAVA-JAVA通信,而Webservies则没有这种限制。 由于数据是SOAP / HTTP,因此通过线路debuggingWeb服务要容易得多,通过嗅探工具可以轻松捕获这些数据以进行debugging。 我不知道一个简单的方法来通过RMI做到这一点。 除了RMI真的很老,近几年没有受到太多关注。 在CORBA大的时代,RMI CORBA都是过时的技术。 最好的select是REST风格的Web服务。

我对RMI和Web服务的经验反映了上面的猜测。 一般来说,RMI的性能远远超过Web服务,但Web服务明确规定了接口规范。

请注意,这些协议都不要求双方的应用程序都是Java。 当我有一个或多个正在实现接口的外部合作伙伴时,我倾向于使用Web服务,但是如果我在控制连接的两端,则使用RMI。

如果您需要维护复杂的状态,RMI可能是更好的方向。

@Martin Klinke

“性能取决于你打算交换的数据,如果你想把复杂的对象networking从一个应用程序发送到另一个应用程序,使用RMI可能会更快,因为它是以二进制格式(通常)传输的。的文本/ XML内容,Web服务可能是等价的,甚至更快,因为那样你根本就不需要转换任何东西(用于通信)。

据我所知,性能问题在序列化 – 反序列化中有所不同,也就是编组 – 解组过程。我不确定这两个术语是否相同。在分布式编程中,我不是在谈论在同一个JVM中发生的过程,它是关于如何复制数据。它是通过值或通过引用。二进制格式相当于传递值,这意味着复制一个对象到远程服务器的二进制文件。如果您有任何疑问,直到现在我喜欢听

在编组 – 解码或序列化 – 反序列化方面,以二进制格式发送和text / xml内容有什么区别?

我只是猜测。它不依赖于你发送的数据types。无论你发送什么样的数据types,它都是编组 – 解集过程的一部分,最后会发送到二进制文件中吗?

欢呼哈基

那么Spring Remoting呢? 它将类似REST的HTTP协议与RMI的二进制格式结合在一起。 为我完美的作品。

对于Spring Remoting(我猜你是指HTTP Invoker),双方都应该使用Spring,如果是这样的话可以讨论。

对于Java到Java的应用程序,RMI是一个很好的解决scheme,如果客户端不在您的控制之下,或者可能移动到另一个平台,则应避免使用JAX-RPC或JAX-WS进行Java到Java的通信。

作为Spring的偏执者和多年的SOA的指数,我build议Spring远程处理。 这种服务出口商的口味将为RMI做好准备。

org.springframework.remoting.rmi.RmiServiceExporter 

其他运输当然可用。 序列化的东西是相当pipe理的,如果你的版本你的接口(端点)和DTO合理和pipe理序列化UUIDs正确。 我们将postfix'Alpha','Bravo'添加到我们的接口和对象,并在必要时增加,减less和重新创build。 我们还将我们的序列化UUID修正为1,并确保更改只是补充,否则我们从说'布拉沃'移动到'查理'。 所有在企业设置pipe理。