0

案例:开发一个独立的 java 客户端,它将在多个用户桌面的不同位置运行。应用服务器(Oracle Weblogic)将运行在不同地方的集中位置。

现在我想从客户端访问/调用在中央服务器上运行的 EJB(会话 Bean)。由于客户端和服务器位于不同的位置,并且没有通过 Intranet 或 LAN 连接,因此唯一的连接媒介是 Internet。

我的问题是如何在不使用 servlet/JSP 层的情况下直接从客户端调用服务器中的 EJB?

EJB 是为远程访问而设计的,为什么要依赖 servlet?

我读过 RMI-IIOP 可用于建立这种类型的连接,但我无法通过 Internet 使用 RMI-IIOP!

这种远程通信的最佳架构/解决方案是什么?

4

4 回答 4

2

请记住,EJB 是一个简洁的业务逻辑单元,它们与协议无关。将其暴露给调用者是应用服务器的工作。RMI-IIOP/CORBA 只是默认设置。

IIOP 的 Internet 路由问题与许多协议类似,并不是它们不通过 Internet 路由,而是它们没有内置简单的代理/反向代理功能。因此存在通过 DMZ 的问题。与支持反向代理的 HTTP 相比,或者 SMTP 允许中继。防火墙端口通常也会关闭,您通常不会将应用程序服务器放在 DMZ 中。

为了解决直接访问外部网络的业务逻辑的问题,我通常将协议更改为专为外部网络通信而设计的协议。例如,使用 @WebMethod 注释(或部署描述符)EJB 并自动作为 SOAP 服务可用,或使用 @PATH(等)将它们公开为 HTTP/JSON/XML 服务。

CORBA 类型的协议具有开箱即用的安全性、XA 事务功能并且性能非常高。我通常在内部将它用于企业级面向组件的系统。(每个 EJB 组件本质上都用作微服务)而对于外部集成,尤其是在调用者不需要预先知道接口契约的情况下,我通常会为 EJB 使用 SOAP 或 HTTP/JSON/XML 端点。

于 2016-12-23T18:23:05.730 回答
1

没有 servlet 依赖项。有一个特定于应用服务器的自定义客户端/协议依赖项。每个服务器都有自己的建立连接的方式,通过为适当的提供者和协议处理程序配置 JNDI 来体现。

为什么 RMI-IIOP 不能在 Internet 上工作?我能看到的唯一潜在问题是安全性,我不知道是否有 RMI-IIOP 的加密版本,但除此之外,它是一个完全可路由的协议。

您可能会遇到端口和防火墙问题,但这不是协议错误。如果您想通过端口 80(http 的端口)运行 RMI-IIOP,那很好(显然它不会是 http,也不会与 http 代理一起使用,但同样,这不是协议问题)。

Weblogic 也有(有?)他们自己的协议,T3?我想是吗?你能用那个吗?

我认为关键是为什么你不认为你可以“通过互联网”运行 RMI-IIOP,并试图解决这个问题,而不一定要使用什么协议。

于 2012-05-15T20:34:29.497 回答
1

RMI/IIOP 是应用程序服务器提供的默认值。通过配置/注释,可以使用 SOAP 或 HTTP/XML/JSON。(尽管这些协议在安全性、交易等方面有一些权衡)

于 2017-08-11T14:53:18.223 回答
0

好吧,EJB 根本不依赖于 servlet。可以使用 RMI/IIOP 直接调用它们。您必须面对的唯一问题是网络结构,我的意思是 RMI/IIOP 使用了一些通常在公司防火墙中未打开的端口,并且可能很难打开它们。所以通常最好发出 HTTP 请求,因为几乎所有防火墙都接受这种请求。

因此,如果您在 Intranet 中(客户端和服务器在同一个 Intranet 中),您可以使用 RMI/IIOP,但如果您的客户端和服务器放置在具有 Internet 连接的不同网络中,那么我建议您使用 HTTP。您可以使用 Web 服务并将您的 EJB 作为 Web 服务“导出”。如果您不想使用 Web 服务,那么您可以将接收 HTTP 请求并调用 EJB 的 servlet 实现为 extrema-ratio。这取决于您必须返回给客户端的对象类型。如果它是一个简单的字符串或不太复杂的东西,那么您甚至可以使用 Servlet,但如果它们是对象,那么 Servlet 解决方案不是正确的选择。

于 2012-08-10T07:22:42.253 回答