О чём молчит Google и почему вам стоит использовать Apache HttpComponents в Android / Хабр
Эту статью нужно было публиковать гораздо раньше (почти на шесть лет), сэкономив тем самым Android разработчикам огромное количество месяцев бессмысленной разработки — но увы, не всегда есть на это время.
Если вы разрабатываете под Android, то наверняка сталкивались с тем, что открываете вы своё приложение, которое отлично работало несколько лет, и тут внезапно оказывается, что Apache httpComponents стали deprecated, и их не рекомендуется использовать. Сначала давайте разберём, что же произошло, а потом сделаем выводы, что делать.
Что произошло
Слишком далеко закапываться я не стал, однако много интересных вещей можно получить из рассылки org.apache.hc.dev и джиры Apache. Например, факт что:
Android включал в себя старый pre-beta релиз библиотеки
Более того, на протяжении всей истории версия библиотеки не менялась, и если включаете у себя apache legacy, то это всё та же pre-beta.
Подтверждение можно прочитать тут.
Подтверждение на английском
Google Android 1.0 was released with a pre-BETA snapshot of Apache HttpClient. To coincide with the first Android release Apache HttpClient 4.0 APIs had to be frozen prematurely, while many of interfaces and internal structures were still not fully worked out. As Apache HttpClient 4.0 was maturing the project was expecting Google to incorporate the latest code improvements into their code tree. Unfortunately it did not happen. Version of Apache HttpClient shipped with Android has effectively become a fork. Eventually Google decided to discontinue further development of their fork while refusing to upgrade to the stock version of Apache HttpClient citing compatibility concerns as a reason for such decision. As a result those Android developers who would like to continue using Apache HttpClient APIs on Android cannot take advantage of newer features, performance improvements and bug fixes.
Google просто забил на проблему
Разработчики из Apache активно работали над библиотекой, но назначенные им менеджеры Google не отвечали месяцами, менялись, а в конце концов сказали, что это не приоритетная задача, пользователям хватает старой версии, да и вообще надо выкинуть эту библиотеку. В подтверждение — немного из упомянутого мной листа рассылки (работа началась в 2008 году, а в 2010 внезапно проявился новый менеджер):
Новый менеджер признаёт, что задаче не уделяют внимания… Ну и ладно.
Jesse Wilson commented on HTTPCLIENT-898:
I’m Bob’s successor on the Android team. If you’ve got questions about our use of the HTTP client code, I’ll do my best to answer ’em. I regret that we haven’t given this code much attention lately; that said I’m happy that it hasn’t really needed it.
Тогда же прозвенел первый тревожный звоночек:
Знаете, спустя два года мы решили, что ничего не надо делать.
I’m quite sorry that Android included an unreleased rev of Apache HTTP client, and I suspect we’ll be paying for that mistake for quite a while.
Because of the strict compatibility requirements of our platform, we will be unable to make forwards-incompatible API changes to the HTTP code. Unlike your desktop and serverside users, including the API as a part of the core platform significantly reduces our ability to make API changes.
These days we aren’t spending much time on the HTTP client code. Our users seem to be mostly satisfied with the ancient version in the SDK, and have been directing their complaints elsewhere (crypto, locales, XML…).
That said, we do want to figure out a long term strategy for an HTTP client API that will work for both us and the Apache HTTP client team. We’re considering a variety of options…
— Discouraging our users from using the built-in Apache HTTP client, preferring the JDK’s own URLConnection classes.
— Replacing the Apache HTTP client API with a 3rd API in a «com.google» or «android.» package. Such an API would likely be based on parts of your own code, but with a more limited API.
— Tidying up the version of Apache HTTP that we’re already stuck with. This includes deprecating APIs that shouldn’t have ever been exposed as public, and possibly filling in any gaps using newer code from your project.
But none of this work is particularly urgent since we’re actively fighting fires in other areas of the core libraries.
Они не могут производит изменения в коде существующей библиотеки из-за несовместимостей? Oh rly? А если вынесут это в свой отдельный пакет на основе кода Apache, то внезапно смогут? Вообще, breaking changes в Android это отдельная тема, выходящая за рамки данной статьи, но чего стоит только ограничение разрешений приложений в шестёрке… При этом ребята из Apache активно старались предоставить максимальную совместимость, и было готовы сделать для этого что угодно.
Ребят, у нас мало времени, мы взяли вашу разработку и забили на неё, не беспокойте нас по пустякам.
I explained on several earlier occasions that Android doesn’t allow binary incompatibilities of any kind (not my rule). I understand that the HttpClient team is more tolerant of binary incompatibilities. While I’m not saying it would be impossible to make these changes in Android, I am saying that it would take a lot of convincing (and time), it would annoy other people who are time-constrained and who have higher priorities, and it could likely fail anyway.
Финал
В его статье вы можете увидеть, что среди преимуществ он видит:
- Кеширование (которое, если надо, реализуется где угодно)
- Малый вес библиотеки (да, но сомнительный аргумент)
- Компрессия, которая сохраняет батарейку и ускоряет загрузку (да, но при желании мы можем использовать Google Compression Proxy и через Apache HttpComponents как обычный прокси)
Крайне сомнительные объяснения. Если вы сейчас сидите в шапочке из фольги, то рациональным доводом будет то, что гугл таким образом решил втихую заставить пользователей гонять весь свой трафик через свой прокси…
UPD. Как мне справедливо указали, под компрессией имеется в виду не использование GCP, а использование стандартного gzip… Который у Apache есть уже много-много лет. Так что тем более странно.
К сожалению, большинство разработчиков слепо верят Google и сразу считают, что библиотека Apache “плохая”, и нужно бежать выкидывать её из своего кода.
Разработчики из Apache прокомментировали это кратко:
Google has used the project when it suited their goals and screwed us afterwards. There is nothing we can do about it.
Эпилог c OkHttp
Если вы разрабатываете под Android, то наверняка видели рекомендации заменять Apache HttpComponents ныне популярной библиотекой OkHttp от Square.
А вы всё ещё помните милого парня Джесси Вилсона из Dalvik team? А вы знаете, что сейчас он работает в Square? И именно он является создателем OkHttp? Более того, вы знате, что OkHttp начинался как форк куска AOSP (Android Open Source Project), который в свою очередь брал свой код из Apache Harmony?
Так что это и есть по сути создание форка Apache с последующим выкидыванием оригинала из обращения (второй вариант из озвученных ранее Джесси в общении с Apache). Звучит довольно гнусно, не правда ли? Единственное что непонятно — была ли это инициатива Google или самого Джесси. Но поступил он крайне некрасиво, выкинув конкурентов с помощью Google и придя весь в белом со своим решением.
Давайте разберёмся, какие есть варианты того, как жить дальше.
1. Использовать HttpUrlConnection
Рекомендованный подход Google. Действительно имеет смысл, если у вас простое приложение. Но не дай бог вам попробовать сделать что-то не совсем тривиальное. В моей практике таких случая было два — когда я пытался использовать SSL прокси и когда хотел обратиться к некоему айпишнику со своим именем хоста. Обе задачи при помощи HttpUrlConnection реализовать невозможно.
2. Использовать другие продвинутые альтернативы
Например, тот же OkHttp. Сам его не пробовал, но говорят, что библиотека хорошая. Однако, вы потратите много времени на переписывание хорошего готового имеющегося кода (если у вас уже есть приложение). Ну и касательно именно OkHttp — я бы не стал использовать столь неприятно пахнущий форк.
3. Использовать legacy библиотеку
Да, вы можете продолжать использовать всю ту же древнюю бету, что и раньше. Но зачем? Как быстрое затыкание дырки это решение неплохое, а если нет… То конечно нет. Обидно, что именно такой ответ является наиболее популярным решением на том же stack overflow — люди просто не понимают, что они используют версию библиотеки от 2008 года.
4. Использовать последние версии Apache HttpComponents
В плюсах имеем то, что мы продолжаем использовать всё тот же код, не тратя время на переписывание и на изучение новой библиотеки и её багов. Более того, код написанный на HttpComponents будет у вас работать где угодно. Библиотека чудовищно мощная и позволяет вам сделать действительно что угодно.
Вопрос — как её подключать?
Если просто брать и подставлять в gradle, то выйдет конфликт классов с этой самой древней версией.
В релизе 4.3 разработчики apache предлагали использовать специальные постфиксы “HC4” в классах для избегания конфликтов, но работало это как-то очень плохо.
Зато к релизу 4.5 они уже рекомендуют другой, единственно логичный выход — использовать перепакованную под другим пространством классов библиотеку, собранную неким товарищем на гитхабе (ссылка ниже). Там, правда, на самом деле версия 4.4, а не 4.5 — но это не так принципиально. А если вас волнует, что вы используете собранную непонятно кем библиотеку (хотя она довольно популярна), то вы всегда можете собрать её сами из исходников. На данный момент я считаю это наиболее правильным выходом из сложившейся дурной ситуации (и сам делаю именно так).
Что дальше?
Заметок по использованию пятой версии библиотеки на Android пока что нету — возможно, это объясняется тем, что она пока ещё в альфа версии. Или просто в Apache решили больше не иметь дела с Google и Android. Впрочем, даже если так — всегда найдутся энтузиасты, которые смогут корректно перепаковать последнюю версию. А работать с ней — сплошное удовольствие.
Ссылки
- Репозиторий с перепакованной версией httpComponents;
- Заметки о релизе 4. 5, где рекомендуют использовать этот репозиторий;
- Интересные фрагменты переписки ребят из Apache и Google;
- Любопытные задачи с комментариями в джире Apache — раз и два.
В процессе написания статьи я общался на эту тему с разработчиком из Apache, который подтвердил мои предположения, но от греха подальше упоминать его здесь не буду.
Что такое Nginx? Общий взгляд на то, что это такое и как это работает
Nginx, произносится как «engine-ex», представляет собой веб-сервер с открытым исходным кодом, который с момента своего первоначального успеха в качестве веб-сервера теперь также используется в качестве обратного прокси-сервера, кэша HTTP, и балансировщик нагрузки.
Некоторые известные компании, использующие Nginx, включают Autodesk, Atlassian, Intuit, T-Mobile, GitLab, DuckDuckGo, Microsoft, IBM, Google, Adobe, Salesforce, VMWare, Xerox, LinkedIn, Cisco, Facebook, Target, Citrix Systems, Twitter , Apple, Intel и многие другие (источник).
Первоначально Nginx был создан Игорем Сысоевым, а его первый публичный выпуск состоялся в октябре 2004 года. Первоначально Игорь задумывал это программное обеспечение как решение проблемы C10k, связанной с проблемой производительности при обработке 10 000 одновременных подключений.
Поскольку его корни лежат в оптимизации производительности при масштабировании, Nginx часто превосходит другие популярные веб-серверы в тестах производительности, особенно в ситуациях со статическим контентом и/или большим количеством одновременных запросов, поэтому Kinsta использует Nginx для обеспечения своего хостинга.
- Как работает Nginx?
- Статистика использования Nginx и Apache
- Как проверить, используете ли вы NGINX или Apache
Как работает Nginx?
Nginx предлагает низкое использование памяти и высокий уровень параллелизма. Вместо того, чтобы создавать новые процессы для каждого веб-запроса, Nginx использует асинхронный, управляемый событиями подход, при котором запросы обрабатываются в одном потоке.
В Nginx один главный процесс может управлять несколькими рабочими процессами. Мастер поддерживает рабочие процессы, в то время как рабочие выполняют фактическую обработку. Поскольку Nginx является асинхронным, каждый запрос может выполняться исполнителем одновременно, не блокируя другие запросы.
Некоторые общие функции Nginx включают:
- Обратный прокси с кэшированием
- IPv6
- Балансировка нагрузки
- Поддержка FastCGI с кэшированием
- Веб-сокеты
- Обработка статических файлов, индексных файлов и автоиндексация
- TLS/SSL с SNI
В Kinsta вы можете проверить Nginx и все другие наши надстройки премиум-класса.
Apache — еще один популярный веб-сервер с открытым исходным кодом. По данным W3Techs, Apache является самым популярным из существующих веб-серверов и используется 43,6% (по сравнению с 47% в 2018 году) всех веб-сайтов с известным веб-сервером. Nginx занимает второе место с показателем 41,8%.
Компания Netcraft провела опрос 233 миллионов доменов и обнаружила, что использование Apache составляет 31,54%, а использование Nginx — 26,20%.
Разработчики веб-серверов: доля рынка доменов (Источник изображения: Netcraft)В то время как Apache является наиболее популярным вариантом, Nginx на самом деле является самым популярным веб-сервером среди веб-сайтов с высокой посещаемостью .
При разбивке коэффициентов использования по трафику Nginx обеспечивает :
- 60,9% из 100 000 самых популярных сайтов (по сравнению с 56,1% в 2018 г.)
- 67,1% из 10 000 самых популярных сайтов (по сравнению с 63,2% в 2018 г.)
- 62,1% из 1000 самых популярных сайтов (по сравнению с 57% в 2018 году)
Фактически, Nginx используется некоторыми из самых ресурсоемких существующих сайтов, включая Netflix, NASA и даже WordPress.com.
Использование Apache , с другой стороны, движется в противоположном направлении по мере увеличения трафика сайта. Он поддерживает:
- 24,0% из 100 000 самых популярных сайтов (по сравнению с 27,1% в 2018 году)
- 18,8% из 10 000 самых популярных сайтов (по сравнению с 21,5% в 2018 году)
- 16,6% из 1000 самых популярных сайтов (по сравнению с 16,2% в 2018 году)
Если мы посмотрим на условия поиска Google с 2004 года, то увидим, что Apache постоянно снижается, в то время как NGINX демонстрирует небольшой рост.
Nginx против ApacheОпять же, если учесть, что NGINX работает лучше при масштабировании, неудивительно, что веб-сайты с высоким трафиком выбирают NGINX вместо Apache. Ознакомьтесь с нашим более подробным сравнением Nginx и Apache.
Как проверить, используете ли вы Nginx или Apache
На большинстве веб-сайтов вы можете просто проверить HTTP-заголовок сервера
, чтобы узнать, написано ли в нем Nginx или Apache. Вы можете увидеть заголовки HTTP, открыв вкладку сети в Chrome Devtools. Или вы можете проверить заголовки в таком инструменте, как Pingdom или GTmetrix.
Однако заголовок HTTP не всегда может указывать на базовый веб-сервер. Например, если ваш сайт WordPress находится за прокси-сервисом, таким как Cloudflare, сервер 9В заголовке HTTP 0092 вместо этого будет указано cloudflare.
Получите все свои приложения, базы данных и сайты WordPress онлайн и под одной крышей. Наша многофункциональная высокопроизводительная облачная платформа включает в себя:
- Простая настройка и управление с панели управления MyKinsta
- Экспертная поддержка 24/7
- Лучшее оборудование и сеть Google Cloud Platform на базе Kubernetes для максимальной масштабируемости
- Интеграция Cloudflare корпоративного уровня для скорости и безопасности
- Глобальный охват аудитории благодаря 35 центрам обработки данных и 275 точкам присутствия по всему миру
Начните с бесплатной пробной версии нашего хостинга приложений или хостинга баз данных. Ознакомьтесь с нашими планами или поговорите с отделом продаж, чтобы найти наиболее подходящий вариант.
Что такое HTTP-сервер Apache и для чего он используется? - Видеоруководство по Apache
Из курса: Веб-сервер Apache: Администрирование
Что такое HTTP-сервер Apache и для чего он используется?
“
Существует ряд причин, по которым вы можете захотеть узнать об Apache. Например, ваша должностная обязанность может только что измениться, и внезапно от вас ожидают, что вы будете знать, как управлять веб-сервером. Может быть, вы обнаружили пыльный компьютер, работающий в шкафу, с приклеенной к нему запиской: «Не отключайте его от сети, иначе веб-сайт перестанет работать». Вы можете просто захотеть узнать больше об администрировании веб-сервера. Пути к обучению разнообразны, и нет неправильной причины. Цель этого курса — научить вас исследовать существующий веб-сервер Apache, чтобы узнать, как он настроен и как им управлять. Apache — это большая тема, поскольку это сложная система со множеством нюансов и конфигураций. И я не собираюсь исследовать каждый аспект. Вместо этого я собираюсь сосредоточиться на создании фундамента, на котором будут строиться знания. В этом курсе будут представлены практические прикладные методы работы с сервером, а не мелочи. Начиная с этой главы, мы собираемся изучить, что такое HTTP-сервер Apache и для чего он используется, а также общие способы установки Apache. И, наконец, как управлять самой службой. Начнем с самого начала. Что такое Апач? Apache HTTP Server — это приложение веб-сервера. Веб-сервер предоставляет контент, к которому можно получить доступ через Интернет. Сюда входят HTML-документы, мультимедиа, такие как изображения, таблицы стилей CSS и сценарии на стороне клиента, такие как JavaScript. Apache HTTP Server имеет открытый исходный код, что означает, что исходный исходный код находится в свободном доступе для совместной работы. Многие руки делают легкую работу, и сотни, если не тысячи, внесли свой вклад в код. Разрабатывается с 1995, Apache был основной технологией, ответственной за первоначальный рост всемирной паутины. Сегодня Apache обслуживает более 54% всех веб-сайтов, и на то есть веские причины. Он очень надежный, то есть может обрабатывать большие объемы трафика на одном сервере. Apache также может обслуживать множество различных типов контента с минимальной конфигурацией. Он действительно хорошо масштабируется. Таким образом, одно и то же предложение курса может обслуживать крошечные статические сайты с парой запросов в час для крупных корпоративных приложений с сотнями тысяч, если не миллионами посещений в день. Тот факт, что его можно использовать бесплатно, также положительно повлиял на его принятие. Apache — это модульная система, что означает, что функциональность может быть легко добавлена к основному приложению. Модули инкапсулируют определенную группу функций, включая поддержку криптографических протоколов, таких как SSL, поддержку языков программирования на стороне сервера, таких как PHP, и балансировку нагрузки между несколькими серверами для обработки больших объемов трафика. Apache прошел через ряд основных версий. Важно знать, какая версия Apache используется, поскольку в разных версиях различаются как включенные функции, так и методы настройки. Версия 1.3 выпускалась с 1998 до 2010 года, когда он был снят с производства. Версия 2.0 была запущена в 2000 году и окончательно закрыта в 2013 году. Два пункта два были доступны с 2005 года и до сих пор поддерживаются. Два целых четыре десятых — это текущая основная версия, и она существует с 2009 года. Достаточно предыстории. Давайте посмотрим, с чем мы работаем. Первым шагом является включение виртуального устройства. Если он еще не запущен, откройте диспетчер виртуальных ящиков. Выберите Apache и нажмите «Пуск». Через мгновение или два сервер будет запущен и запущен.