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

Создаем созвездие микросервисов с Micronaut и Liberica Native Image Kit


Ноябрь 24, 2021


Микросервисы стремительно захватывают IT-инфраструктуру. Огромные монолиты уходят в прошлое, уступая место приложениям, разбитым на маленькие эффективные сервисы. Их удобство сложно переоценить: приложение может разрастаться, меняться, при этом у разработчиков нет необходимости переписывать его целиком, а только вносить изменения в некоторые микросервисы или добавлять новые. Новые технологии, например, фреймворки, позволили компаниям создавать целые созвездия микросервисов. Самый популярный из них ー Spring Boot, значительно упрощающий создание Spring-приложений. Тем не менее на рынке присутствуют и другие продукты, которые, возможно, лучше отвечают вашим требованиям. В этой статье мы рассмотрим один из них: Micronaut.

Если вы пока в процессе освоения микросервисной архитектуры, свяжитесь с нами. Наши инженеры ответят на любые вопросы или помогут с миграцией с Oracle JDK на Liberica JDK.

Особенности Micronaut

Micronaut ー это фреймворк на JVM, разработанный компанией Object Computing, Inc. Другой известный продукт компании ー мощный фреймворк Grails на Groovy. Micronaut является наследником Grails. Он поддерживает три популярных языка: Java, Kotlin и Groovy (в перспективе Scala) и предназначен для удобной разработки микросервисов.

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

  • внедрение зависимостей на этапе компиляции и инверсия управления;
  • поддержка реактивного программирования;
  • обнаружение сервисов;
  • AOT-компиляция;
  • HTTP-маршрутизация;
  • HTTP Client с распределением нагрузки со стороны клиента;
  • бесшовное развертывание API.

Целью разработчиков Micronaut было нивелирование типичных недостатков других фреймворков посредством быстрого времени запуска, меньшего потребления памяти, минимального использования прокси-серверов и рефлексии, а также быстрого и простого модульного тестирования. Кроме того, Micronaut поддерживает создание функций AWS Lambda, что очень полезно при написании serverless-приложений.

Если вы уже работали с фреймворком Spring, вы без проблем освоите Micronaut.

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

Создание микросервиса

Для начала установите Micronaut. Вы можете скачать бинарную сборку с официального сайта разработчика Micronaut (на английском языке) или воспользоваться любым удобным менеджером пакетов: Homebrew, Chocolatey или SDKMAN!. Если вы используете SDKMAN!, выполните следующую команду в терминале:

sdk install micronaut

После этого будут установлены все бинарные файлы, необходимые для создания, тестирования и развертывания приложений на Micronaut, вместе с Micronaut CLI.

Далее создайте приложение (Java будет использована по умолчанию, если вы не поставите флаг --lang):

mn create-app --features=graalvm example.micronaut.micronautguide --build=maven

Примечание: если вы используете Intellij IDEA, включите обработку аннотаций!

Давайте напишем базовое приложение со списком больниц. Уже готовый пример этого приложения можно скачать с официального сайта Micronaut. Однако мы рекомендуем самостоятельно создать приложение, выполнив все требуемые шаги.

  1. Создайте класс Hospital и добавьте аннотацию @Introspected:

    alt_text

  2. Создайте класс Service и добавьте аннотацию @Singleton. Напишите метод, который будет возвращать случайную больницу:

    alt_text

  3. Затем создайте класс Controller, возвращающий объект класса Hospital. Micronaut автоматически конвертирует его в формат JSON в ответе:

    alt_text

Итак, приложение готово. Вы можете сразу запустить его, но мы предлагаем рассмотреть, как сделать это с помощью Liberica Native Image Kit, превратив программу в нативный образ.

Интеграция с Liberica NIK

Теперь, когда у нас есть готовое приложение, создадим нативный образ Micronaut, использовав Liberica Native Image Kit (NIK). Liberica NIK ー это технология на базе GraalVM, которая обеспечивает плавную реализацию многоязычных проектов на различных языках программирования. NIK ー идеальный инструмент, позволяющий свести к минимуму потребление ресурсов, достичь рекордного времени запуска (до 1/10 секунды) и сэкономить память. Инструмент основан на LTS-версии Liberica JDK с доступом к исправлениям ошибок, обновлениям безопасности и другим улучшениям в течение 8 лет.

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

Также есть возможность скачать Liberica NIK через SDKMAN!. Этот комплект будет содержать полную версию NIK, не Core. Выполните:

sdk install java 21.2-nik
  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:

     $JAVA_HOME/bin/gu install native-image
    

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

  3. После установки NIK создайте нативный образ, выполнив следующую команду:

     ./mvnw package -Dpackaging=native-image
    

    Вы можете создать образ Docker, выполнив

     ./mvnw package -Dpackaging=docker-native
    
  4. После этого запустите приложение с помощью нативного исполняемого файла или Docker.

alt_text

Как видите, приложение запускается за 1,3 секунды ー впечатляющий результат!

Заключение

Micronaut ー это фреймворк, который упрощает разработку микросервисов. Он также поддерживает Kotlin и Groovy, поэтому вы можете создать несколько микросервисов на разных языках и объединить их с помощью системы обнаружения сервисов Consul. Таким образом, ваше созвездие может разрастись до целой галактики!

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

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