Автор Иван Перес, автор Parser

Введение

Spring Boot стал одной из самых популярных платформ Java для создания современных, масштабируемых и надежных веб-приложений. В своем последнем выпуске Spring Boot 3 представил несколько новаторских функций, которые должны изменить правила игры для разработчиков. В этой статье мы более подробно рассмотрим поддержку нативных образов и узнаем, как они могут помочь вам вывести ваши приложения Spring Boot на новый уровень. Итак, давайте погрузимся и узнаем, что нового в Spring Boot 3!

GraalVM — путь к нативному

GraalVM — это виртуальная машина с открытым исходным кодом, разработанная для поддержки нескольких языков программирования и режимов выполнения. Он родился из-за необходимости повысить производительность и гибкость приложений на основе JVM (Java Virtual Machine).

Цель GraalVM — предоставить единую платформу для запуска различных языков программирования и режимов выполнения, включая Java, JavaScript, Ruby, Python и другие языки. Он направлен на повышение производительности и снижение потребления ресурсов за счет использования передовых методов компиляции и времени выполнения.

GraalVM также предоставляет ряд других функций, таких как упреждающая (AOT) компиляция, JIT-компиляция и генерация собственных образов, что дополнительно повышает производительность, безопасность и время запуска приложений.

В целом, GraalVM был создан для устранения ограничений традиционных приложений на основе JVM и предоставления более эффективной и гибкой платформы для создания современных приложений.

С появлением GraalVM и ее собственных возможностей растет интерес к разработке собственных приложений, поскольку они предлагают значительные преимущества по сравнению с традиционными приложениями на основе JVM, такие как более быстрое время запуска, меньшее потребление памяти и меньшие размеры исполняемых файлов. Spring Boot 3 поддерживает эту тенденцию, обеспечивая поддержку нативных приложений через новый проект Spring Native.

Представляем Spring Native

Spring Native — это инновационный проект в рамках экосистемы Spring Framework, целью которого является поддержка компиляции приложений Spring в собственные исполняемые файлы с использованием компилятора GraalVM Native Image. Это позволяет разработчикам создавать легковесные высокопроизводительные исполняемые файлы, которые запускаются быстрее, потребляют меньше ресурсов и обеспечивают более высокую производительность по сравнению с традиционными приложениями Java, работающими на JVM (виртуальная машина Java).

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

Создать нативное приложение так же просто, как использовать плагин maven или gradle во время компиляции:

./mvnw пакет -Pative

./gradlew нативный компилятор

Основные возможности Spring Native для Java-приложений:

Быстрый запуск
Как собственные исполняемые файлы, приложения Spring Boot демонстрируют значительно более быстрое время запуска по сравнению с традиционными приложениями на основе JVM. Это делает их хорошо подходящими для бессерверных приложений, микросервисов и других сценариев, где решающее значение имеет быстрое время запуска.
Уменьшенный объем памяти
Нативные приложения обычно занимают меньший объем памяти, что помогает снизить потребление ресурсов и эксплуатационные расходы, особенно в контейнерных и облачных средах.
Опережающая компиляция
Spring Native использует компилятор GraalVM Native Image для выполнения Компиляция AOT, которая переводит байт-код Java в собственный машинный код в процессе сборки. Это приводит к более быстрому запуску и повышению производительности во время выполнения, поскольку приложение не использует компиляцию Just-In-Time (JIT) во время выполнения.
Бесшовная интеграция с экосистемой Spring
Spring Native предназначен для работы с обширной экосистемой Spring, включая Spring Boot, Spring Data, Spring Security и другие. Разработчики могут продолжать использовать знакомые Spring API и аннотации для создания нативных приложений.
Автоматическая настройка
Spring Native автоматически генерирует необходимые метаданные конфигурации (известные как метаданные доступности), необходимые для собственного образа GraalVM. в процессе сборки. Это упрощает процесс создания нативных приложений и сокращает количество ручных операций, связанных с обслуживанием файлов конфигурации.
Поддержка GraalVM
Spring Native специально разработан для работы с GraalVM. Это гарантирует, что разработчики смогут использовать все возможности GraalVM при создании нативных приложений с помощью Spring Native.

