一方面,使用Web服务会带来一些性能开销(有没有人有相关数据可以证明?);另一方面,Web服务似乎更加松耦合,可以用于实现更加面向服务的体系结构(SOA),而采用RMI则不太可能做到这一点。
虽然这是一个相当普遍的问题,但您有什么看法呢?
谢谢。
Web服务允许松散耦合的架构。而使用RMI,您必须确保所有应用程序实例中的类定义保持同步,这意味着即使只更改其中一个(不一定是必需的,但由于序列UUID等原因通常需要),也必须同时部署所有应用程序实例。
此外,它并不是非常可扩展的,如果您想要具有负载均衡器可能会出现问题。
在我看来,RMI最适合较小的本地应用程序,它们与互联网无关但仍需要解耦。我曾经使用它来处理电子通信的Java应用程序,并对结果感到满意。对于其他需要更复杂的部署并跨越互联网工作的应用程序,我宁愿使用Web服务。
我的 RMI 和 Web Services 的经验与您上面的猜想相似。一般来说,如果通信要求是复杂对象,RMI 的性能优于 Web Services。必须明确指定 JEE 接口规范以便使用 Web Services。
请注意,Web Services 是互操作的,而 RMI 不是(就客户端和服务器的技术而言)。当我有一个或多个外部合作伙伴实施接口时,我倾向于使用 Web Services, 但是如果我控制连接的两端,则使用 RMI。
@Martin Klinke
"性能取决于您计划交换的数据。如果您想将复杂对象网络从一个应用程序发送到另一个应用程序,使用RMI可能会更快,因为它以二进制格式传输(通常情况下)。如果您已经有某种文本/XML内容,则Web服务可能是等效甚至更快的,因为这样您就不需要转换任何内容(进行通信)。
据我所知,在序列化-反序列化过程中,性能问题与其要交换的数据有关。我不确定这两个术语是否相同,顺便说一下。在分布式编程中,我谈论的不是在同一JVM中发生的过程,而是关于如何复制数据。它可以是按值传递或按引用传递。二进制格式对应于按值传递,这意味着将对象以二进制形式复制到远程服务器。如果您到现在还有疑问,我很乐意听取意见。
在序列化-反序列化或者编组-解组方面,以二进制格式和文本/XML内容发送之间有什么区别吗?
我只是猜测。这并不取决于您发送的数据类型。无论您发送什么数据类型,它都将成为编组-解组过程的一部分,并最终以二进制形式发送,对吧?
祝好 Hakki
"如果您需要维护复杂状态,则RMI可能是更好的选择。
org.springframework.remoting.rmi.RmiServiceExporter
Spring Remoting怎么样呢?它将REST-like HTTP协议与RMI的二进制格式相结合。对我来说非常完美。
对于Spring Remoting(我猜你指的是HTTP Invoker),双方都应该使用Spring,如果是这种情况,可以进行讨论。
对于Java到Java应用程序,RMI是一个很好的解决方案,如果客户端不在您的控制范围内或可能移动到另一个平台,则应避免使用JAX-RPC或JAX-WS进行Java到Java通信。