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 та розробки serverless додатків, надаючи розробникам уніфікований підхід до розробки як у реактивному, так і в імперативному стилі.

Якщо дивитися на цю класифікацію фреймворків, то 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, так що можна змінювати програму, не перезапускаючи її, тим самим технологія стає ще швидше.

Що далі? Можна додати сервіс у контролер за допомогою інструкції Ін’єкційне. Код сервісу:

@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. Далі прописати профіль для складання та вказати його при складанні програми:

mvn package -Pnative

Що цікаво, згенерований додаток можна протестувати. І це важливо, оскільки виконання "рідного" коду може відрізнятись від виконання на JVM. Анотація @SubstrateTest запускає платформо-залежний код програми. Перевикористання існуючого коду тестів можна здійснити за допомогою успадкування, у результаті код для тестування платформо-залежної програми виглядатиме ось так:

@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {

}

Згенерований образ можна запакувати в Docker і запускати в Kubernetes або OpenShift, докладно описано в інструкції.

інструментарій

Фреймворк Quarkus можна використовувати з Maven та Gradle. Maven підтримується повною мірою, на відміну Gradle. На жаль, зараз Gradle не підтримує генерацію порожнього проекту, на сайті є докладний підручник.

Розширення

Quarkus — фреймворк, що розширюється. На даний момент існує порядок 40 розширений, які додають різну функціональність - від підтримки Spring DI контейнер и Верблюд Апач до логування та публікації метрик для працюючих сервісів. І вже існує розширення для підтримки написання додатків мовою Kotlin, на додаток до Java.

Висновок

На мою думку, Quarkus цілком собі у трендах часу. Розробка backend коду стає все простішою, і цей фреймворк ще більше спрощує і прискорює розробку сервісів, додаючи “рідну” підтримку Docker та Kubernetes. Величезний плюс - вбудована підтримка GraalVM і генерації платформо-залежних образів, що дозволяє робити сервіси, що по-справжньому швидко стартують і займають мало місця в пам'яті. А це дуже важливо у наш час масового захоплення мікросервісами та serverless архітектурою.

Офіційний сайт - quarkus.io. Приклади проектів для швидкого старту вже є GitHub.

Джерело: habr.com

Додати коментар або відгук