Как избежать сетевого вызова, когда клиент и сервер REST находятся на одном сервере - PullRequest
5 голосов
/ 16 июня 2011

У меня есть веб-приложение, в котором два основных компонента - это веб-сайт (реализованный в Groovy и Grails) и серверный веб-сервис RESTful (реализованный с использованием JAX-RS (Джерси) и Spring).Оба они будут работать в Glassfish.Сайт будет звонить на веб-сервис RESTful.Во многих случаях эти компоненты будут размещаться на отдельных серверах, поэтому веб-сайт будет совершать звонки по сети на веб-службу RESTful.Однако, если я запускаю оба приложения на одном и том же сервере Glassfish, можно ли выполнить какие-либо оптимизации, чтобы избежать сетевого вызова?Другими словами, я ищу некоторый эквивалент удаленных / локальных интерфейсов EJB для REST.Спасибо!

Ответы [ 3 ]

10 голосов
/ 16 июня 2011

Не переживайте по сетевому вызову.Ваш трафик обычно никогда не покидает локальный интерфейс, поэтому вы не будете использовать полосу пропускания.Вы теряете немного производительности из-за сериализации / десериализации, но вам нужно спросить себя, стоит ли уменьшать влияние этого на разработку сложной прокси-архитектуры.Я думаю, что в большинстве случаев вы найдете ответ «нет».

1 голос
/ 16 июня 2011

Не уверен, что вы найдете какие-то тривиальные решения: вы, конечно, можете добавить свой собственный дополнительный прокси-слой, но я действительно не буду беспокоиться об этом. Локальная сеть ввода / вывода (localhost или 127.0.0.1) в любом случае настолько сильно оптимизирована, что вы действительно не заметите.

В зависимости от вашей реализации Spring поддерживает несколько технологий удаленного взаимодействия (старый список - http://static.springsource.org/spring/docs/2.0.x/reference/remoting.html),, но вы обнаружите, что ключом ко всему этому является передача по сети: они оборачивают его различными способами. по-разному, но в конечном итоге почти все технологии удаленного доступа «под ключ» в какой-то момент времени попадают в сеть. Вы можете получить НЕКОТОРЫЙ эффект, не используя HTTP, но вы, вероятно, потеряете некоторую слабую связь, полученную при использовании Джерси.

Если вы не слишком боитесь тесно связать друг с другом, может быть, вы можете поместить фактические объекты, которые вы экспонируете через Джерси, в контекст Spring в масштабах Glassfish и напрямую вызывать методы: тем не менее, гораздо более тесная связь, поэтому я бы сказал, что придерживайтесь HTTP звонки.

0 голосов
/ 30 августа 2013

Да, вы можете избежать сетевого вызова, если ваш сервер и клиент оба находятся в одной и той же JVM.Вы должны иметь возможность использовать клиентский API Jersey для создания собственной реализации Connector для переопределения стандартных HTTP-вызовов и обработки запроса / ответа.Вот блог, с которого можно начать - http://www.theotherian.com/2013/08/jersey-2.0-server-side-client-in-memory-connector.html

ИМХО, любой ценой следует избегать ненужных сетевых издержек.Даже если эти издержки будут составлять всего несколько миллисекунд, но при создании функций для вашего веб-приложения вы увеличите вызов таких служб, и все эти миллисекунды увеличат задержку вашего приложения.

...