Интеграция Quarkus и Native Image Kit

Quarkus и Liberica Native Image Kit: несокрушимое комбо


Ноябрь 10, 2021


С появлением микросервисов разработка ПО вышла на новый уровень. Производительность приложений определяется компетентностью в области создания микросервисной архитектуры. И правда, нельзя просто так взять и разбить монолит на несколько частей, иначе интернет не был бы наводнен десятками статей и руководств по освоению этой современной технологии. Мы тоже сделали скромный вклад в объяснение основ микросервисов: если вы владеете английским языком, можете ознакомиться со статьей Microservices Inside and Out в нашем англоязычном блоге. Однако если на данном этапе вам кажется, что проще построить ядерный реактор, чем разделить ваше приложение на маленькие и эффективные сервисы, свяжитесь с нами: инженеры BellSoft с радостью ответят на ваши вопросы.

Превратить приложение Java в сеть высокоэффективных микросервисов можно с помощью фреймворков. Конечно, все знают о самом известном из них, Spring. Однако вне зависимости от того, насколько он удобен, есть и другие инструменты, которые, возможно, больше подойдут для ваших нужд. В этой статье мы поговорим о фреймворке, только набирающем популярность: Quarkus.

Почему Quarkus?

Quarkus ー это стек технологий с открытым исходным кодом с поддержкой MicroProfile, оптимизирующий применение Jakarta EE для микросервисов. Это фреймворк Java, заточенный под работу с Kubernetes и адаптированный для OpenJDK HotSpot и GraalVM. При создании микросервисов Quarkus описается на API библиотеки Eclipse MicroProfile, а также на другие инструменты, такие как Apache Kafka, Camel, внедрение зависимостей, облачно-реляционное отображение Hibernate (аннотации JPA и JTA), RESTEasy (JAX-RS) и т.д. Он также поддерживает плагины Maven и Gradle, ввиду чего вы можете запустить приложение в режиме разработки на локальной или удаленной машине.

Чем Quarkus отличается от конкурентов?

Благодаря поддержке GraalVM разработчики могут использовать статическую (ahead-of-time, AOT) компиляцию для преобразования байт-кода в машинный код. Таким образом, приложения можно преобразовать в нативный исполняемый файл, не прибегая к динамическому сканированию и загрузке всех классов в JVM. Все классы по умолчанию инициализируются во время сборки. В результате приложение запускается гораздо быстрее и потребляет значительно меньше ресурсов. Результаты тестов1 показали, что «по сравнению с Spring, скорость запуска приложений на Quarkus‎ в два раза выше, а само приложение потребляет в два раза меньше динамической памяти».

Кроме того, соответствие стандартам Java EE позволяет разработчикам использовать существующие API и запускать приложения в оптимизированной среде исполнения без необходимости их переписывать. По сути, можно использовать API из Java EE и расширить их в соответствии с собственными потребностями (например, использовать расширения ​​Quarkus для реактивной обработки сообщений, Vert.x или Camel).

Однако у фреймворка Quarkus есть свои ограничения. Например, он в значительной степени опирается на Kubernetes, поэтому если ваша команда не работала с этой технологией, успешная миграция потребует времени. Более того, Quarkus пока поддерживает не все стандарты Java EE, и для него создано меньше библиотек, чем для Spring Boot.

Тем не менее фреймворк постоянно совершенствуется, поэтому в ближайшем будущем эти пробелы могут быть закрыты.

А пока давайте посмотрим, на что способен Quarkus в среде нативной компиляции.

Quarkus + Liberica Native Image Kit: мощный старт!

Как вы уже поняли, Quarkus рассчитан на работу с технологией нативной компиляции, которая идеально подходит для развертывания в облаке и serverless-разработки. Но вы будете приятно удивлены, когда узнаете, что производительность Quarkus можно улучшить. Как? Использовать его со специальным инструментом для ускорения приложений ー Liberica Native Image Kit.

Liberica Native Image Kit (NIK) ー это технология на базе GraalVM, которая преобразует Java-приложение в предварительно (AOT) скомпилированный исполняемый файл, который запускается автономно и почти моментально. NIK поддерживает большое количество платформ, включая легковесную ОС Alpine Linux с библиотекой musl. Благодаря полноценной поддержке Alpine Linux musl Liberica NIK ー идеальный инструмент для сведения к минимуму потребления ресурсов, достижения рекордного времени запуска (до 1/10 секунды) и экономии памяти. Более того, NIK позволяет вам создавать многоязычные проекты на различных языках программирования

