2011-06-16 58 views
5

我有一個Web應用程序,其中兩個主要組件是網站(在Groovy和Grails中實現)和後端RESTful Web服務(使用JAX實現-RS(Jersey)和Spring)。這兩個都將在Glassfish中運行。該網站將調用RESTful Web服務。在很多情況下,這些組件將駐留在不同的服務器上,因此網站將通過網絡撥打RESTful Web服務。但是,如果我在同一個Glassfish服務器上運行這兩個應用程序,是否可以進行優化以避免網絡調用?換句話說,我正在尋找一些等價的用於REST的EJB遠程/本地接口。謝謝!當REST客戶端和服務器在同一臺服務器上時,如何避免網絡調用

回答

8

不要出汗網絡電話。您的流量通常不會離開本地界面,因此您不會佔用任何帶寬。你從序列化/反序列化中失去了一點性能,但是你需要問自己是否值得開發一個複雜的代理體系結構來減少這種影響。我想大多數情況下你會發現答案是否定的。

+1

感謝您的提示。這是我懷疑的,但確認真的有幫助。 – MJM 2011-06-20 16:19:18

1

不知道你會發現任何微不足道的解決方案:你當然可以添加自己的附加代理層,但我真的不會擔心它。本地網絡I/O(本地主機或127.0.0.1)無論如何都是非常優化的,你真的不會注意到。

根據您的實現,Spring支持多種遠程技術(舊列表爲http://static.springsource.org/spring/docs/2.0.x/reference/remoting.html),但您會發現所有這些的關鍵在於網絡傳輸:它們以各種不同的方式將其封裝起來但最終幾乎所有的交鑰匙遠程技術都會在某個時間點進入網絡。您可以通過不必使用HTTP來獲得某些效率,但是您可能會失去使用Jersey所獲得的一些鬆散耦合。

如果你不太害怕緊密耦合,也許你可以把你通過Jersey公開的實際對象放到一個Glassfish範圍內的Spring上下文中,直接調用方法:儘管更緊密的耦合,所以我會說堅持HTTP調用。

0

是的,如果您的服務器和客戶端都駐留在同一個JVM中,則可以避免網絡調用。您應該能夠使用Jersey Client API創建您自己的Connector實現來覆蓋默認的HTTP調用並處理請求/響應。這裏是可以讓你開始的博客 - http://www.theotherian.com/2013/08/jersey-2.0-server-side-client-in-memory-connector.html

恕我直言,應該不惜一切代價避免不必要的網絡開銷。即使這種開銷只有幾毫秒,但是在爲您的Web應用程序構建功能時,您可能會增加這種服務調用,所有這些毫秒會爲您的應用程序帶來很大的延遲。

相關問題