Всем доброго!
Что ж у нас очередной новый курс Java Enterprise, а это значит, что есть то, чем мы с радостью поделимся с вами. Просьба особо не обращать внимания на версии и даты, т.к. суть от этого особо не меняется (или, если считаете, что меняется, то ждём комментарии).
Вступление: Да начнутся дебаты…
Какой тип сервера приложений Java вам стоит выбрать для следующего проекта? Зависит от того, какое приложение вы разрабатываете, какие у вас потребности, в какой организации работаете и многих других факторов. Без дебатов не обойтись. Поэтому навострите уши и слушайте внимательно.
Что делает сервер приложений сервером приложений, мистер Лебовски?
Что представляет собой сервер приложений — вопрос, вызывающий много споров в силу неточности определения. Википедия, как неоспоримый источник знаний, говорит следующее:
Java Platform, Enterprise Edition, сокращенно Java EE (до версии 5.0 — Java 2 Enterprise Edition или J2EE) — набор спецификаций и соответствующей документации для языка Java, описывающей архитектуру серверной платформы для задач средних и крупных предприятий.
Прости, Википедия, но в целях этой статьи, нам плевать на педантичные описания и полную имплементацию Java EE. Мы больше заботимся о нуждах и желаниях разработчиков.
Большинство разработчиков работают над веб-приложениями и резко используют все навороченные особенности EE-спецификации. На самом деле, ныне доступные сервера, обладающие только базовым функционалом, являются наиболее используемыми, как показал наш Отчет Производительности Разработчиков:
Можно узнать, что волнует настоящих разработчиков, например:
- Простота загрузки и установки;
- Настоящие метрики производительности;
- Поддержка инструментов;
- Конфигурация сервера.
Мы сравним и сопоставим разные аспекты этих серверов, выставим оценки и распределим места, основываясь на наших результатах. И после этого можно задать главные вопросы: Какой сервер приложений самый лучший? Отличаются ли потребности работника большой компании от потребностей домашнего разработчика-энтузиаста? Каким образом нужно оценивать, что важно для разных типов людей? И так далее…
Серверы приложений, которые мы будем обсуждать включают: Tomcat, Jetty, GlassFish, IBM WAS Liberty Profile и JBoss (также известный, как WildFly):
Сначала мы планировали включить в этот отчет IBM WebSphere и Oracle WebLogic на базе тех же критериев, что и для других серверов приложений. Но это было бы несправедливо, поскольку эти серверы четко нацелены на крупные предприятия и приложения в производстве, а не легковесную разработку. Тем не менее, мы не хотим совсем упускать их из виду, поэтому посвятим им отдельный раздел :-)
Часть I: Начало работы
Когда вы только знакомитесь с новым инструментом, такие вещи, как установка, настройка, поддержка инструмента и документация, могут сильно повлиять на ваш опыт. Часть I посвящена началу работы с каждым из серверов приложений.
В этом разделе будут сравниваться и сопоставляться все перечисленные серверы приложений, в каждой из областей они могут получить максимум 5 баллов в дополнении к нашим комментариям. А так как мы полностью за производительность разработчиков, за единицу измерения возьмем Rebel:
- Загрузка и установка;
- Поддержка инструмента;
- Конфигурация сервера;
- Документация и сообщество.
Далее, в Части II, мы раскроем более глубокие темы, как ниндзя, пробираясь под прикрытием.
Загрузка и установка
Первый контакт очень важен, именно он дает представление о том, как может сложиться весь дальнейший опыт!
Jetty
Jetty весит всего лишь 8МБ! Процесс прост:
- Загрузите установочный пакет;
- Распакуйте архив;
- Все готово к работе!
Jetty сохранил свою простоту и на запуске: java -jar start.jar
Оценка:
Причина: самый маленький файл загрузки, интеграция maven зависимостей, установка распаковкой и хорошие скрипты запуска.
Tomcat
Опыт с Tomcat почти идентичен Jetty, но версия 12.8 весит немного больше.
- Загрузите установочный пакет;
- Распакуйте архив;
- Все готово к работе!
Для запуска Tomcat просто введите: run bin/startup.sh — очень легко.
Оценка:
Причина: небольшой файл загрузки, интеграция maven зависимостей, установка распаковкой и хорошие скрипты запуска.
JBoss
JBoss AS 7.1.1.Final, выпущенный 9 Марта 2012 года, до сих пор является последней версией сообщества. Архив весит 127МБ.
- Загрузите установочный пакет;
- Распакуйте архив;
- Все готово к работе!
RedHat упростили запуск с помощью скрипта bin/standalone.sh, но только не в тех случаях, когда вы ходите запустить кластерную среду. В директории “standalone/configuration” можно найти несколько файлов настроек по умолчанию, которые позволяют включать и отключать кластеризацию, выбирать между веб и полным EE профилями, таким образом, каждый может выбрать то, что нужно, и минимально это настроить.
Оценка:
Причина: Самый большой файл загрузки, установка распаковкой, медленнее, автономные скрипты запуска.
Liberty Profile
- Примите лицензионное соглашение;
- Загрузите установочный пакет;
- Распакуйте архив;
- Примите лицензионное соглашение опять — серьезно?
- Все готово к работе!
Несмотря на то что приходится дважды принимать лицензионное соглашение, все не так уж и плохо, все равно большинство людей, не глядя, кликают “Принимаю” :) Кто-нибудь вообще это читает? Файл загрузки весит всего 41.1МБ, что не так уж и плохо, учитывая его дополнительные инструменты, которых нет в тех же Tomcat или Jetty.
Оценка:
Причина: адекватный размер файла загрузки, двукратное принятие лицензионного соглашения, для скриптов запуска нужны доки :(
GlassFish
Доступны две опции: GlassFish Open Source Edition и Oracle GlassFish Server. Мы взяли установочный пакет GlassFish Server Open Source Edition и были удивлены его небольшими размерами — всего 53МБ! Загрузочный пакет представляет собой самораспаковывающийся архив. После скачивания нужно запустить большой .sh “скрипт” и, спустя несколько шагов графического мастера, GlassFish готов к использованию. Если вас не привлекает идея установщика, можно выбрать опцию распаковочной установки, которая весит примерно на 30МБ больше. Этот способ сопровождается опытом из трех знакомых шагов:
- Загрузите установочный пакет;
- Распакуйте архив;
- Все готово к работе!
Оценка:
Причина: Нет простого способа запустить сервер, несколько способов установки, включая хороший метод распаковки, разумный размер файла скачивания, но все равно великоват.
Оценки Загрузки и Установки: победа за Jetty и Tomcat
Поддержка инструмента
Разработчики преданы не только своим серверам, но и IDE. Поэтому поддержка сервером основных IDE очень важна, чтобы не вынуждать разработчиков пользоваться нелюбимыми платформами, или вовсе упускать поддержку инструмента.
Для многих хорошая интеграция со встроенными инструментами может быть столь же важной, как хорошая интеграция IDE, а иногда даже более важной. Два основных инструмента сборки, которые мы будем рассматривать — maven и ant.
Jetty
В Jetty есть плагин Eclipse WTP, позволяющий запуск веб-приложения непосредственно из Eclipse. Кроме того, обратите внимание на Run Jetty Run — еще один плагин Eclipse.
У JetBrains также указан плагин для IntelliJ, как и у NetBeans, что можно использовать совместно с Maven плагином от Jetty.
Интеграция инструмента сборки от Jetty вполне неплохая. Есть интеграция с Ant и Maven, но, в целом, интеграцию можно провести с любым желаемым инструментом без особых усилий.
Вы можете настроить среду разработки аналогично той, что используется в производстве. Плагин maven для Jetty позволяет настраивать почти все в файле pom.xml.
В плагине Maven для Jetty мы оценили, какой Jetty крошечный. Maven не потребуется много времени, чтобы скачать все интернеты.
Оценка:
Причина: Плагин Eclipse для ранних версий Jetty не самый хороший, базовая поддержка управления сервером.
Tomcat
Три крупных IDE: Eclipse, IntelliJ IDEA и Netbeans обладают поддержкой интеграции для Tomcat. Это значит, что вы можете импортировать сервер в инструменты и деплоить проекты на сервер. NetBeans предлагает дистрибутив, в который завернут образ Tomcat, что позволяет развертывать сразу после установки NetBeans: о) Eclipse также обладает дополнительной опцией загрузки, позволяющей загрузить и установить Tomcat из инструментов, а значит вам не придется это делать с помощью браузера и заниматься импортированием.
Tomcat плотно интегрирован с Ant, и большая часть документации включает пр
имеры с Ant, а не Maven. Но, тем не менее, интеграция с Maven тоже неплохая.
Оценка:
Причина: Отличная поддержка IDE, загрузка/установка через eclipse обеспечивает положительный опыт.
JBoss
Проект для нескольких плагинов Eclipse под названием jboss-tools включает в себя JBoss Developer Studio, обладающую серверным адаптером для JBoss Servers и позволяющую вам управлять jboss’ами из IDE. IDEA предлагает плагин с закрытым исходным кодом “JBoss Integration” для управления серверами, а NetBeans имеет интеграцию и возможность управления серверами приложений, начиная с версии 7.2.1.
Для управление инстансами jboss существует плагин maven. Его функционал включает в себя запуск и остановку, деплой и передеплой приложений, управление ресурсами и выполнение команд через командную строку jboss.
Оценка:
Причина: Хорошая поддержка IDE, базовая возможность изменять настройки сервера, хорошая поддержка maven.
Liberty Profile
Инструменты Liberty Profile под названием IBM WebSphere Application Server Developer Tools for Eclipse (название продукта, которое почти нуждается в пунктуации), поддерживаются только платформой Eclipse. Если же вы фанат IntelliJ IDEA или NetBeans — не повезло. Инструменты позволяют легко загрузить и установить весь сервер и предлагают богатый функционал для моделей программирования, поддерживаемых Liberty Profile. Они также обеспечивают богатую поддержку редактирования для изменения серверных конфигураций в стиле, аналогичном редактору deployment descriptor, которым вы наверняка пользовались (или хотя бы видели). В целом, инструмент хороший, но только для Eclipse.
Liberty profile также представляют плагин Maven, позволяющий совершать некоторые действия на сервере — устанавливать, запускать, останавливать, создавать пакеты и сервер, используя предопределенные цели. Управлять этим довольно легко:
mvn liberty:package-server -DserverHome=/path/to/server_home -DserverName=[server_name] -DpackageFile=/path/to/packaged server file location
Оценка:
Причина: Отличная поддержка eclipse и гибкая настройка конфигураций сервера. Хорошая поддержка Maven, но недостаточная поддержка IDE.
GlassFish
GlassFish предлагает плагины для всех крупных IDE. Но основная проблема — рассредоточенность информации о них. Плагин для NetBeans сразу встроен в IDE, что ожидаемо с учетом его поставщика, но для установки остальных нужно искать соответствующий сайт. К счастью, GlassFish Tools доступны на Eclipse Marketplace для всех пользователей Eclipse — что делает их жизнь намного проще.
Пользователям IntelliJ IDEA тоже повезло, нужный плагин уже есть в IDE.
GlassFish предлагает достаточно хорошие плагины для Maven и Ant, которые обладают базовым функционалом — деплой, передеплой, запуск и остановка сервера.
Оценка:
Причина: Мало информации, где найти плагины, отличная поддержка IDE, если удалось эти плагины найти (особенно для NetBeans и Eclipse).
Конфигурация сервера
Jetty
Вы можете создать собственный XML-файл конфигурации и передать его с командой запуска:
java -jar start.jar /path/to/your-jetty-conf.xml
.
Самые нетерпеливые могут запустить свой инстанс с настройками аргумента JVM, передающимися в дополнительном конфиге. Кроме того, возможно передать Jetty несколько файлов конфигурации как конфигурацию для HTTP и HTTPS, что очень полезно для обмена фрагментами конфига внутри команды.
Конфигурация Jetty на базе XML — reflection-based. Это значит, что все параметры в XML фактически соответствуют полям класса Java.
Главный недостаток reflection-based (довольно скудно задокументированный) подхода — необходимо понимание того, как работает Jetty изнутри. Но эй — если вы хорошо знаете свой сервер, то никогда не наткнетесь на аномалии, а значит не позволите серверу выйти из-под контроля, ведь так?
Оценка:
Причина: Возможность создать Jetty конфиг, но необходимо знать внутренности Jetty, часто требуется перезагрузка, аргументы JVM для перезаписи конфига — приятная фича, конфиг маленький.
Tomcat
Конфигурация в Tomcat рассредоточена в нескольких файлах в tomcat/conf директории, но по большей части находится в файле server.xml. Этот файл может быть модульным, позволяя повторное и совместное использование в команде разработки. Если вы хотите внести небольшую правку, которую вероятно придется отменить на следующем перезапуске теста, лучшим способом будет добавление системного свойства на запуске JVM, когда системные свойства перезаписывают xml конфигурацию.
Конфигурационный файл по умолчанию очень длинный, но по большей части состоит из строк комментариев-инструкций. Если же посмотреть на активные строки xml, то окажется, что, на самом деле, файл довольно маленький.
Все изменения server.xml требует от вас перезагрузки сервера, так как файлы конфигурации проверяются только на старте сервера.
Оценка:
Причина: Требуется перезагрузка для изменения конфигов, рассредоточены между несколькими файлами, легко обновлять, хорошие примеры в комментариях.
Jboss
Доменная модель проста и понятна, поэтому воссоздать настройку вашей мечты будет легко. Вот как можно было бы разрешить ssl подключения в произвольном порте. Найдите следующую часть standalone/configuration/standalone.xml и добавьте коннектор для “https” (жирная линия в следующей таблице).
<subsystem xmlns="urn:jboss:domain:web:1.1" default-virtual-server="default-host" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http"/>
<connector name="https" protocol="HTTP/1.1" scheme="https" socket-binding="https" enable-lookups="false" secure="true"></connector>
<virtual-server name="default-host" enable-welcome-root="true">
<alias name="localhost"/>
<alias name="example.com"/>
</virtual-server>
</subsystem>
Это включит коннектор, но если вы также хотите изменить порт, к которому привязывается https, измените элемент “” на необходимое значение. Весь конфиг по умолчанию вести всего лишь 15КБ (300 строк) xml и находится в предсказуемом месте. Там же расположены крупные примеры конфигов для кластеризации. Изменения вполне статичны, файлы конфигурации считываются на запуске и автоматически не перечитываются. Тем не менее, CLI команда:
[jboss-as-7.1.3.Final]$ bin/jboss-cli.sh --connect :reload
поможет решить этот вопрос, не прибегая к перезагрузке сервера.
Оценка:
Причина: Один файл, 300 строк xml :( Легко настраивать, хорошо структурированная “подсистема” настройки, CLI перегружает вместо перезапуска (вручную), несколько нестандартных примеров.
Liberty Profile
В Liberty Profile присутствует один файл конфигурации, названный server.xml. При желании, в этот файл можно добавить другие файлы конфигурации, чтобы настройка была логически разделена или объединена внутри команды. Дефолтный конфиг крошечный, и самая его интересная часть — менеджер функционала:
<featureManager>
<feature>jsp-2.2</feature>
</featureManager>
Пользователь может создать свой сервер приложений с теми функциями, которые он хочет запустить, поэтому изначально включена только функция jsp-2.2. И кстати, при изменении и обновлении server.xml, все правки будут сразу отражены на запущенном сервере. Круто!
Оценка:
Причина: Высококлассная модель конфигурации, динамическое обновление, не требующее перезапуска, малый размер файла, простой конфиг.
GlassFish
Все необходимое для управления и поддержки GlassFish сервера находится в утилите asadmin. C ее помощью можно управлять даже удаленными серверами, что не может не радовать!
Одна вещь, которая особенно хорошо удалась в asadmin — это скриптинг. Да, возможно писать различные скрипты для управления развертываниями и серверами. Эти скрипты можно выполнить внутри asadmin как простой shell-скрипт.
Настоящих фанаты XML могут все настроить в domain.xls:
<network-listener port="8800" protocol="http-listener-1" transport="tcp" name="http-listener-1" thread-pool="http-thread-pool"></network-listener>
Некоторым изменениям конфигурации для вступления в силу требуется перезапуск DAS или инстансов сервера GlassFish. Прочие изменения применяются динамически без перезапуска DAS или инстансов.
Вы можете узнать, необходим ли перезапуск домену или инстансу в asadmin.
asadmin> list-domains
domain1 running, restart required to apply configuration changes Command list-domains executed successfully.
asadmin> list-instances pmd-i1
pmd-i1 running; requires restart
Command list-instances executed successfully
При такой динамической конфигурации все изменения вступают в силу при запущенных DAS или инстансе. Нижеописанные конфигурационные изменения в интересах разработчика не требуют перезапуска:
- Добавление/удаление дополнительных компонентов;
- Добавление/удаление ресурсов и пулов JDBС, JMS и коннектора (Исключение: некоторые свойства пула соединений влияют на приложения);
- Изменение системного свойства, на которое не ссылается опция или порт JVM;
- Изменение уровней логирования;
- Включение/отключение ресурсов и приложений;
- Деплой, передеплой, андеплой приложений;
Оценка:
Причина: Конфиг сложно достать, сложно читать xml файл, asadmin — рекомендуемый подход, но с ним сложно разобраться без доков и опыта.
Документация и сообщество
Jetty
Команда Jetty провела большую работу по улучшению и структуризации документации. В результате Jetty Documentation Hub легко написан и несложен в навигации. В нем есть документы для разных версий Jetty. Существуют различные списки рассылки для разработчиков. Но, к сожалению, официальный форум найти не удалось.
Чтобы получить профессиональную коммерческую поддержку, можно обратиться к сторонней компании. Но их список на сайте Jetty отсутствует.
Оценка:
Причина: Нет списка “настоящих экспертов” или компаний, способных осуществить поддержку.
Tomcat
У Tomcat отличная документация (особенно для новых пользователей), которая поддерживается большим сообществом. Это же сообщество осуществляет поддержку Tomcat: ответы на вопросы, изменения в коде, правки багов. Большинство людей устраивает такой подход, но если вы хотите что-то более надежное, существуют контракты гарантийного обслуживания, в которых регулярно задействованы коммитеры Tomcat.
Оценка:
Причина: Отличное, яркое сообщество. Хорошая документация, простой в использовании сайт, коммьюнити-саппорт, доступны контракты сторонних компаний для более надежной поддержки.
JBoss
Сообщество JBoss — одна из лучших вещей касательно JBoss AS7. Все работаю слаженно и под их крылом огромное количество проектов. Если не все, то почти все можно найти на форумах и обсуждениях групп. Если больше ничего не помогает, ответ можно поискать в документации, она тоже неплохая.
Оценка:
Причина: Медленные релизы, но хорошие доки и большое сообщество.
GlassFish
Попытки пробраться сквозь документацию, форумы и списки рассылки дает чувство защищенности. Активные форумы, разнообразие списков рассылки, специализирующихся на разных аспектах GlassFish, сносная документация.
Оценка:
Причина: хорошая документация, но неудобная навигация, некоторые документы устарели, достаточно большое сообщество, списки рассылки, активные форумы.
Liberty Profile
Документация, по большей части, находится на новом сайте сообщества — WASdev.net, который запущен командой разработки, поэтому полезнее, чем может показаться на первый взгляд. На нем можно найти традиционный инфо-центр с более формальной документацией. За поддержкой можно обратиться на довольно активный форум WASdev, не стоит забывать, там можно пообщаться с командой разработки. Это лучший вариант поддержки без гарантий. Если же у вас достаточно денег, можно получить полную поддержку IBM, единственный случай, когда позволительно кричать на IBM и все равно получить помощь :o)
Оценка:
Причина: Высокое качество документации и примеров кода, маленькое, но быстро растущее сообщество, быстрые ответы на форуме, но часто бывают слишком формально-корпоративными, медленная правка багов.
THE END
Конец первой части. Как всегда ждём ваших тапков и мнений в комментариях или на дне открытых дверей.
Автор: MaxRokatansky