当REST客户端和服务器位于同一服务器上时,如何避免网络调用

时间:2011-06-16 13:33:48

标签: java rest glassfish jersey jax-rs

我有一个Web应用程序,其中两个主要组件是网站(在Groovy和Grails中实现)和后端RESTful Web服务(使用JAX-RS(Jersey)和Spring实现)。这两个都将在Glassfish中运行。该网站将调用RESTful Web服务。在许多情况下,这些组件将驻留在不同的服务器上,因此网站将通过网络调用RESTful Web服务。但是,如果我在同一个Glassfish服务器中运行这两个应用程序,是否可以进行任何优化以避免网络调用?换句话说,我正在寻找一些相当于EJB的REST远程/本地接口。谢谢!

3 个答案:

答案 0 :(得分:10)

不要冒网络电话。您的流量通常永远不会离开本地接口,因此您不会消耗任何带宽。您在序列化/反序列化方面失去了一些性能,但您需要问自己,减少这种影响是否值得开发复杂的代理体系结构。我认为在大多数情况下,你会找到答案为否。

答案 1 :(得分:1)

不确定您会找到任何简单的解决方案:您当然可以添加自己的附加代理层,但我真的不会担心它。无论如何,本地网络I / O(localhost或127.0.0.1)都经过了大量优化,你真的不会注意到。

根据您的实现,Spring确实支持多种远程技术(旧的列表位于http://static.springsource.org/spring/docs/2.0.x/reference/remoting.html),但您会发现所有这些的关键是网络传输:它们将其包装成各种各样的不同的方式,但最终几乎所有的交钥匙远程技术在某个时间点落入网络。您可以通过不必使用HTTP获得一些效率,但是您可能会失去使用Jersey获得的一些松散耦合。

如果你不是太害怕紧密结合,你可以把你通过Jersey公开的实际对象放到一个Glassfish范围的Spring上下文中并直接调用这些方法:虽然更紧密的耦合,所以我会说坚持HTTP调用。

答案 2 :(得分:0)

是的,如果您的服务器和客户端都位于同一个JVM中,则可以避免网络呼叫。您应该能够使用Jersey Client API创建自己的Connector实现,以覆盖默认的HTTP调用并处理请求/响应。以下是可以帮助您入门的博客 - http://www.theotherian.com/2013/08/jersey-2.0-server-side-client-in-memory-connector.html

恕我直言,应该不惜一切代价避免不必要的网络开销。即使这个开销只有几毫秒,但在为Web应用程序构建功能时,您会增加此类服务调用,所有这些毫秒都会增加应用程序的延迟时间。