Что такое Quarkus?

Язык программирования Java известен как давно известный «отраслевой язык». Он был создан в первые годы существования интернета, но с тех пор веб стремительно развивался. Помимо классической архитектуры клиент-сервер, существует ряд интересных альтернативных моделей: приложения на основе контейнеров, микросервисы, бессерверные вычисления и реактивные веб-приложения утвердились в мейнстриме. Эти типы приложений было сложно реализовать на Java. С появлением фреймворка Quarkus ситуация скоро изменится. Руководитель RedHat Кен Джонсон сказал об этом так:

Цитата

«… это очень маленький стек Java, идеально подходящий для контейнеров, бессерверных приложений и других сценариев, когда вы запускаете Java-приложения в облаке».

— Кен Джонсон, Источник: www.openshift.com/blog/quarks-is-here-for-your-java

Мы познакомим вас с Quarkus и покажем, как этот фреймворк революционизирует создание Java-приложений.

Что делает Quarkus особенным?

Quarkus — это фреймворк, разработанный компанией RedHat для создания Java-приложений. Quarkus был разработан с целью запуска Java-программ в контейнерах. В частности, он фокусируется на поддержке программного обеспечения для оркестровки Kubernetes. Еще одним направлением развития Quarkus является использование установленных библиотек и стандартов Java.

«HotSpot» из проекта OpenJDK используется в качестве виртуальной машины Java (JVM), которая является слоем исполнения для Java-кода. Кроме того, может быть использована разработка «GraalVM», построенная на базе HotSpot. Последняя позволяет компилировать Java-код в непосредственно исполняемый машинный код. Чтобы понять непосредственную выгоду от использования Quarkus, давайте сначала рассмотрим, как выполняются Java-приложения с Quarkus и без него.

Как традиционно выполнялись Java-приложения?

Основная идея, которая сделала Java революционной при первом появлении, была настолько же проста, насколько и увлекательна: Java позволяла писать программы без привязки к конкретному оборудованию или операционной системе. Такая независимость от платформы часто выражается фразой «напиши один раз, запусти где угодно». Связанная с этим переносимость позволяет переносить программу с одной платформы на другую. Какой замечательный прием! Так как же это работает?

Как и в других языках программирования, программа на Java начинается с исходного кода, который может быть прочитан человеком. Для того чтобы выполнить инструкции исходного текста на компьютере, генерируются соответствующие инструкции в формате конкретного процессора. В Java существует еще один промежуточный шаг: Исходный текст сначала переводится в промежуточный формат, так называемый байткод, как и в случае с языком Python. Затем байткод исполняется в «виртуальной машине Java» (JVM). Для того чтобы запустить программу Java на устройстве, на нем должна быть установлена JVM.

Байткод традиционно интерпретируется для выполнения в JVM. Инструкции байткода по частям переводятся в инструкции машинного кода и выполняются. Более эффективным является процесс «компиляции точно в срок» (JIT). В этом процессе байткод также преобразуется в машинный код, но в дело вступают дополнительные оптимизации. В целом, запуск программы на Java включает в себя следующие шаги:

  1. Компиляция исходного кода Java в байткод с помощью команды компилятора Java ‘javac’:
javac java_program.java
  1. Выполнение байткода Java с помощью команды Java runtime ‘java’ — Затем генерируется машинный код:

 

java java_program
Примечание

Здесь мы говорим о «виртуальной машине». Хотя термин один и тот же, в данном случае он не относится к какой-либо технологии виртуализации операционной системы. Вместо этого промежуточный код транслируется в машинный код.

Как бы ни была практична модель Java «напиши один раз, запусти где угодно», у этого подхода есть некоторые недостатки. Использование JVM влечет за собой довольно значительные накладные расходы. С одной стороны, для запуска JVM требуется определенное время, которое добавляется к времени выполнения реального приложения. С другой стороны, помимо большего потребления памяти, происходит потеря производительности. Все это играет незначительную роль в приложениях, которые работают в течение длительного времени. Однако такой подход не очень подходит для недолговечных, основанных на контейнерах приложений. В идеале они должны запускаться как можно быстрее. Время запуска в несколько секунд неприемлемо.

Как выполняются Java-приложения в Quarkus?

В отличие от нативного исполнения Java-приложений, Quarkus предлагает несколько преимуществ. Давайте проведем различие между двумя режимами, поддерживаемыми Quarkus:

  1. Оптимизация байткода и выполнение в JVM
  2. Выполнение в виде нативного кода после компиляции

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

  • Загрузка и разбор конфигураций
  • Сканирование пути классов Java и разрешение аннотаций
  • Создание моделей сущностей для баз данных и т.п., где это применимо.

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

