Spring boot - это чисто среда выполнения.
Если я правильно понял ваш вопрос, вы описываете следующую ситуацию:
Итак, допустим, у вас есть контейнер A с JDK и несколько банок. Это само по себе не означает, что у вас есть работающий процесс. Так что это больше похоже на том с файлами, готовыми к повторному использованию (или, может быть, на слой в виде docker изображений).
Вдобавок у вас есть еще один контейнер B с приложением весенней загрузки, которое нужно как-то запустить (возможно, с открытым jdk из контейнера A или его выделенного JDK).
Теперь, что именно хотелось бы "разогнаться"? Размер образа (например, меньшее изображение означает более быстрое развертывание в конвейере CI / CD)? Время запуска приложения весенней загрузки (временной интервал между моментом создания JVM до запуска и запуска приложения загрузки Spring)? Или, может быть, вы пытаетесь загрузить меньше классов во время выполнения?
Способы решения возникших проблем различны. Но в целом, я думаю, вам может понадобиться проверить интеграцию Graal VM, которая, помимо прочего, может создавать собственные образы и ускорять время запуска. Это довольно новый материал, я сам еще не пробовал. Я считаю, что его работа в процессе разработки, и весна приложит усилия, чтобы продвинуть это вперед (это всего лишь мои предположения, так что воспринимайте это с недоверием). * эта статья
Однако я сомневаюсь, что это как-то связано с вашим исследованием, как вы его описали.
Обновление 1
На основании ваших комментариев - позвольте мне предоставить дополнительную информацию, которая может помочь. Это обновление содержит информацию из «реального» опыта работы, и я публикую его, потому что это может помочь найти направления в вашей диссертации.
Итак, у нас в первую очередь есть приложение для весенней загрузки.
По умолчанию это JAR и его рекомендация Pivotal, есть также вариант WARs (как Jo sh Long, их защитник разработчика говорит: «Сделайте JAR не WAR»).
Этой весной Загрузочное приложение обычно включает в себя какой-либо веб-сервер - Tomcat для традиционных приложений Spring Web MVC по умолчанию, но вы можете переключить его на Jetty или поднять. Если вы используете «реактивное приложение» (Spring WebFlux поддерживается с весенней загрузки 2), по умолчанию вы выбираете Netty.
Одно замечание: не все приложения с весенней загрузкой должны включать какой-либо встроенный веб-сервер, но я отложу этот тонкий момент, поскольку вы, похоже, нацеливаетесь на случай с веб-серверами (вы упоминаете tomcat , более быстрая возможность обслуживать запросы и т. д. c, отсюда и мое предположение).
Хорошо, теперь давайте попробуем проанализировать, что происходит, когда вы запускаете JAR-файл приложения весенней загрузки.
Прежде всего запускается сама JVM - запускается процесс, выделяется куча, загружаются внутренние классы и так далее и так далее. Это может занять некоторое время (около секунды или даже немного больше, в зависимости от сервера, параметров, скорости вашего диска и т. Д. c). Этот поток отвечает на вопрос, действительно ли JVM запускается медленно. Я, вероятно, не смогу добавить к этому больше.
Хорошо, теперь пришло время загрузить внутреннюю часть tomcat классы. На современных серверах это опять же может занять пару секунд. Netty кажется быстрее, но вы можете попробовать загрузить стандартный дистрибутив tomcat и запустить его на своем компьютере или создать образец приложения без весенней загрузки, но со встроенным Tomcat, чтобы понять, о чем я говорю.
Пока все хорошо, наше приложение не работает. Как я сказал в начале, весенняя загрузка - это чисто среда выполнения. Итак, должны быть загружены классы самой загрузки spring / spring, а затем классы самого приложения. Если приложение использует некоторые библиотеки - они также будут загружены, а иногда даже пользовательский код будет выполняться во время запуска приложения: Hibernate может проверять схему и / или сканировать определения схемы db и даже обновлять базовую схему, Flyway / Liquidbase может выполнять схему миграции и тому подобное, Swagger может сканировать контроллеры и генерировать документацию и тому подобное.
Теперь этот процесс в «реальной жизни» может занять минуту и даже больше, но это не из-за самой весенней загрузки, а скорее из bean-компонентов, созданных в приложении, у которых есть некоторый код в «конструкторе» / «пост-конструкции» - то, что происходит во время инициализации контекста приложения весенней загрузки. Еще одно замечание: я не буду вдаваться в подробности процесса запуска приложения весенней загрузки, весенняя загрузка - это чрезвычайно мощный фреймворк, в котором много вещей происходит под капотом, я предполагаю, что вы работали с весенней загрузкой одним способом или другое - если нет, не стесняйтесь задавать конкретные вопросы по этому поводу - я / мои коллеги постараюсь ответить.
Если вы с go по start.spring.io можете создать образец демонстрационного приложения - оно загрузится довольно быстро. Так что все зависит от компонентов вашего приложения.
В свете этого, что именно следует оптимизировать?
В комментариях вы упомянули, что может быть tomcat, работающий с некоторыми JAR-файлами, чтобы они не будет загружаться при запуске приложения весенней загрузки.
Ну, как упомянули наши коллеги, это действительно больше похоже на «традиционную» модель контейнера / сервера приложений веб-сервлетов, которую мы, люди в этой отрасли, «использовали на века »(примерно на 20 лет более или менее).
Этот тип развертывания действительно имеет «всегда работающий» процесс JVM, который «всегда» готов принимать файлы WAR - архив пакетов вашего приложения. Как только он обнаруживает WAR, брошенный в какую-либо папку, он «развертывает» приложение посредством создания иерархического загрузчика классов и загрузки JAR-файлов / классов приложения. Что интересно в вашем контексте, так это то, что можно было «совместно использовать» библиотеки между несколькими войнами, чтобы они были загружены только один раз. Например, если ваш tomcat размещает, скажем, 3 приложения (читайте 3 WAR) и все используют драйвер базы данных oracle, вы можете поместить jar этого драйвера в какую-нибудь общую папку libs
, и он будет загружен только один раз загрузчик классов, который является «родительским» для загрузчиков классов, созданных с помощью «WAR». Эта иерархия загрузчика классов имеет решающее значение, но я считаю, что это выходит за рамки вопроса.
Раньше я работал с обеими моделями (весенняя загрузка со встроенным сервером, приложение без весенней загрузки со встроенным сервером Jetty и "олдскульные" развертывания tomcat / jboss).
Исходя из моего опыта и, как показывает время, многие из наших коллег соглашаются с этим, приложения с весенней загрузкой намного удобнее с точки зрения эксплуатации по многим причинам (опять же, эти причины выходят за рамки вопроса IMO , дайте мне знать, если вам нужно узнать больше об этом), поэтому это текущая «тенденция» и «традиционные» развертывания все еще в отрасли из-за или по многим не чисто техническим причинам (исторически система «определена как действующая» в режиме обслуживания у вас уже есть инфраструктура развертывания, команда «системных администраторов», которые «знают», как развертывать, вы называете это, но в итоге ничего чисто технического).
Теперь, когда вся эта информация, вы, вероятно, лучше понимаете, почему я предложил взглянуть на Graal VM, которая позволит ускорить запуск приложений с помощью собственных образов.
Еще один момент, который может быть актуальным. Если вы выбираете технологию, которая обеспечит быстрый запуск, возможно, вам нравится Amazon Lambda или альтернатива, предлагаемая в наши дни другими облачными провайдерами.
Эта модель допускает практически неограниченную масштабируемость «вычислительной» мощности (ЦП), а под капотом они «запускают» контейнеры и «уничтожают» их сразу же, как только они обнаруживают, что контейнер фактически ничего не делает. Для этого типа приложений простая загрузка Spring не подходит, но в основном это Java, опять же, потому что процесс JVM запускается относительно медленно, поэтому, как только они запустят контейнер таким образом, это займет слишком много времени, пока время его ввода в эксплуатацию.
Вы можете прочитать Здесь о том, что весенняя экосистема может предложить в этой области, но это не имеет отношения к вашему вопросу (я пытаюсь дать указания) .
Spring boot отлично работает, когда вам нужно приложение, запуск которого может занять некоторое время, но после запуска оно может выполнять свою работу довольно быстро. И да, можно остановить приложение (мы используем термин масштабирование / масштабирование), если оно не «занято» реальной работой, этот подход также является новым (~ 3-4 года) и лучше всего работает в «управляемые» среды развертывания, такие как kubernetes, amazon ECS и т. д. c.