Перейти к основному содержимому

Создание нативных изображений с помощью инструментов Spring Native и Liberica с сравнением скорости

· 5 мин. чтения

1. Обзор

По мере роста популярности микросервисной архитектуры гигантские монолитные приложения уходят в прошлое. Java не стоит на месте, а адаптируется к современным потребностям. Например, Oracle, Red Hat, BellSoft и другие участники активно развивают проект GraalVM . Кроме того, год назад был выпущен микросервисный фреймворк Quarkus . Что касается Spring Boot, VMware работает над проектом Spring Native уже два года.

В результате, благодаря сотрудничеству между VMware и BellSoft, Spring Native стал сквозным решением для нативных образов, которое включает в себя Liberica Native Image Kit , инструмент, основанный на исходном коде GraalVM. Spring Native и Liberica NIK позволяют разработчикам создавать собственные исполняемые файлы приложений Spring Boot, которые оптимизируют потребление ресурсов и минимизируют время запуска.

В этом руководстве мы узнаем, как использовать технологию собственных образов с приложениями Spring Boot, создав и запустив одно и то же приложение тремя способами — в виде классического файла JAR; в качестве собственного контейнера изображений с Liberica JDK и Spring Native; и как собственный образ с помощью Liberica Native Image Kit. Затем мы сравним их скорость запуска. В каждом случае мы будем использовать приложение JDBC petclinic из проекта Spring Native в качестве примера.

2. Установка Либерика JDK

Во-первых, давайте установим среду выполнения Java для вашей системы. Мы можем посетить страницу загрузки Liberica JDK и выбрать версию для нашей платформы. Давайте воспользуемся JDK 11, стандартным пакетом JDK для x86 Linux.

Есть два способа установить Liberica JDK. Один из них — с помощью диспетчера пакетов или путем загрузки пакета .tar.gz (или пакета .zip для Windows).

Последний метод является более продвинутым, но не волнуйтесь, он занимает всего четыре шага. Сначала нам нужно перейти в каталог, в который мы хотим установить:

cd directory_path_name

Не выходя из каталога, мы можем запустить:

wget https://download.bell-sw.com/java/11.0.14.1+1/bellsoft-jdk11.0.14.1+1-linux-amd64.tar.gz

Если у нас нет команды wget , мы можем установить ее через brew install wget (для Linux и Mac).

Таким образом, мы распаковываем среду выполнения в каталог, в котором находимся:

tar -zxvf bellsoft-jdk11.0.14.1+1-linux-amd64.tar.gz

После завершения установки мы можем удалить файл .tar.gz , если хотим сэкономить место на диске.

Наконец, нам нужно настроить переменную JAVA_HOME , указав на каталог Liberica JDK:

export JAVA_HOME=$(pwd)/jdk-11.0.14.1

Обратите внимание: пользователи macOS и Windows могут обратиться за инструкциями к Руководству по установке Liberica JDK .

3. Получение Spring Native Project

Мы можем получить проект Spring Native с образцами приложений petclinic, запустив:

git clone https://github.com/spring-projects-experimental/spring-native.git

4. Создание JAR-файла

Мы хотим работать с одним образцом из всего проекта Spring Native, поэтому переходим в директорию с spring petclinic JDBC, выполнив:

export PROJECT_DIR=$(pwd)/spring-native/samples/petclinic-jdbc && cd $PROJECT_DIR

Чтобы создать файл JAR, мы можем применить эту команду:

./mvnw clean install

Это даст нам файл target/petclinic-jdbc-0.0.1-SNAPSHOT.jar размером 24 МБ . Мы проверим это, запустив:

java -jar target/petclinic-jdbc-0.0.1-SNAPSHOT.jar

5. Создайте собственный контейнер изображений с помощью Liberica JDK

Теперь давайте контейнеризируем наше приложение.

Убедитесь, что наш демон Docker запущен. Обратите внимание, что нам нужно выделить не менее 8 ГБ памяти для Docker, если мы используем Windows или macOS x86. Из каталога приложений Spring petclinic JDBC нам нужно ввести команду:

./mvnw spring-boot:build-image

Это создаст собственный контейнер образа с Spring Boot, который мы можем запустить:

docker run -it docker.io/library/petclinic-jdbc:0.0.1-SNAPSHOT

Если мы работаем с Apple M1, этот шаг будет для нас недоступен из-за отсутствия необходимого билдпака для Docker. Однако последняя версия Liberica Native Image Kit полностью совместима с Apple Silicon, поэтому мы можем перейти к следующему шагу и создать собственный образ с помощью NIK.

6. Создайте нативный образ с помощью Liberica NIK

Мы будем использовать комплект Liberica Native Image Kit для создания еще одной версии собственного образа petclinic. Ниже мы можем найти шаги по установке NIK для Linux. Для macOS или Windows обратитесь к Руководству по установке Liberica NIK .

Сначала нам нужно перейти в каталог, в который мы хотим установить:

cd directory_path_name

Затем скачиваем Liberica NIK Core для нашей платформы. Он содержит виртуальную машину Liberica и собственный набор инструментов для создания образов на основе GraalVM без дополнительных языков, поэтому является отличным инструментом для создания собственных образов Java.

В нашем случае мы получим версию НИК для Java 11 для Linux:

wget https://download.bell-sw.com/vm/22.0.0.2/bellsoft-liberica-vm-openjdk11-22.0.0.2-linux-amd64.tar.gz

Затем мы распаковываем файл, запустив:

tar -xzf bellsoft-liberica-vm-openjdk11-22.0.0.2-linux-amd64.tar.gz

Определите переменную $JAVA_HOME, указав на Liberica NIK:

export JAVA_HOME=$(pwd)/bellsoft-liberica-vm-openjdk11-22.0.0.2

Теперь мы переходим в каталог приложения petclinic JDBC:

cd $PROJECT_DIR

И мы можем создать собственный образ, выполнив следующую команду:

./mvnw -Pnative install

Он использует «родной» профиль для сборки и приводит к созданию бинарного файла target/petclinic-jdbc размером 102,3 МБ.

7. Сравните время запуска

Теперь давайте проверим скорость нашего приложения и изображений. Для их запуска мы использовали ПК с процессором Intel(R) Core(TM) i7-8750H с SSD:

  • файл JAR запускается примерно через 3,3 секунды
  • первый построенный нами контейнер запускается примерно через 0,07 секунды
  • собственное изображение, созданное с помощью NIK Core, запускается через 0,068 секунды.

8. Заключение

Собственные образы Spring созданы и отлично работают, даже когда проект все еще находится в бета-версии. Сокращение времени запуска огромно.

Мы можем ожидать еще лучших результатов, когда Spring Native будет выпущен с комплектом Liberica Native Image Kit, используемым в качестве комплексного решения для создания собственных образов.