Второй режим, поддерживаемый Quarkus для запуска Java-приложений, еще более интересен. При «опережающей компиляции» (AOT) из исходного текста Java вместо байткода генерируется непосредственно исполняемый машинный код, что означает отсутствие необходимости в JVM на целевом оборудовании. Программа работает только на определенной архитектуре процессора и должна быть перекомпилирована для других платформ. Однако это ограничение обычно не имеет значения для использования в контейнерах. Экономия в потреблении памяти и времени запуска приложения, достигнутая благодаря AOT-компиляции, просто поражает воображение. Сравните приведенные здесь примеры производительности с официальной страницы Quarkus:

Приложение Сценарий Использование памяти Время первого ответа
Quarkus + AOT REST 12 МБ 0.02 s
Quarkus + AOT REST + CRUD 28 МБ 0.04 s
Кваркус + JIT REST 73 МБ 0.94 s
Quarkus + JIT REST + CRUD 145 МБ 2.03 s
Облачный нативный стек REST 136 МБ 4.3 s
Cloud Native Stack REST + CRUD 209 МБ 9.5 s
Примечание

Что касается терминологии: REST означает, что в контейнере запущен только один веб-сервер. В сценарии REST + CRUD наряду с веб-сервером работает база данных. Для облачного нативного стека контейнер содержит JVM в дополнение к Java-приложению.

Для чего используется Quarkus?

Quarkus — это не просто еще один фреймворк для приложений. Напротив, это программное обеспечение призвано переосмыслить то, что значит разрабатывать приложения на Java. Напомним: традиционно для Java-приложения было важнее, чтобы оно стабильно работало в течение длительного времени. То, сколько времени требовалось приложению для запуска, не имело решающего значения.

Теперь рассмотрим приложения на основе контейнеров. Новые контейнеры могут запускаться автоматически с помощью программного обеспечения для оркестровки. Приложение в контейнере должно быть готово к немедленному использованию. Кроме того, для одной службы часто запускается несколько резервных контейнеров. Сокращение потребления ресурсов, достигнутое с помощью Quarkus, умножается соответствующим образом.

Менеджер RedHat Алекс Хэнди резюмирует это следующим образом:

Цитата

«Когда вы думаете о бессерверных вычислениях, микросервисах и […] облаке, есть один язык, о котором вы, вероятно, не думаете: Java. И это очень жаль. […] Java был и остается рабочим языком для бизнеса. Он остается третьим по популярности языком в мире […] Его выбирают корпорации, которым необходимо поддерживать работоспособность одного приложения в течение многих лет».

— Алекс Хэнди, Источник: thenewstack.io/quarkus-gives-spring-boot-users-a-path-to-serverless-and-live-coding/

Преимущества Quarkus очевидны. Однако у фреймворка есть и некоторые ограничения. Поэтому Quarkus не предназначен в первую очередь для переноса существующих Java-приложений. Вместо этого стоит использовать Quarkus в качестве отправной точки для новой разработки. Ниже мы рассмотрим несколько конкретных областей применения. Во всех приведенных примерах в качестве инструмента сборки используется Maven или Gradle. Область применения определяется путем настройки команды ‘mvn’ или ‘gradle’. Затем инструмент сборки автоматически генерирует необходимые конфигурации и артефакты.

Выполнение микросервисных приложений в Kubernetes с помощью Java и Quarkus

Kubernetes — это программное обеспечение для оркестровки контейнерных приложений. Использование Kubernetes с контейнерами Docker является довольно распространенным. Отдельные сервисы приложения сохраняются в виде образов Docker и управляются Kubernetes. Оркестрант берет на себя управление контейнерами, созданными на основе образов: Kubernetes запускает, контролирует и отслеживает работу сервисов. Часто для распределения нагрузки и повышения отказоустойчивости запускается несколько копий службы. Если один из сервисов терпит крах, контейнер уничтожается и создается новый контейнер из того же образа. Java Quarkus включает конфигурации, необходимые для использования в Kubernetes.

Реализация REST API и бессерверных приложений с помощью Java и Quarkus

REST — это давно устоявшийся архитектурный стиль для веб-приложений. API, в частности, в основном реализуются в соответствии с этим подходом. REST-API основан на архитектуре клиент-сервер. Общение происходит по протоколу HTTP с использованием «глаголов» GET, POST, PUT, DELETE. Они соответствуют известным «глаголам» CRUD («создать, прочитать, обновить, удалить») из среды баз данных. Обмен данными между API и пользователем обычно происходит через JSON.

