Как лучше всего разместить на одном компьютере несколько десятков довольно простых веб-приложений Java? Они предназначены для разных клиентов, поэтому важно изолировать их друг от друга, чтобы, если один из них выйдет из строя, не все. Я понимаю, что Tomcat может обрабатывать несколько приложений самостоятельно, но запускать их все в одном экземпляре Tomcat для меня немного пугает. Экземпляр tomcat для каждого приложения также кажется глупым, поскольку эти приложения, вероятно, будут довольно простыми.
Есть предположения?
Прежде всего, вы можете использовать гораздо более легкий контейнер сервлетов, если у вас есть простые приложения с более низким BW. Winstone является очень базовый пристань - хорошая альтернатива для приложений среднего и большого размера, если вы спросите меня.
Все приложения, конечно, могут потреблять огромное количество ресурсов и отключать всю JVM. Что я обычно делаю, так это помещаю все хорошо работающие в одну JVM и предоставляю неприятным по JVM каждой. Это особенно относится к приложениям, которые предполагают, что они владеют всей JVM, вызывая System.exit () и т. Д. Вы также можете установить некоторые ограничения безопасности, чтобы предотвратить это, но это дает вам очень мало IMO, вы обычно хотите, чтобы приложение выходило на ошибка.
Что касается производительности при наличии нескольких JVM, необходимо установить довольно высокий минимальный размер кучи, ограничить максимальное использование памяти и немного поиграть с алгоритмами GC, чтобы настроить каждое приложение. В сценариях запуска JBoss есть хорошие примеры.
Действительно отличное программное обеспечение для управления всеми JVM - это Выскочка. Он позволяет настраивать правила возрождения и определять действия при сбоях. Если у вас нет Upstart, вы всегда можете использовать inittab, хотя синтаксические ошибки в inittab могут иметь серьезные последствия :)
Если они довольно простые, то вряд ли они приведут к остановке всего сервера, поэтому вы можете запустить их все на одном или нескольких экземплярах.
Если они на самом деле не так просты или есть проблемы с безопасностью, разделите их. Если есть серьезные проблемы с безопасностью, даже разделите их на несколько виртуальных машин.
Я бы, наверное, выбрал виртуализацию OpenVZ. Это позволяет вам создавать отдельные контейнеры, которые легче, чем что-то вроде vmware. Я использую это для простых веб-сайтов, обязательных FTP-серверов и т. Д.
... Для разных клиентов, а?
Если они платят клиентам, дайте им собственные песочницы, по одной на каждого клиента. Если они его сбивают, это сказывается только на них самих. Всем кажется справедливым. Вероятно, лучший способ сделать это - разные JVM.
В дополнение к другим ответам вы также можете просто запустить несколько серверов приложений. Большинство серверов приложений можно просто установить в каталог и запускать оттуда; Я регулярно делаю это с Tomcat при тестировании серверов.
Это решение представляет собой золотую середину между запуском всех приложений на одном сервере и наличием полностью виртуализированной ОС для каждого приложения. Если приложения работают в разных установках, они могут влиять друг на друга, только если исчерпаны общесистемные ресурсы (ЦП, ОЗУ, дисковое пространство, пропускная способность сети). Этого можно избежать, применив соответствующие ограничения на уровне ОС или сервера, как если бы это было необходимо для полной виртуализации.
Использование tomcat на самом деле является довольно хорошим решением. Вы можете создать несколько контекстов с разделением каждого клиента, и это даст вам один экземпляр tomcat. Облегчает жизнь в обслуживании. Самая большая проблема с этим, если вам нужно добавить другой контекст, вам нужно перезапустить tomcat. Использование множественных контекстов также защищает клиентов, когда один решает сделать что-то глупое, например, запустить System.exit ()
Еще одно решение, которое дает вам больше контроля и безопасности, - это посмотреть на что-то вроде Glassfish (https://glassfish.dev.java.net/). Glassfish дает вам возможность создавать домены (например, контексты котов, но с гораздо большим контролем). Вы можете делать это динамически на лету. Это позволяет вам установить один экземпляр Glassfish, но каждый домен работает в своем собственном домене (отдельные jvms). Каждый домен можно полностью настроить отдельно.
Вы обнаружите, что если у вас больше пары клиентов, использование такого решения, как tomcat, jetty или другое легкое решение, будет труднее. Glassfish также предоставляет, вероятно, лучший графический интерфейс, который вы также можете предоставить своим клиентам, если хотите.
Установить Glassfish так же просто, как и установить tomcat.
GlassFish v3 может быть действительно легким, если вы настроите его так. Вы можете, например, запустить версию веб-профиля, которая урезана специально для запуска только веб-приложений (за исключением других частей Java Enterprise Edition).
Но, возможно, ключевой особенностью вашей ситуации является то, что он обеспечивает встраивание сервера в приложение Java. Это означает, что у вас есть полный программный контроль над тем, как он создается, в каком количестве копий и в каких конфигурациях. Это может помочь в автоматизации, если вы размещаете большое количество веб-приложений.