当您可以实现 Web 服务 (SOA/REST) 时,使用 RMI 实现 EJB 是不是仍然有用?

Posted

技术标签:

【中文标题】当您可以实现 Web 服务 (SOA/REST) 时,使用 RMI 实现 EJB 是不是仍然有用?【英文标题】:Is still useful to implement EJB with RMI when you can implement Web Services (SOA/REST)?当您可以实现 Web 服务 (SOA/REST) 时,使用 RMI 实现 EJB 是否仍然有用? 【发布时间】:2012-04-29 05:01:06 【问题描述】:

这听起来可能类似于this,但事实并非如此。

我有点了解 EJB 和 RMI,并且我在 SOA 下使用 Web 服务已经有一段时间了。我想知道为什么使用 EJB 在 RMI 下公开远程接口而不是发布 Web 服务(SOA/REST,但主要是 SOA)很有用。我不是在问哪个更好,只是我想知道一个很好的理由,为什么我应该更喜欢使用远程接口而不是 Web 服务来实现 EJB。

我查看了很多网页,但似乎都过时了。到目前为止,我所拥有的是 EJB 暴露远程接口仅在与 Java 遗留系统集成时比 WS 更好。如果我想管理事务,我可以使用本地接口实现 EJB。此外,我不认为选择 EJB 而不是 RMI 比 Web 服务接口更有效。

我说的对吗?我有什么遗漏吗?

真的提前谢谢了。

【问题讨论】:

【参考方案1】:

EJB 更好

您需要执行应在一次中完成的呼叫次数 事务(理论上我们有事务性 Web 服务,但没有 每个实现都提供它们),(有状态的)EJB 在事务管理方面大放异彩。几乎任何时候你都需要有状态 EJB 会比 Web Service 更好; 您需要性能 - Web 服务很慢 - 它们使用通过 HTTP 推送的 XML/JSON,RMI over EJB 使用的 IIOP 协议效率更高; 您需要连接到一些使用过时 Java Web 服务规范的遗留系统(丑陋的 Axis 1.0 东西,与 JAX-WS 不兼容),将所有东西与 Web 服务连接起来可能是一场噩梦,处理不兼容的 WSDL 定义,奇怪的 SOAP 信封。 EJB 向后兼容,旧的 EJB 2 可以毫无问题地与 EJB 3.1 连接; 现代 EJB (EJB 3.X) 可以通过添加两个或三个简单注释将其接口公开为 JAX-WS SOAP/WSDL 服务或 JAX-RS REST 服务

那么为什么(REST)Web 服务如此流行? EJB 只能连接到另一个 Java 应用程序。大多数现代富 Internet 应用程序都是用 javascript 编写的,因此将它们与任何后端连接的唯一方法是使用某种 Web 服务(通常是 REST + JSON)。对于这样的应用程序,EJB 是毫无用处的。

【讨论】:

谢谢,但在将其标记为已回答之前,第一个不是正当理由,因为我可以使用公开本地接口的 EJB 实现 Web 服务,对吧?所以交易是一样的。 没错,当您需要在一个事务中执行多个单独的调用时,问题就开始了。 Web 服务通常是无状态的,必须“手动”管理事务,这可能很麻烦。有状态的 EJB 会免费提供。 好吧,您也可以拥有有状态的 Web 服务,即使使用您之前给出的最后一个原因。所以我会考虑第二个和第三个原因,效率(我猜有点)和遗产。谢谢! 好答案!顺便说一句,理论上任何语言的 CORBA 客户端也可以连接到远程 EJB。使用的协议是 IIOP,它不是 Java 特定的。实践可能不同;) 非常正确,CORBA 实际上是一项非常酷的技术,但一开始它有点难用,所以它从未真正流行起来。这很可悲,因为我们最终会使用低效的协议(基本上是 SOAP/WSDL Web 服务)将 XML 字符串从一个地方扔到另一个地方。【参考方案2】:

如果使用 RMI 作为有线协议,客户端和服务都必须用 Java 编写。

SOAP 使用基于 HTTP 的 XML,而 REST 使用纯 HTTP 进行客户端和服务之间的通信。对话的任一端都可以用任何可以通过 HTTP 发送适当请求的语言编写,这远没有限制。

我认为这是基于 HTTP 的 Web 服务胜过 RMI 的原因之一。每次都是简单而公开的胜利。

【讨论】:

那么继续学习使用远程接口的 EJB 不值得了吗?比如我想学习 Smalltalk(只是为了好玩和学习,但没有用)? 我不会走那么远。该问题的答案取决于您的具体情况。 不,如果您从头开始编写一个全 Java 应用程序,我可以看到 EJB3,并且您将只有 Java 客户端,并且分布式事务组件对您来说很有价值。教条很少有用。 谢谢@duffymo!但例如,我也可以拥有分布式事务性 Web 服务。即使我可以使用 EJB3 实现 Web 服务,但在这种情况下,RMI 接口只有在我必须只连接 Java 客户端时才有价值,对吧? 不,无状态 Web 服务不能参与事务。唯一的方法是在 API 中添加“补偿事务”。我不喜欢这样,因为它迫使我的客户对管理交易了解太多。 EJB 服务可以轻松地让 Java EE 应用服务器中的事务管理器来做这样的事情。所以 EJB 仍然有充分的理由。【参考方案3】:

它们是用于不同目的的不同事物。

EJB 用于紧密耦合的 N 层系统中,您可以控制所有元素。它们使用看似普通的方法调用的语言提供直接编码,并通过 IIOP 或 EE 供应商部署的任何其他协议提供 LAN 类型的性能。

SOAP/REST 最适合在 Internet 上使用,或者在 B2B 或其他您无法控制两端并且需要松散耦合的情况下使用。由于所有 XML,您的性能会慢得多,但您还会在中间获得一个行业标准协议,该协议为两端提供保护,防止单一来源问题。

【讨论】:

这可能是另一个问题,但是可以轻松地调整 EJB 以将其接口公开为 Web 服务,因此,您可以启动您定义的第一个架构,如果将来您需要要扩展你可以通过网络服务公开它,或者不? @ChristianVielma 那是另一个问题,你不会从我这里得到答案 ;-) 把它当作一个问题来问。

以上是关于当您可以实现 Web 服务 (SOA/REST) 时,使用 RMI 实现 EJB 是不是仍然有用?的主要内容,如果未能解决你的问题,请参考以下文章

markdown SOA REST

分布式系统------分布式系统架构体系

当您的 Web 应用程序在后台时,Firestore 实时侦听器

分布式常用技术

Exchange Web Service 与 Exchange ActiveSync(或者当您可以免费获得奶牛时,为啥还要购买牛奶?)

Windows 服务和 Web 服务之间的进程间通信