Бессерверные вычисления — это альтернативная архитектура для облачных приложений. В этой модели, также известной как «функция как услуга» (FaaS), одна функция работает недолго в контейнере. Функция вызывается, выполняет вычисления, а затем снова отключается. Несмотря на название, бессерверные функции продолжают работать на серверах. Программистам больше не нужно о них беспокоиться. Благодаря AWS Lambda, Google Cloud Functions и Microsoft Azure Functions бессерверные среды доступны на всех основных облачных платформах. Java-код можно использовать на этих платформах с помощью Quarkus.

Совет

Создайте свой собственный REST-API на выделенном сервере от IONOS.

Создание реактивных веб-приложений с помощью Java и Quarkus

В отличие от императивного программирования, реактивное программирование представляет собой современную парадигму программирования. Действия, которые должны происходить при наступлении определенных событий, описываются программистом. Наиболее известными представителями этого стиля программирования являются фреймворки «React» и «Vue», написанные на JavaScript. Оба они ориентированы на создание пользовательских веб-интерфейсов. С помощью Quarkus приложения могут быть реализованы в императивном и реактивном стиле. Можно даже комбинировать обе парадигмы.

Где используется Quarkus?

Quarkus был разработан с целью оптимизации Java-приложений для использования в контейнерах и облачных средах. Однако возможность компиляции Java-программы непосредственно в машинный код открывает еще более захватывающие возможности применения. Давайте посмотрим на наиболее интересные текущие области применения Quarkus.

Во-первых, давайте вспомним, как выполняется Java-программа, разработанная с помощью Quarkus. В процессе сборки исходный код Java компилируется в байткод, который затем транслируется в машинный код при выполнении. С помощью Quarkus можно генерировать байткод, который затем выполняется в среде выполнения Java, такой как HotSpot VM, посредством интерпретации или компиляции just-in-time (JIT). В зависимости от конфигурации, в дело вступают различные оптимизации, связанные с производительностью.

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

Java-приложения в контейнерных средах

При использовании Java-приложений в контейнерах обычно задействуется Kubernetes. Java-приложение, упакованное как образ Docker, также можно использовать на кластере OpenShift. Вы можете протестировать использование Quarkus с Kubernetes, например, с помощью установки minikube на локальной системе.

Java-функции в бессерверных средах

Используйте Quarkus для простой реализации функции, написанной на Java, в бессерверных средах от Amazon, Google и Microsoft.

Программы на Java во встраиваемых системах

Благодаря возможности создания нативного образа из Java-приложения, Java-код также можно использовать во встраиваемых системах. Здесь используется AOT-компиляция, которая обеспечивает низкое потребление памяти и быстрое время запуска для конкретного приложения.

Совет

Используйте Managed Kubernetes от IONOS для своих контейнерных приложений.

Quarkus в сравнении с другими фреймворками

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

  • React: Этот JavaScript-фреймворк зарекомендовал себя как стандарт реактивного программирования.
  • Open Liberty: Этот фреймворк IBM позволяет разрабатывать микросервисные приложения на Java. Как и Quarkus, Open Liberty поставляется с функцией живой перезагрузки.
  • Micronaut: С помощью фреймворка Micronaut можно программировать микросервисы и бессерверные приложения на Java. Как и в Quarkus, здесь используется GraalVM.
  • Spring/Spring Boot: Spring — это, пожалуй, самый популярный Java-фреймворк для веб-приложений. Spring основан на GraalVM и, помимо создания микросервисов, поддерживает реактивное программирование и живую перезагрузку. При сравнении производительности Quarkus обошел Spring. Существующий проект Spring можно относительно легко перенести на Quarkus.

Каковы плюсы и минусы Quarkus?

Основное преимущество разработки Java-приложений с помощью Quarkus заключается в увеличении производительности. Это особенно важно при использовании Java-приложений в контейнерных средах. К преимуществам производительности относятся:

  • Быстрое время запуска приложения
  • Низкое потребление памяти
  • Почти мгновенное масштабирование сервисов
  • Меньшие требования к пространству для собственных образов

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

  • Eclipse MicroProfile
  • Spring Dependency Injection
  • Hibernate ORM

Quarkus также предлагает живую среду кодирования, в которой разработчики могут быстро создавать прототипы. Функция живой перезагрузки способствует плавной разработке. После активации режима dev изменения в исходном коде и конфигурации компилируются в фоновом режиме. Разработчику достаточно перезагрузить окно браузера, чтобы понять изменения.

Наконец, в заключение мы рассмотрим недостатки использования Quarkus. В основном они связаны с оптимизацией, которая происходит во время компиляции.

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

Quarkus не предназначен для любого Java-проекта. В некоторой степени использование этого фреймворка требует преобразования процессов.

Оцените статью
cdelat.ru
Добавить комментарий