Web Services、EJB和RMI的优缺点比较?

59

如果所有工作都在我的Web服务器上完成,它很快就会过载。我打算在其后架设第二个服务器来处理数据。

EJB相对于RMI的优势是什么?反之呢?

那么Web服务(SOAP,REST)呢?

3个回答

124

EJB是建立在RMI之上的,两者都涉及Java客户端和Bean。如果您的客户端需要使用其他语言编写(例如.NET、PHP等),请使用Web服务或其他支持平台无关的传输协议(如HTTP或XML over HTTP或SOAP)。

如果选择RMI,则不需要Java EE EJB应用服务器。您必须保持客户端和服务器JVM同步;您无法升级客户端而不升级服务器。您必须自己编写EJB应用服务器提供的所有服务(例如连接池、命名和目录服务、池化、请求排队、事务等)。

RMI在思考时相当低级。为什么要退回到CORBA呢?

与Spring相比,更好的选择是EJB 3.0。这取决于您是否喜欢POJO开发,是否想要除ORM和JPA之外的关系技术选择等因素。

您可以支付Java EE应用服务器(例如WebLogic、WebSphere)的费用,也可以使用开源的服务器(JBOSS、Glassfish、OpenEJB和ActiveMQ),或者坚持使用Spring并在Tomcat、Jetty、Resin或任何其他Servlet/JSP引擎上部署。

Spring通过技术无关性提供了很多选择:持久化(Hibernate、iBatis、JDBC、JDO、JPA、TopLink)、远程调用(HTTP、Hessian、Burlap、RMI、SOAP Web服务)等。

EJB 3.0是一个有多个供应商实现的规范;Spring只能从Spring Source获得。

我建议使用Spring。它非常稳定,具有很高的吸引力,并且不会消失。它留下了您所有的选择。

Web服务在理论上很棒,但有一些需要注意的问题:

  1. 延迟。福勒的分布式对象第一定律:“不要这样做!”由许多细粒度分布式SOAP服务组成的架构看起来优美、美观,但速度慢得像糖浆。在分布时请三思而后行。
  2. 从XML到对象的编排以及反向操作会消耗CPU周期,除了允许客户端使用跨平台协议外,没有提供任何业务价值。
  3. SOAP是一个标准,在变得越来越臃肿和复杂,但有很多工具支持。供应商喜欢它,因为它有助于推动ESB的销售。REST虽然简单,但不如SOAP被广泛理解。它不受工具支持。
  4. Spring的web服务模块非常好,但是在选择部署方式时要小心。采用POJO服务接口编写。这将使您获得所需的概念隔离,延迟部署选择到最后一刻,并且能够更改想法,如果第一个想法性能不佳。


Spring Web Services?在搜索引擎上搜索Spring可能会得到很多结果。 :-) - Dean J

9
在EJB和RMI之间,EJB肯定更好 - 通过容器(对象池,事务管理等),它拥有RMI的一切,甚至更多。
在EJB和Web服务之间,如果您希望将来能够从非Java应用程序调用它们,则Web服务会提供更多的可移植性。 EJB再次为您提供诸如事务管理和池化之类的功能,这些功能可能无法“开箱即用”地与Web服务一起使用。
就个人而言,如果我在做这件事,我可能会使用EJB或某种类似的远程对象框架(例如Spring Remoting)。 如果您需要从非Java应用程序调用对象的能力,您始终可以根据需要使用简单的Web服务代理来处理您的EJB。

1
你能快速比较一下Spring Remoting和EJB吗?我不需要与非Java应用程序一起使用的能力,但是过去发现EJB很笨重,而Web服务感觉更直观、更简单易写/易维护。 - Dean J
2
@Dean J - 在早期的J2EE版本中,EJB非常复杂,但在3.0中已经大大简化。我没有多少使用Spring Remoting的经验,但这里有一篇文章对两者进行了比较:http://onjava.com/pub/a/onjava/2005/06/29/spring-ejb3.html?page=1 - Eric Petroelje
我会看一下那篇文章,重新评估EJB3;EJB2感觉很丑陋。 - Dean J
1
@Dean J - Spring Remoting和EJB不必是独立的选择。Spring只是提供了一个抽象层,用于隐藏实际的远程服务调用协议。我们在当前系统中使用Spring Remoting通过HTTP、EJB和JMS使用相同的服务接口。协议根据调用者的位置而变化(客户端应用程序使用Http,容器内的另一个服务使用EJB,来自可信非JEE服务器的JMS)。 - Robin

3

关于web服务(SOAP,REST)

如果您的后端服务器不会公开展示,那么使用平台无关的Web服务接口(如SOAP / REST)将不会给您带来任何好处。
实际上,您将承担由XML标签包装数据所添加的所有开销,还有从XML到Java对象的编组和解组所带来的影响。
尽管任何分布式调用都需要一定级别的序列化-即使是RMI / EJB,但当序列化为人类可读的XML时,代价更大。

您可能根本不需要在Java中编写远程调用,您可以使用纯Apache HTTPD实例作为服务前端,该实例配置为通过mod_jkmod_proxy跨多个Java服务器进行负载均衡。
这些模块可用于负载平衡各种Servlet容器,例如Tomcat / Jetty,或EJB容器,例如JBoss / GlassFish。


2
事实上,使用Node.js服务器和JSON REST API,我可以百分之百确定JavaScript对象的序列化和反序列化将超越任何Java东西。 - bluehallu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接