въведение
На XNUMX март RedHat (скоро IBM)
Целта е Java да се превърне във водеща платформа за внедряване на Kubernetes и разработка на приложения без сървър, предоставяйки на разработчиците унифициран подход към разработката както в реактивен, така и в императивен стил.
Ако погледнете
Обещават се много висока скорост на стартиране на приложението и ниска консумация на памет. Ето данните от уебсайта на разработчика:
Време от началото до първия отговор (и):
Конфигурация
ПОЧИВКА
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, описани подробно в
Инструменти
Рамката Quarkus може да се използва с Maven и Gradle. Maven се поддържа напълно, за разлика от Gradle. За съжаление, в момента Gradle не поддържа генериране на празен проект; има подробна информация на уебсайта
експанзия
Quarkus е разширяема рамка. В момента има поръчка
Заключение
Според мен Quarkus е доста в крак с тенденциите на времето. Разработването на бекенд код става все по-лесно и по-лесно и тази рамка допълнително опростява и ускорява разработката на услуги чрез добавяне на собствена поддръжка за Docker и Kubernetes. Огромен плюс е вградената поддръжка за GraalVM и генерирането на зависими от платформата изображения, което позволява на услугите да стартират наистина бързо и да заемат малко място в паметта. И това е много важно в нашето време на масова страст към микроуслугите и безсървърната архитектура.
Официален сайт -
Източник: www.habr.com