Веб-приложение на Java в контейнере сервлетов и автономный - PullRequest
30 голосов
/ 04 января 2011

Каковы преимущества создания небольшого веб-приложения на Java для запуска в контейнере сервлетов (например, Tomcat) по сравнению с созданием автономного приложения на Java со встроенным веб-сервером и запуском его за обратным прокси-сервером?

Я играю с Java около года.Я заметил, что запуск Tomcat требует времени, и не всегда возможно выполнить горячее повторное развертывание из-за проблем с загрузчиком классов.Servlet API кажется мне несколько запутанным, особенно с точки зрения конфигурации и дизайна RESTful (который он не полностью поддерживает).

С другой стороны, я заметил, что моя IDE может компилироватьсяи запустить приложение с молниеносной скоростью.Конфигурирование Apache для обратного проксирования - это очень просто, и встроенная Jetty, кажется, справляется с чем угодно.Мне не нужны сервлеты, когда я могу использовать Restlet, Wicket и т. Д. Возможность лучше понять, как работает мое приложение (потому что оно не интегрировано с огромным сервером приложений), дает мне силы.Следы стека короче.Размер загружаемого файла меньше.Конфигурация конечного пользователя проще.Я предполагаю, что производительность, вероятно, будет лучше, потому что задействовано меньше программных слоев.

Однако мне напоминают о том, что звучит слишком хорошо, чтобы быть правдой.Поэтому мой вопрос: почему бы мне не захотеть сделать свои веб-приложения автономными?Что контейнер Servlet дает мне и / или моим конечным пользователям, что нам действительно нужно, но мы не знаем?

Ответы [ 6 ]

13 голосов
/ 04 января 2011

Здесь есть 2 отдельных вопроса:

  1. Должен ли я использовать встроенный сервер или развернуть в контейнер?

    Я не думаю, что вы должны видеть большая разница так или иначе. Там немного больше кода для запуск сервера Jetty программно, и конфигурация это проще сделать программно. Хотя поддержка IDE для веб-приложения конфигурация и развертывание становится лучше, все еще хуже чем для автономных приложений (это по определению, так как есть множество вещей, чтобы поддержка).

    С другой стороны, серверы приложений дают Вы некоторые хорошие преимущества, такие как встроенный управление, встроенная способность бегать как услуга и т. д.

    Вы могли бы даже использовать гибрид подход: использовать встроенный сервер для развиваться на месте, а затем развернуть в Тара в производстве. Но это немного странно: если вы пройдете через проблема создания правильного файла WAR, IDE действительно должны уметь справляться размещение в контейнере адекватно.

    Кстати, странно, что у вас есть проблемы с горячим перераспределением; Tomcat не должен иметь проблемы с этим, если вы сталкиваетесь с каким-то странным угловой шкаф ...

  2. Должен ли я использовать Servlet API?

    Это ортогонально от # 1. Вы может очень хорошо встроить причал и реализовать сервлеты. Вы могли бы также использовать Restlet API внутри Tomcat через серверный сервлет http://www.restlet.org/documentation/1.0/faq#02.

    Я лично нахожу API сервлета для будь довольно простым. хорошие вещи, такие как параллелизм и государственное управление. Я не совсем знаю что это значит, что RESTful дизайн не поддерживается, но если рестлеты лучше отвечайте вашим требованиям, затем используйте это ...

5 голосов
/ 04 января 2011

Встроенный Jetty может быть хорошим выбором, если вам не нужен полный стек сервлетов. В отличие от Tomcat, Jetty позволяет легко избавиться от частей, которые вы не используете (JSP, JNDI и т. Д.).

С другой стороны, написание собственного HTTP-сервера - ужасная идея. Конечно, легко написать что-то, что обрабатывает основные запросы. Но вскоре вы обнаружите, что некоторые клиенты испытывают проблемы с ним, потому что он не поддерживает полные спецификации протокола; или что происходит сбой, когда существует более нескольких сотен пользователей; или что существует уязвимость, которая позволяет какому-то ребенку в Малайзии взорвать ваш принтер. Так что не изобретай колесо заново.

Что касается вашей жалобы на то, что Servlet API не поддерживает дизайн RESTful - вы упускаете суть, он никогда не предназначался для этого. Но есть много библиотек REST, которые запускают поверх Servlet API.

3 голосов
/ 04 января 2011

Встроенная Jetty также является контейнером сервлетов. Я предполагаю, что ваше приложение включает в себя файл web.xml, в котором вы определяете фильтр / сервлет калитки, сервлет RESTlet и их отображения (как минимум). Таким образом, вы не можете избавиться от Servlet API (или от контейнера сервлета, даже если вы его внедрили), но вы можете как можно лучше скрыть его под своими фреймворками и в каком-то собственном методе main (). RESTlet (или Jersey или любая реализация JAX-RS), а также Spring MVC все основаны на сервлетах, поэтому Servlet API действительно неплохо поддерживает REST, я бы сказал.

P.S. Два подхода не исключают друг друга. Вы можете очень хорошо работать с Jetty во время разработки, а затем развернуть свою войну в некотором (не внедренном) контейнере для QA / production. Или ... придерживайтесь Jetty для производства, если это действительно соответствует вашим потребностям.

0 голосов
/ 01 июля 2016

Если у вас возникли проблемы с горячим развертыванием, скорее всего, вы не очищаете внешние подключения или другие ресурсы.Чтобы справиться с этим, обычно вы хотите реализовать прослушиватель, который сообщит вам, когда что-то запускается или останавливается.

вам, вероятно, следует в ваших войнах реализовывать что-то вроде этого (tomcat 6):

public class MyTomcatInitCleanupListener implements ServletContextListener
{
    @Override
    public void contextInitialized(ServletContextEvent arg0)
    {
        super.contextInitialized(arg0);
    }

    @Override
    public void contextDestroyed(ServletContextEvent arg0)
    {
        super.contextDestroyed(arg0);
    }
}

для Tomcat 7+, вы можете в Google "tomcat listener lifecycle listener"

0 голосов
/ 24 августа 2015

Контейнеры Servlet в процессе работы - это контейнеры, которые работают внутри JVM веб-сервера, они обеспечивают хорошую производительность, но плохую масштабируемость.

Контейнеры вне процесса - это контейнеры, которые работают в JVM вне веб-сервера. низкая производительность, но лучшая масштабируемость В случае контейнеров вне процесса веб-сервер и контейнер взаимодействуют друг с другом с использованием некоторого стандартного механизма, такого как IPC.

В дополнение к этим типам контейнеров, есть 3-й тип, который является автономными сервлет-контейнерами. Это неотъемлемая часть веб-сервера.

0 голосов
/ 04 января 2011

Контейнеры сервлетов часто предоставляют кучу полезных вещей, таких как автоматическое управление сеансами, горячее развертывание, инфраструктуры для отработки отказа и кластеризации и т.Конечно, это зависит от контейнера, но иногда это очень полезные инструменты.Иногда это не так.

РЕДАКТИРОВАТЬ: Только что заметил ваш комментарий по поводу горячего повторного развертывания.Да, иногда контейнеры глючат и работают с болью, и все они имеют свои причуды.Тем не менее, иногда они дают действительно хорошие вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...