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

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

въведение

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

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

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

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

Време от началото до първия отговор (и):

Конфигурация
ПОЧИВКА
REST+JPA

Quarkus+GraalVM
0.014
0.055

Quarkus+OpenJDK
0.75
2.5

Традиционен облачен собствен стек*
4.3
9.5

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

Конфигурация
ПОЧИВКА
REST+JPA

Quarkus+GraalVM
13
35

Quarkus+OpenJDK
74
130

Традиционен облачен собствен стек*
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 поддържа горещо презареждане, така че можете да промените приложението си, без да го рестартирате, което прави разработката още по-бърза.

Какво следва? Можете да добавите услуга към контролер с помощта на анотация Инжектират. Код на услугата:

@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 и конфигурирайте източника на данни в 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. По-долу е даден примерен тест за крайна точка, той е написан с помощта на 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, описани подробно в Directions.

Инструменти

Рамката Quarkus може да се използва с Maven и Gradle. Maven се поддържа напълно, за разлика от Gradle. За съжаление, в момента Gradle не поддържа генериране на празен проект; има подробна информация на уебсайта учебник.

експанзия

Quarkus е разширяема рамка. В момента има поръчка 40 разширения, които добавят различни функционалности – от поддръжка Пружинен DI контейнер и Apache Camel преди регистриране и публикуване на показатели за работещи услуги. И вече има разширение за поддръжка на писане на приложения в Kotlin, в допълнение към Java.

Заключение

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

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

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

Добавяне на нов коментар