Как сравниваются Джерси-клиент и HTTP-клиент Apache?

Во-первых, я не пытаюсь разжечь здесь флейм-войну. Я достаточно хорошо знаю Джерси, но почти не пользовался httpclient.

Каковы основные различия между jersey-client и httpclient Apache? В каких областях один лучше другого? Есть ли где-нибудь хорошая сравнительная таблица? Какой из них лучше работает с большими файлами (скажем, 2048 МБ)?

Большое спасибо за ваши комментарии!


person carlspring    schedule 02.09.2013    source источник


Ответы (1)


Эти две вещи, вероятно, не следует сравнивать напрямую. Jersey — это REST-клиент с полной реализацией JAX-RS, плавным API и мощным стеком фильтров. Apache Http Client — это HTTP-клиент, идеально подходящий для управления низкоуровневыми деталями, такими как тайм-ауты, сложные прокси-маршруты и опрос соединений. Они действуют на разных уровнях вашего стека протоколов. Когда вы используете Джерси, всегда задействован какой-то сервер HTTP-клиента. При отсутствии явного бэкэнда Джерси будет использовать HttpUrlConnection в качестве бэкенда по умолчанию.

Пример Джерси с серверной частью HttpUrlConnection:

Client client = Client.create();
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

Джерси с примером серверной части Apache Http Client:

HttpClient apacheClient = HttpClientBuilder.create().build();
Client client = new Client(new ApacheHttpClient4Handler(apacheClient,
                                                        new BasicCookieStore(),
                                                        true));
WebResource webResource = client.resource("http://localhost:8080/path");
ClientResponse response = webResource.accept("application/json")
                                     .get(ClientResponse.class);

Обратите внимание на использование Handler в последнем примере. Это ключевая абстракция интеграции для Джерси, позволяющая включать и использовать различные серверные части. Первый пример использует URLConnectionClientHandler глубоко под капотом.

Говоря о производительности и возможностях, нет особого смысла сравнивать Apache Http Client с Jersey. Здесь можно сравнить разные бэкэнды Джерси, поскольку сам Джерси — это просто API-интерфейс. Я хотел бы выделить некоторые ключевые различия между HttpUrlConnection и Apache Http Client, основанные на моем собственном опыте:

HttpUrlConnection

  • Никаких внешних зависимостей не требуется. Это может быть весьма ценным на встроенных или мобильных платформах.
  • Чрезвычайно хорошо документировано везде
  • Имеет плохо спроектированный API. Реализация на основе HttpUrlConnection сложна в обслуживании и расширении.
  • Многие функции настраиваются с помощью свойств JVM, некоторые из которых нельзя изменить во время выполнения.
  • В некоторых случаях безнадежно при обработке тайм-аутов. Вы можете в конечном итоге установить 10 различных свойств JVM для разных тайм-аутов, и в некоторых случаях ваши соединения все равно будут зависать навсегда.
  • Поскольку Gingerbread является рекомендуемым API HTTP-клиента для Android.

HTTP-клиент Apache

  • Для версий 3.X его производительность была несколько похожа на HttpUrlConnection. Версия 4.1 содержит множество улучшений производительности и работает намного лучше, чем ее аналог.
  • Довольно хорошо справляется с тайм-аутами подключения и чтения данных
  • Его дизайн следует принципу Open/Closed, поэтому вы можете настроить практически любую часть обработки HTTP с помощью собственной реализации. Примеры: стратегии перенаправления, стратегии повторных попыток, настраиваемые хранилища файлов cookie, перехватчики запросов/ответов и т. д.
  • Обеспечивает расширенную поддержку прокси-серверов с настраиваемыми построителями маршрутов для сложных путей с несколькими прокси-серверами.
  • Имеет готовый пул соединений для каждого маршрута. Это может дать хороший выигрыш в производительности, если используется SSL/TLS, особенно при использовании аппаратных токенов PKCS#11. HttpUrlConnection также имеет внутренний пул, но у вас нет инструментов для настройки того, что и когда объединять, нет средств мониторинга для проверки состояния пула.
  • Особенности подробного ведения журнала

Имейте в виду, что также возможно использовать другие серверные части (например, для неблокирующих клиентов) с Джерси, если у вас есть соответствующая реализация com.sun.jersey.api.client.ClientHandler.

person Jk1    schedule 22.10.2013
comment
Спасибо, что указали на тот факт, что Джерси по умолчанию имеет значение HttpUrlConnection, что является плохой идеей при работе с большими файлами, поскольку оно отображает их в памяти, что приводит к снижению производительности. Я не совсем уверен, полностью ли согласен с утверждением, что Джерси — это просто клиент REST API. Клиент Джерси также является HTTP-клиентом. У вас есть все потоки, но — да — он по умолчанию оборачивает все это вокруг HttpUrlConnection. Может я еще что-то упускаю...? - person carlspring; 23.10.2013
comment
У него определенно есть потоки, но эти потоки предоставляются базовой реализацией ClientHandler. Теоретически эти потоки могут исходить из любого места, быть буферизованными в памяти или нет - все зависит от базовой реализации http-клиента. Можно даже написать ClientHandler, который не задействует никакую сеть, и Jersey, как обертка, будет полностью согласен с этим. - person Jk1; 23.10.2013
comment
У вас есть пример того, как заставить это работать с jersey-client 2.20 и Apache Httpclient? Я спрашиваю, потому что у jersey-apache-client4, похоже, нет достаточно новой версии. Также ваш код относительно бита Client client = new Client(new ApacheHttpClient4Handler...) неверен или устарел. Как вы думаете, вы могли бы обновить это? Большое спасибо! - person carlspring; 13.08.2015