Также NIK совместим с большинством версий JDK, поэтому вы можете полностью контролировать свои сборки. А тот факт, что он основан на LTS-версии Liberica JDK означает, что у вас будет доступ к исправлениям ошибок, патчам безопасности и другим улучшениям в течение минимум восьми лет.

Очевидно, что используя обе технологии вместе, фреймворк Quarkus и Liberica NIK, вы не прогадаете. А теперь давайте посмотрим, как запустить их вместе.

Как использовать Quarkus и NIK вместе?

Перед сборкой нативного исполняемого файла для Quarkus подготовим необходимые инструменты и ПО.

Сперва настроим инструментарий сборки для компилятора C.

  • На Linux необходимы GCC и пакеты для линковки glibc и zlib. *

      # dnf (rpm-based)
      sudo dnf install gcc glibc-devel zlib-devel libstdc++-static
      # Debian-based distributions:
      sudo apt-get install build-essential libz-dev zlib1g-dev
    
  • На Windows нужно установить Visual Studio 2017 Visual C++ Build Tools.
  • В случае MacOS все зависимости внедряются посредством XCode.

      xcode-select --install
    
    

Для демонстрации того, как можно интегрировать Liberica NIK в Quarkus, мы возьмем базовое приложение Quarkus Hello World. Чтобы написать простое приложение Quarkus, следуйте инструкциям на сайте разработчика фреймворка (на английском языке).

Итак, у нас готово приложение Hello World. Теперь давайте сконфигурируем Native Image Kit.

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

  1. Сконфигурируйте среду исполнения. В случае Linux и macOs, если у вас архив .tar.gz / zip, используйте переменную среды JAVA_HOME чтобы обратиться по пути установленного пакета NIK:

     export JAVA_HOME=$HOME/Development/bellsoft-liberica-vm-openjdk11-21.2.0/
    

    Если вы используете пакет deb, pkg/dmg, путь установки для macOS будет стандартным. В случае Windows необходимо использовать панель управления для установки переменной среды.

  2. Установите инструмент native-image с помощью gu install. Как вариант, вы можете скачать версию NIK Core, которая содержит Liberica VM и инструмент для создания нативного образа без языковых плагинов. В этом случае используйте команду ni install:

     $JAVA_HOME/bin/gu install native-image
    

    В результате нативный исполняемый файл для вашего приложения будет содержать код приложения, необходимые библиотеки, Java API, а также сокращенную версию виртуальной машины.

    Если вы написали приложение Quarkus согласно инструкциям, файл pom.xml будет включать следующий профиль:

     <profiles>
         <profile>
             <id>native</id>
             <properties>
                 <quarkus.package.type>native</quarkus.package.type>
             </properties>
         </profile>
     </profiles>
    
    
  3. Для создания нативного исполняемого файла, выполните ./mvnw package -Pnative. Процесс упаковки нативного исполняемого файла может занять несколько минут, так что наберитесь терпения Вот и все, мы создали нативный образ приложения! Получившийся исполняемый файл можно найти в папке target/getting-started-1.0.0-SNAPSHOT-runner. Чтобы убедиться, что все работает, запустите приложение. Вы увидите следующее:

alt_text

Приложение открывается по адресу http://localhost:8080.

alt_text

Заключение

В этой статье мы обсудили преимущества фреймворка Quarkus при создании облачно-нативных приложений Java. Мы также узнали, как повысить его производительность с помощью Liberica Native Image Kit. Процесс интеграции этих технологий не такой сложный, но в итоге вы получите тройной бонус:

  • образ небольшого размера для создания крошечных контейнеров;
  • впечатляюще быстрый запуск;
  • значительно меньшее потребление памяти.

Познакомьте ваше приложение с этим тандемом: вы не разочаруетесь

Полезные ссылки

  1. How Does The Quarkus Java Framework Compare With Spring?
Author image

Пётр Железняков

Старший Инженер BellSoft

BellSoft LTD [email protected] BellSoft LTD logo Liberica Committed to Freedom 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 BellSoft LTD 199 Obvodnogo Kanala Emb. 190020 St. Petersburg RU +7 812-336-35-67 BellSoft LTD 111 North Market Street, Suite 300 CA 95113 San Jose US +1 702 213-59-59