Таким образом, Spring Native — это захватывающий проект, который расширяет возможности Spring Framework, позволяя разработчикам создавать собственные приложения с более высокой производительностью, более быстрым временем запуска и уменьшенным потреблением ресурсов. Полная интеграция с экосистемой Spring и поддержка автоматической настройки делают его многообещающим решением для разработки высокопроизводительных приложений Java в эпоху облачных и контейнерных развертываний.

Что происходит во время нативной компиляции?

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

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

Метаданные доступности

В Spring Boot 3 мы указываем компилятору учитывать определенные элементы в процессе создания собственного образа с помощью метаданных доступности.

  • Эти метаданные состоят из файлов, в которых регистрируются классы, которые мы хотим включить в собственный образ. Эти файлы должны храниться в папке META-INF.native-image и иметь определенные соглашения об именах:
  • Reflect-config.json -> Включает все относительно исходного кода, который необходимо включить
  • resource-config.json -> Включает все относительно ресурсов, которые необходимо включить

Регистрация всех тех элементов, которые необходимы для правильной работы нативного образа, может быть утомительным и трудоемким процессом, особенно если ваше приложение большое и использует множество внешних сторонних зависимостей. Чтобы помочь разработчикам в этом процессе, существует общий репозиторий Github, который включает базовую конфигурацию метаданных доступности. Этот репозиторий используется во время создания собственного образа, и, например, если компилятор обнаружит, что наше приложение использует PostgreSQL, связанные с этим метаданные доступности будут загружены из репозитория.

Является ли нативное будущее разработки программного обеспечения?

Мы рассмотрели основные функции, предоставляемые нативными приложениями. Однако вопрос о том, являются ли они будущим разработки программного обеспечения, все еще остается предметом споров, поскольку у него есть свои плюсы и минусы, которые необходимо учитывать:

Уменьшенный объем памяти
Меньшее потребление памяти по сравнению с их аналогами JVM, что может быть особенно полезно для облачных развертываний и сред с ограниченными ресурсами.
Многоязычная совместимость
GraalVM поддерживает несколько языков программирования, включая Java, JavaScript, Ruby, R и Python. Это позволяет разработчикам создавать многоязычные приложения и использовать лучшие функции и библиотеки каждого языка.
Независимость от платформы
Нативные приложения, созданные с помощью GraalVM, могут работать на разных платформах без необходимости в JVM, которая упрощает развертывание и позволяет уменьшить размер приложения.
Невероятно быстрое время запуска
Время запуска в миллисекундах — впечатляющий показатель, особенно если говорить о приложениях Spring Boot. . Это, например, сделает горизонтальную масштабируемость намного более интересной, поскольку мы можем мгновенно запустить второй экземпляр нашего приложения.
Более длительное время сборки
дольше по сравнению с традиционными Java-приложениями, поскольку процесс компиляции с опережением времени (AOT) требует больше времени.
Ограниченное отражение и динамические функции
Нативные приложения GraalVM имеют ограничения с точки зрения отражения и динамических функций, что может быть недостатком для некоторых приложений, которые полагаются на эти возможности.
Проблемы совместимости
Не все библиотеки и фреймворки Java совместимы с собственным GraalVM. образы, что может потребовать от разработчиков внесения корректировок или поиска альтернатив.
Увеличенная сложность
Создание собственных приложений с помощью GraalVM может привести к дополнительной сложности с точки зрения настройки, отладки и развертывания, особенно для разработчиков, привыкших работать с JVM.

В заключение, GraalVM предлагает некоторые существенные преимущества по сравнению с традиционными JVM, такие как улучшенная производительность и уменьшенный объем памяти. Однако у него также есть некоторые недостатки, такие как более длительное время сборки и проблемы совместимости. Станет ли GraalVM будущим разработки программного обеспечения, во многом зависит от того, насколько хорошо он решает эти проблемы и продолжает развиваться в ответ на потребности разработчиков, но тот факт, что теперь он изначально поддерживается в Spring Boot 3, очень помогает!