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

时间:2020-03-06 14:25:25  来源:igfitidea点击:

我是Web服务和RMI的新手,我想知道哪种方法是在不同的Web应用程序之间进行远程处理的更好方法,这些应用程序都是用Java编写的,也就是说,不同的编程语言无关紧要( WS的优势)。

一方面,我可能会猜测使用Web服务时会有性能开销(有人能证明这一点吗?),另一方面,在我看来,Web服务之间的联系松散得多,可以用来实现更面向服务的体系结构(SOA)(RMI无法实现,对吗?)。

尽管这是一个很普遍的问题,我们对此有何看法?

谢谢

解决方案

我在RMI和Web服务方面的经验反映了上述猜测。通常,RMI的性能远远超过了Web服务,但是为Web服务明确规定了接口规范。

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

是否使用Web服务还是使用"本地"方法也取决于环境。如果我们必须通过代理服务器或者某些公司防火墙,则Web服务更可能起作用,因为它们仅依赖HTTP。 RMI要求我们为应用程序打开另一个端口,这在某些环境中可能很困难(但从技术上来说并非如此)...

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

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

HTH,
马丁

Web服务确实允许松散耦合的体系结构。使用RMI,我们必须确保所有应用程序实例中的类定义都保持同步,这意味着即使只更改了其中的一个,也必须始终同时部署所有它们。由于串行UUID等原因经常需要)

此外,它的伸缩性不是很好,如果我们想拥有负载均衡器,可能会遇到问题。

在我看来,RMI最适合与本地无关的小型本地应用程序,这些应用程序与Internet无关,但仍需要解耦。我已经使用它来处理一个处理电子通信的Java应用程序,并且对结果非常满意。对于需要更复杂的部署并需要在Internet上运行的其他应用程序,我宁愿使用Web服务。

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

那Spring Remoting呢。它结合了类似REST的HTTP协议和RMI的二进制格式。非常适合我。

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

对于Java到Java的应用程序,RMI是一个好的解决方案吗?如果客户机不在控制之下或者可能移至另一个平台,则应避免使用Java到Java的JAX-RPC或者JAX-WS。

相对于RMI,支持WS的一件事是WS通过HTTP端口80/443运行,该端口通常在防火墙中不被阻塞,可以在NAT等之后运行。
RMI具有非常复杂的基础网络协议,该协议要求我们打开RMI端口,并且如果客户端经过NATTED也可能无法工作。
其次,使用RMI,我们只能将文件限制为JAVA-JAVA通信,而使用Webservies,则没有这种限制。
通过Web调试Web服务要容易得多,因为数据是SOAP / HTTP,可以通过嗅探工具轻松捕获它以进行调试。我不知道通过RMI做到这一点的简单方法。
此外,RMI确实非常老,并且在最近几年没有引起太多关注。在CORBA很大的时代,这是很早的事情,而且RMI CORBA都是真正过时的技术。
最好的选择是REST风格的Web服务。