Quarkus — свръхзвукова субатомна Java. Кратък преглед на фреймуърка

Quarkus — свръхзвукова субатомна Java. Кратък преглед на фреймуърка

Въведение

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

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

Ако погледнем на тази класфикацията на фреймворците, Quarkus е някъде между „Агрегатори/Генератори на код“ и „Високонадеждни фреймворци“. Това вече е повече от агрегатор, но още не достига до full-stack, тъй като е насочен към разработка на бекенд.

Обещана е много висока скорост на стартиране на приложението и малък разход на памет. Ето данни от сайта на разработчика:

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

Конфигурация
REST
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Традиционен Cloud Native Stack*
4.3
9.5

Консумация на памет (Mb):

Конфигурация
REST
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Традиционен 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. Кодът на услугата:

@ApplicationScoped
public class GreetingService {

   public String greeting(String name) {
       return "Здравей " + 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
Здравей разработчику!

Забележете, че в 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 е разширяем фреймворк. В момента има около 40 разширения, които добавят различна функционалност — от поддръжка на Spring DI контейнер и Apache Camel до логване и публикуване на метрики за работещи услуги. И вече има разширение за поддръжка на писането на приложения на езика Kotlin, в допълнение към Java.

Заключение

Според мен Quarkus е в крак с времето. Разработването на back-end код става все по-лесно, а този фреймворк още повече опростява и ускорява разработването на услуги, добавяйки "родна" поддръжка за Docker и Kubernetes. Огромен плюс е вградената поддръжка на GraalVM и генерирането на платформа-зависими образи, което позволява услугите да стартират наистина бързо и да заемат малко място в паметта. А това е много важно в нашето време на масово увлечение по микросервизите и serverless архитектура.

Официалният сайт — quarkus.io. Примери за проекти за бързо стартиране вече са на GitHub.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster