我是Web服务和RMI的新手,我想知道哪种是在不同的Web应用程序之间进行远程处理的更好方法,当这些应用程序都是用Java编写的时候,就是当不同的编程语言无关紧要时(这将是WS的优点).
虽然一方面我猜想在使用Web服务时有一个性能开销(有没有人有一些数字可以证明这一点?),另一方面,在我看来,Web服务更加松散耦合,可以用来实现更加面向服务的体系结构(SOA)(RMI无法实现,对吧?).
虽然这是一个非常普遍的问题,但你有什么看法?
谢谢
Web服务确实允许松散耦合的体系结构.使用RMI,您必须确保类定义在所有应用程序实例中保持同步,这意味着即使只更改了其中一个,您也必须同时部署它们(不一定,但它是因为串行UUID和诸如此类的东西而经常需要)
此外,它不是非常可扩展,如果您想拥有负载平衡器,这可能是一个问题.
在我看来,RMI最适合较小的本地应用程序,这些应用程序不是与Internet相关的,但仍需要解耦.我用它来处理电子通信的java应用程序,我对结果非常满意.对于需要更复杂的部署和跨Internet工作的其他应用程序,我宁愿使用Web服务.
无论您使用Web服务还是更"本机"方法,都取决于环境.如果您必须通过代理或某些公司防火墙,Web服务更有可能工作,因为它们仅依赖于HTTP.RMI要求您为您的应用程序打开另一个端口,这在某些环境中可能很难(不是技术上的)......
如果您知道此问题不是问题,则应考虑使用RMI.SOA不依赖于技术,而是依赖于良好的服务设计.如果你有一个EJB容器,你可以通过RMI调用会话bean,并且如果你真的需要,还可以将它们作为Web服务公开.
性能取决于您计划交换的数据.如果要将复杂的对象网络从一个应用程序发送到另一个应用程序,那么使用RMI可能会更快,因为它以二进制格式(通常)传输.如果您有某种文本/ XML内容,Web服务可能相同甚至更快,因为那时您根本不需要转换任何内容(用于通信).
HTH,
马丁
有利于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服务.