Хабрахабр

Quarkus — сверхзвуковая субатомная Java. Краткий обзор фреймворка

Введение

По словам разработчиков, этот фреймворк базируется на GraalVM и OpenJDK HotSpot и предназначен для Kubernetes. Седьмого марта компания RedHat (вскоре — IBM) представила новый фреймворк — Quarkus. Стек Quarkus включает в себя: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus и другие.

Цель создания — сделать Java лидирующей платформой для развертывания в Kubernetes и разработки serverless приложений, предоставляя разработчикам унифицированный подход к разработке как в реактивном, так и в императивном стиле.

Это уже больше, чем агрегатор, но и до full-stack не дотягивает, т.к. Если смотреть на эту классификацию фреймворков, то Quarkus где-то между "Aggregators/Code Generators" и "High-level fullstack frameworks". заточен на разработку backend.

Вот данные с сайта разработчика: Обещана очень высокая скорость запуска приложения и небольшой расход памяти.

Время от старта до первого ответа (с):

Конфигурация

REST

REST+JPA

Quarkus+GraalVM

0.014

0.055

Quarkus+OpenJDK

0.75

2.5

Traditional Cloud Native Stack*

4.3

9.5

Потребление памяти (Mb):

Конфигурация

REST

REST+JPA

Quarkus+GraalVM

13

35

Quarkus+OpenJDK

74

130

Traditional Cloud Native Stack*

140

218

Впечатляюще, не так ли?

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

Hello World!

Самое простое приложение, написанное на Quarkus, будет выглядеть так:

@Path("/hello")
public class GreetingResource
}

Можно запустить приложение при помощи Maven в режиме разработки: Это буквально один класс и его достаточно!

mvn compile quarkus:dev

$ curl http://localhost:8080/hello
hello

Quarkus поддерживает hot reload, так что можно менять приложение, не перезапуская его, тем самым разработка становится ещё быстрее. Отличие от привычного приложения — нет класса Application!

Можно добавить сервис в контроллер при помощи аннотации Inject. Что дальше? Код сервиса:

@ApplicationScoped
public class GreetingService { public String greeting(String name) { return "Hello " + name + "!"; }
}

Контроллер:

@Path("/hello")
public class GreetingResource { @Inject GreetingService service; @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public String greeting(@PathParam("name") String name) { return service.greeting(name); }
}

$ curl http://localhost:8080/hello/developer
Hello developer!

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

Работа с базой данных

Как и в случае с REST контроллерами, необходимо написать минимум кода. Используется Hibernate и стандартные JPA аннотации для сущностей. Достаточно указать зависимости в файле сборки, расставить аннотации @Entity и сконфигурировать datasource в application.properties.

Никаких sessionFactory, persistence.xml и прочих сервисных файлов. Все. Однако, при необходимости, можно создать файл persistence.xml и более тонко сконфигурировать ORM слой. Пишем только тот код, который нужен.

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

Асинхронное выполнение кода

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

@Path("/hello")
public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) @Path("/{name}") public CompletionStage<String> greeting(@PathParam("name") String name) { return CompletableFuture.supplyAsync(() -> { return "Hello " + name + "!"; }); }
}

Асинхронный код также можно перенести в сервис, результать будет таким же.

Тестирование

Ниже дан пример теста для endpoint, он написан при помощи RestAssured, но можно использовать и другой фреймворк: Тесты для Quarkus-приложений можно писать на JUnit4 или JUnit5.

@QuarkusTest
public class GreetingResourceTest { @Test public void testGreetingEndpoint() { String uuid = UUID.randomUUID().toString(); given() .pathParam("name", uuid) .when().get("/hello/{name}") .then() .statusCode(200) .body(is("Hello " + uuid + "!")); }
}

В остальном — знакомый всем разработчикам код. Аннотация @QuarkusTest предписывает запустить приложение перед тем, как запускать тесты.

Платформо-зависимое приложение

Для этого нужно установить GraalVM и указать переменную среды GRAALVM_HOME. Поскольку Quarkus тесно интегрирован с GraalVM, то, конечно же, можно генерировать платформо-зависимый код. Дальше прописать профиль для сборки и указать его при сборке приложения:

mvn package -Pnative

И это важно, поскольку исполнение “родного” кода может отличаться от исполнения на JVM. Что интересно, сгенерированное приложение можно протестировать. Переиспользование существующего кода тестов можно осуществить при помощи наследования, в итоге код для тестирования платформо-зависимого приложения будет выглядеть вот так: Аннотация @SubstrateTest запускает платформо-зависимый код приложения.

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest { }

Сгенерированный образ можно запаковать в Docker и запускать в Kubernetes или OpenShift, подробно описано в инструкции.

Инструментарий

Maven поддерживается в полной мере, в отличие от Gradle. Фреймворк Quarkus можно использовать с Maven и Gradle. К сожалению, на текущий момент Gradle не поддерживает генерацию пустого проекта, на сайте есть подробный учебник.

Расширения

На текущий момент существует порядка 40 расширейний, которые добавляют различную функциональность — от поддержки Spring DI контейнера и Apache Camel до логгирования и публикации метрик для работающих сервисов. Quarkus — расширяемый фреймворк. И уже существует расширение для поддержки написания приложений на языке Kotlin, в дополнение к Java.

Заключение

Разработка backend кода становится все проще и проще, и этот фреймворк ещё больше упрощает и ускоряет разработку сервисов, добавляя “родную” поддержку Docker и Kubernetes. По моему мнению, Quarkus вполне себе в трендах времени. А это очень важно в наше время массового увлечения микросервисами и serverless архитектурой. Огромный плюс — встроенная поддержка GraalVM и генерации платформо-зависимых образов, что позволяет делать сервисы по-настоящему быстро стартующими и занимающими мало места в памяти.

Примеры проектов для быстрого старта уже есть на GitHub.
Официальный сайт — quiarkus.io.

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть