- PVSM.RU - https://www.pvsm.ru -
Седьмого марта компания RedHat (вскоре — IBM) представила [1] новый фреймворк — Quarkus [2]. По словам разработчиков, этот фреймворк базируется на GraalVM и OpenJDK HotSpot и предназначен для Kubernetes. Стек Quarkus включает в себя: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus и другие.
Цель создания — сделать Java лидирующей платформой для развертывания в Kubernetes и разработки serverless приложений, предоставляя разработчикам унифицированный подход к разработке как в реактивном, так и в императивном стиле.
Если смотреть на эту [3] классификацию фреймворков, то Quarkus где-то между "Aggregators/Code Generators" и "High-level fullstack frameworks". Это уже больше, чем агрегатор, но и до full-stack не дотягивает, т.к. заточен на разработку 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 с дополнительным обвесом.
Самое простое приложение, написанное на Quarkus, будет выглядеть так:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
Это буквально один класс и его достаточно! Можно запустить приложение при помощи Maven в режиме разработки:
mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello
Отличие от привычного приложения — нет класса Application! Quarkus поддерживает hot reload, так что можно менять приложение, не перезапуская его, тем самым разработка становится ещё быстрее.
Что дальше? Можно добавить сервис в контроллер при помощи аннотации Inject [4]. Код сервиса:
@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!
Заметьте, что в Quarkus используются стандартные аннотации из знакомых фреймворков — CDI и JAX-RS. Ничего нового учить не надо, если вы работали с CDI и JAX-RS до этого, конечно.
Используется Hibernate и стандартные JPA аннотации для сущностей. Как и в случае с REST контроллерами, необходимо написать минимум кода. Достаточно указать зависимости в файле сборки, расставить аннотации @Entity
и сконфигурировать datasource в application.properties.
Все. Никаких sessionFactory, persistence.xml и прочих сервисных файлов. Пишем только тот код, который нужен. Однако, при необходимости, можно создать файл persistence.xml и более тонко сконфигурировать ORM слой.
Quarkus поддерживает кэширование сущностей, коллекций для отношений один-ко-многим, а также запросов. На первый взгляд, выглядит здорово, но это локальное кэширование, для одного узла Kubernetes. Т.е. кэши разных узлов не синхронизированы между собой. Я надеюсь, это временно.
Как было сказано выше, 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 + "!";
});
}
}
Асинхронный код также можно перенести в сервис, результать будет таким же.
Тесты для Quarkus-приложений можно писать на JUnit4 или JUnit5. Ниже дан пример теста для endpoint, он написан при помощи RestAssured, но можно использовать и другой фреймворк:
@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 предписывает запустить приложение перед тем, как запускать тесты. В остальном — знакомый всем разработчикам код.
Поскольку Quarkus тесно интегрирован с GraalVM, то, конечно же, можно генерировать платформо-зависимый код. Для этого нужно установить GraalVM и указать переменную среды GRAALVM_HOME. Дальше прописать профиль для сборки [5] и указать его при сборке приложения:
mvn package -Pnative
Что интересно, сгенерированное приложение можно протестировать. И это важно, поскольку исполнение “родного” кода может отличаться от исполнения на JVM. Аннотация @SubstrateTest запускает платформо-зависимый код приложения. Переиспользование существующего кода тестов можно осуществить при помощи наследования, в итоге код для тестирования платформо-зависимого приложения будет выглядеть вот так:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
Сгенерированный образ можно запаковать в Docker и запускать в Kubernetes или OpenShift, подробно описано в инструкции [6].
Фреймворк Quarkus можно использовать с Maven и Gradle. Maven поддерживается в полной мере, в отличие от Gradle. К сожалению, на текущий момент Gradle не поддерживает генерацию пустого проекта, на сайте есть подробный учебник [7].
Quarkus — расширяемый фреймворк. На текущий момент существует порядка 40 расширейний [8], которые добавляют различную функциональность — от поддержки Spring DI контейнера [9] и Apache Camel [10] до логгирования и публикации метрик для работающих сервисов. И уже существует расширение для поддержки написания приложений на языке Kotlin, в дополнение к Java.
По моему мнению, Quarkus вполне себе в трендах времени. Разработка backend кода становится все проще и проще, и этот фреймворк ещё больше упрощает и ускоряет разработку сервисов, добавляя “родную” поддержку Docker и Kubernetes. Огромный плюс — встроенная поддержка GraalVM и генерации платформо-зависимых образов, что позволяет делать сервисы по-настоящему быстро стартующими и занимающими мало места в памяти. А это очень важно в наше время массового увлечения микросервисами и serverless архитектурой.
Официальный сайт — quiarkus.io [2]. Примеры проектов для быстрого старта уже есть на GitHub [11].
Автор: Андрей Беляев
Источник [12]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/311176
Ссылки в тексте:
[1] представила: https://developers.redhat.com/blog/2019/03/07/quarkus-next-generation-kubernetes-native-java-framework/
[2] Quarkus: https://quarkus.io/
[3] эту: https://dzone.com/articles/classification-of-development-frameworks-for-enter
[4] Inject: https://habr.com/ru/users/inject/
[5] прописать профиль для сборки: https://github.com/quarkusio/quarkus-quickstarts/blob/fae88eaab10ed4d68ac44e0b8b7416e631b8a6f9/getting-started-knative/pom.xml#L105
[6] инструкции: https://quarkus.io/guides/kubernetes-guide
[7] учебник: https://quarkus.io/guides/gradle-tooling.html
[8] 40 расширейний: https://quarkus.io/extensions/
[9] Spring DI контейнера: https://quarkus.io/extensions/#migration
[10] Apache Camel: https://quarkus.io/extensions/#integration
[11] GitHub: https://github.com/quarkusio/quarkus-quickstarts
[12] Источник: https://habr.com/ru/post/443242/?utm_source=habrahabr&utm_medium=rss&utm_campaign=443242
Нажмите здесь для печати.