EJB - 何时使用远程和/或本地接口?
Posted
技术标签:
【中文标题】EJB - 何时使用远程和/或本地接口?【英文标题】:EJB's - when to use Remote and/or local interfaces? 【发布时间】:2011-04-17 23:38:04 【问题描述】:我是 Java EE 的新手,我正在尝试理解本地接口和远程接口的概念。有人告诉我,Java EE 的一大优势是易于扩展(我相信这意味着您可以在不同的服务器上部署不同的组件)。这就是远程和本地接口的用武之地吗?如果您希望您的应用程序在不同的服务器上有不同的组件,您是否应该使用远程接口?如果您的应用程序仅驻留在一台服务器上,则使用本地接口?
如果我的上述假设是正确的,您将如何选择是为新应用程序使用本地接口还是远程接口,而您不确定流量会是多少?从使用本地接口开始,然后逐步升级到适用的远程接口?
感谢您的任何澄清和建议。
【问题讨论】:
【参考方案1】:我是 Java EE 的新手,我正在尝试理解本地接口和远程接口的概念。
在 EJB 规范的初始版本中,EJB 被“假定”为远程组件,调用它们的唯一方法是使用 RMI 语义及其暗示的所有开销(网络调用和对象)进行远程调用每个方法调用的序列化)。即使与 EJB 容器并置在同一虚拟机中,EJB 客户端也必须付出这种性能损失。
后来,Sun 意识到大多数业务应用程序实际上并没有将 EJB 分布在不同的层上,因此他们通过引入本地接口的概念来修复规范(在 EJB 2.0 中),以便与 EJB 容器并置在同一虚拟机中的客户端可以使用直接方法调用来调用 EJB,完全绕过 RMI 语义(以及相关的开销)。
有人告诉我,Java EE 的一大优势是易于扩展(我相信这意味着您可以在不同的服务器上部署不同的组件)
Java EE 可以扩展,但这并不一定意味着分发组件。您可以在集群上运行 Web+EJB 应用程序,而无需分离 Web 层和 EJB 层。
如果您希望您的应用程序在不同的服务器上有不同的组件,您是否应该使用远程接口?如果您的应用程序仅驻留在一台服务器上,则使用本地接口?
我会这样表述:如果客户端不在同一个 JVM 中,则使用远程接口(这并不意味着只使用一个服务器/JVM)。
(...) 开始使用本地接口,然后逐步升级到适用的远程接口?
我可能会从使用本地接口开始。正如已经暗示的那样,切换到远程接口并不总是强制性的(您可以集群一个并置结构)。
我建议检查下面提到的资源(前 2 个很旧但仍然相关,另外 2 个是较新的)。
资源
Under the Hood of J2EE Clustering by 王宇 Scaling Your Java EE Applications by 王宇 Scaling Your Java EE Applications -- Part 2 by 王宇【讨论】:
我发现这个问题很有趣。您所说的“切换到远程接口不是绝对强制性的”是什么意思?这是否意味着当您在同一个 JVM 之外添加新客户端时,您不必创建远程接口? @Josek 谢谢,很高兴你喜欢它@mohamida 我对措辞做了些许改动。我的意思是你可以聚集一个并置的结构。 感谢您的回答和其他资源,它们非常有帮助。似乎有几种方法可以扩展 Web 应用程序......即分发组件(我认为这是将不同的层分解到不同的 JVM 上?)或使用负载平衡(这将使整个应用程序都在许多服务器?)我想你可以使用两者的组合?您是否偶然知道有关此主题的好书?再次感谢! @BrianIt seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both?
是的,就是这样。 Do you, by chance know of good books on this topic?
遗憾的是,不,我不知道“ZE”绝对资源,如果有的话。不过,我添加了更多资源和一些参考资料。
第一个资源链接失效【参考方案2】:
虽然我同意上面写的大部分内容,但我想稍微改进一下“如何开始”的想法。
我对你的建议是永远不要永远在你的代码中直接编写 EJB 接口。始终使用常规的、面向业务的接口,对其进行编程(意思是,让您的代码在面向业务的接口上调用方法)并提供 EJB“粘合”代码作为可插入的实现。您的程序应该专注于业务逻辑,而不是 EJB 等实现细节。
这样,您可以轻松地在远程和本地实现之间切换 - 如果您使用 Spring 等 IoC 容器,则只需配置即可。
关于从本地切换到远程的特别说明:请注意,两者之间存在一些语义差异。例如,通过其“远程接口”调用 EJB 方法会导致参数按值传递,而通过“本地接口”调用会导致参数按引用传递。这是一个主要的区别;因此,如果您“从本地开始”,请确保在设计系统时也考虑到“远程”语义。
如果您的设计依赖于更改传入对象的 EJB 方法,那么稍后“切换到远程”对您来说会很棘手;甚至是不可能的。
祝你好运。
【讨论】:
听起来像是另一个减少每个有效 java 的可变性的原因。这是否有助于灵活地为 EJB 的 RMI 类型接口“切换到远程”?【参考方案3】:根据 EJB Spec 3.2,EJB 可以是本地或远程。 业务接口不能同时是本地和远程的。
@Local
注解的bean只有在同一个应用程序中才能被访问。
@Remote
注释的 bean 可以跨不同的应用程序访问,驻留在不同的 jvm 或跨应用程序服务器。
所以要记住的重要事项是:
-
如果一个bean类包含
@Remote
注解,那么所有实现的接口都是远程的。
如果 bean 类不包含注释或指定了 @Local
注释,则假定所有实现的接口都是本地的。
为不包含接口的 bean 显式定义的任何接口都必须声明为 @Local。
EJB 3.2 版本倾向于为需要显式定义本地和远程接口的情况提供更多粒度。
【讨论】:
问题:你能否使用@Local
在另一个应用程序(JAR、WAR、EAR)中调用一个 EJB,但使用相同的 JVM?
@PritamBanerjee 关于 Carlitos Wa 的任何想法,我也面临同样的问题。 EJB 在不同的集群中,客户端 servlet 应用在不同的集群中。
@GovindaSakare 我不太确定。对不起:(【参考方案4】:
这可能会解决您的疑虑:
通常,您的 Enterprise Java Bean 将需要一个远程客户端视图 计划在分布式环境中使用 bean 的情况。 具体来说,这些是客户将要工作的情况 它将位于不同的 Java 虚拟机 (JVM) 中。在这种情况下 远程客户端视图,从远程家调用任何方法 接口和/或远程组件接口将通过远程处理 方法调用 (RMI)。
一个 EJB 可以使用本地客户端视图,前提是确实保证 其他企业 bean 或客户端将仅在一个 单个 JVM。如果是这种情况,此类访问将通过 直接方法调用,而不是 RMI。
来源:http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page=last&x-showcontent=text
【讨论】:
以上是关于EJB - 何时使用远程和/或本地接口?的主要内容,如果未能解决你的问题,请参考以下文章