Java - Горячее развертывание
Недавно я читал книгу об Erlang, в которой есть функция горячего развертывания. Развертывание может быть выполнено без остановки системы. Все существующие запросы будут обрабатываться старой версией кода, а все новые запросы после развертывания будут обслуживаться новым кодом. В этом случае обе версии кода доступны во время выполнения в течение некоторого времени, пока не будут обработаны все старые запросы. Есть ли какой-либо подход в Java, где мы можем сохранить 2 версии файлов JAR? Есть ли какие-либо приложения / веб-серверы поддерживают это?
5 ответов
Есть много способов добиться горячего развертывания в мире Java, поэтому вам, вероятно, нужно быть немного более конкретным в отношении своего контекста и того, чего вы пытаетесь достичь.
Вот некоторые хорошие предложения / варианты для рассмотрения:
- OSGi - это модульная система общего назначения, которая поддерживает горячее развертывание.
- Clojure - это динамический язык JVM, который обеспечивает большую интерактивность во время выполнения. Clojure часто используется для "живого" кодирования - практически все может быть заменено в горячем режиме и переопределено во время выполнения. Clojure - это функциональный язык с сильным акцентом на неизменяемость и параллелизм, поэтому в некоторых отношениях он имеет некоторые интересные сходства с Erlang. Clojure имеет несколько очень хороших веб-фреймворков, таких как Noir, которые подходят для горячей замены кода.
- Платформа Play Framework предназначена для обеспечения возможности горячей замены кода в целях повышения производительности (исключая перезапуски веб-сервера). Может быть уместно, если вы смотрите в первую очередь на горячие замены веб-приложений.
- Большинство серверов приложений Java, таких как JBoss, поддерживают некоторую форму горячей замены для веб-приложений.
Если вы хотите ускорить разработку, то JRebel - инструмент для этой цели. Однако я бы не рекомендовал использовать его для исправления производственной системы.
JRebel обнаруживает всякий раз, когда файл класса изменился, и перезагружает его в работающий сервер приложений, не выбрасывая старого состояния. Это намного быстрее по сравнению с тем, что делает большинство appservers при повторном развертывании всей войны / ушей, где весь процесс инициализации должен быть перезапущен.
Единственная причина для горячих обновлений в производственном приложении - это обеспечение нулевого времени простоя для пользователей.
LiveRebel (на основе JRebel) - это инструмент, который можно использовать, например, совместно с Jenkins. Он может выполнять безопасную горячую установку, а также повторные перезапуски, истощая сеансы в производственном кластере.
Технически, вы МОЖЕТЕ сделать это самостоятельно. Хотя я бы не советовал, потому что это может быстро усложниться. Но идея в том, что вы можете создать ClassLoader и загрузить новую версию вашего класса. Затем убедитесь, что ваш исполняемый код знает о новом ClassLoader.
Я бы порекомендовал просто использовать JBoss и повторно использовать ваши банки и войны. Красиво и просто по большей части.
В любом случае вы должны убедиться, что у вас нет утечек памяти, потому что после нескольких перераспределений у вас закончится пространство PermGen.