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

时间:2008-09-19 10:32:56

标签: web-services remoting jax-ws rmi

我是Web Services和RMI的新手,我想知道哪些是在不同的Web应用程序之间进行远程处理的更好方法,当这些应用程序都是用Java编写的时候,即不同的编程语言无关紧要(哪个将是WS的优势。

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

虽然这是一个非常笼统的问题,但你有什么看法?

由于

9 个答案:

答案 0 :(得分:33)

Web服务确实允许松散耦合的体系结构。使用RMI,您必须确保类定义在所有应用程序实例中保持同步,这意味着即使只更改了其中一个,您也必须同时部署它们(不一定,但它是因为串行UUID和诸如此类的东西而经常需要

此外,它的可扩展性也不高,如果您想拥有负载均衡器,可能会出现问题。

在我看来,RMI最适合较小的本地应用程序,这些应用程序不是与Internet相关的,但仍需要解耦。我用它来处理电子通信的java应用程序,我对结果非常满意。对于需要更复杂的部署和跨Internet工作的其他应用程序,我宁愿使用Web服务。

答案 1 :(得分:12)

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

如果您知道此问题不是问题,则应考虑使用RMI。 SOA不依赖于技术,而是依赖于良好的服务设计。如果您有一个EJB容器,那么您可以通过RMI调用会话bean,并且如果您确实需要,还可以将它们作为Web服务公开。

性能取决于您计划交换的数据。如果要将复杂的对象网络从一个应用程序发送到另一个应用程序,那么使用RMI可能会更快,因为它以二进制格式(通常)传输。如果您有某种文本/ XML内容,Web服务可能相同甚至更快,因为那时您根本不需要转换任何内容(用于通信)。

HTH,
马丁

答案 2 :(得分:8)

有利于WS而不是RMI的一件事是WS通过HTTP端口80/443工作,它通常不会在防火墙上被阻塞,可以在NAT之后工作等。 RMI有一个非常复杂的底层网络协议,它要求您打开RMI端口,如果客户端是NATTED,也可能不起作用。 其次,使用RMI限制你的slef到JAVA-JAVA通信,而对于Webservies则没有这样的限制。 通过线路调试Webservices要容易得多,因为数据是SOAP / HTTP,可以通过嗅探工具轻松捕获以进行调试。我不知道在RMI上做这件事的简单方法。 除了RMI真的很老,过去几年也没有受到太多关注。在CORBA很大的时代,这是一个很大的回报,而且RMI CORBA都是过时的技术。 最好的选择是REST风格的Web服务。

答案 3 :(得分:4)

我对RMI和Web服务的体验反映了您的猜测。通常,RMI的性能远远超过Web服务,但是Web服务明确规定了接口规范。

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

答案 4 :(得分:2)

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

答案 5 :(得分:2)

@Martin Klinke

“性能取决于您计划交换的数据。如果您想将复杂的对象网络从一个应用程序发送到另一个应用程序,RMI可能会更快,因为它以二进制格式(通常)传输。如果您无论如何都有某种文本/ XML内容,Web服务可能相同甚至更快,因为那时你根本不需要转换任何东西(用于通信)。“

据我所知,性能问题在序列化 - 反序列化过程中产生差异,换句话说就是编组 - 解组过程。我不确定这两个术语是否相同btw 在分布式编程中,我不是在谈论在同一个JVM中发生的过程,它是关于如何复制数据的。它是按值传递还是按引用传递。二进制格式对应于传递值,这意味着将对象复制到远程服务器在二进制文件中。如果你有任何疑问,我想听听

以编组 - 解组或序列化 - 反序列化的方式发送二进制格式和textual / xml内容之间的区别是什么?

我只是猜测。它不依赖于您发送的数据类型。无论您发送什么数据类型,它都将成为编组 - 解组过程的一部分,最后将以二进制文件的形式发送到右边?

欢呼声 哈基

答案 6 :(得分:1)

Spring Remoting怎么样?它结合了类似REST的HTTP协议和RMI的二进制格式。适合我。

答案 7 :(得分:0)

作为Spring的重要人物和SOA的代表多年来,我建议Spring远程处理。这种服务出口商将为RMI提供技巧。

org.springframework.remoting.rmi.RmiServiceExporter

当然可以使用其他运输工具。如果您明确地对接口(端点)和DTO进行版本控制,那么序列化的东西是非常可管理的。正确管理序列化UUID。我们将'Alpha','Bravo'后缀为我们的界面和对象,并增加,减少和放大在必要时重新发明。我们还将序列化UUID修复为1,并确保更改只是添加,否则我们会从'Bravo'转变为'Charlie'。所有在企业设置中都可以管理。

答案 8 :(得分:-1)

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

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