
Въведение
На седмото март компания RedHat (в скоро време — IBM) нов фреймворк — . Според думите на разработчиците, този фреймворк е базиран на GraalVM и OpenJDK HotSpot и е предназначен за Kubernetes. Стекът Quarkus включва: JPA/Hibernate, JAX-RS/RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus и други.
Целта на създаването е да направи Java водеща платформа за разгръщане в Kubernetes и разработка на serverless приложения, предоставяйки на разработчиците единен подход както за реактивна, така и за императивна разработка.
Ако погледнем на класификацията на фреймворците, то Quarkus е някъде между «Aggregators/Code Generators» и «High-level fullstack frameworks». Това е вече повече от агрегатор, но все пак не достига до full-stack, тъй като е фокусиран върху разработката на бекенд.
Обещана е много висока скорост на стартиране на приложението и малък разход на памет. Ето данни от сайта на разработчиците:
Време от стартиране до първи отговор (с):
Конфигурация
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 {
@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, така че можете да променяте приложението, без да го рестартирате, което прави разработката още по-бърза.
Какво следва? Можете да добавите услуга в контролера с помощта на анотация . Кодът на услугата:
@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 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. След това и да го укажете при сборка на приложението:
mvn package -PnativeИнтересното е, че генерираното приложение може да бъде тествано. Това е важно, тъй като изпълнението на "родния" код може да се различава от изпълнението на JVM. Анотацията @SubstrateTest стартира платформо-зависимия код на приложението. Повторната употреба на съществуващия код за тестовете може да се осъществи чрез наследяване, като кодът за тестване на платформо-зависимото приложение ще изглежда така:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}Генерираният образ може да бъде опакован в Docker и стартиран в Kubernetes или OpenShift, както е подробно описано в .
Инструментарий
Фреймворкът Quarkus може да се използва с Maven и Gradle. Maven се поддържа напълно, за разлика от Gradle. За съжаление, в момента Gradle не поддържа генерирането на празен проект, на сайта има подробна .
Разширения
Quarkus е разширяем фреймворк. В момента съществуват около , които добавят различна функционалност — от поддръжка на и до логване и публикуване на метрики за работещите услуги. И вече има разширение за поддръжка на писането на приложения на езика Kotlin, в допълнение към Java.
Заключение
На моето мнение, Quarkus със сигурност е в тренда на времето. Разработката на бекенд код става все по-лесна и този фреймворк още повече опростява и ускорява разработката на услуги, добавяйки "родна" поддръжка на Docker и Kubernetes. Огромен плюс е вградената поддръжка на GraalVM и генерирането на платформо-зависими образи, което позволява услугите да стартират наистина бързо и да заемат малко място в паметта. А това е много важно в наше време на масово увлечение по микросервизи и serverless архитектура.
Официален сайт — . Примери за проекти за бързо стартиране вече са налични на .
Източник: habr.com
