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, так што можна мяняць прыкладанне, не перазапускаючы яго, тым самым распрацоўка становіцца яшчэ хутчэй.

Што далей? Можна дадаць сэрвіс у кантролер пры дапамозе анатацыі. Inject. Код сэрвісу:

@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 кантэйнера и Apache Camel да лагіравання і публікацыі метрык для працуючых сэрвісаў. І ўжо існуе пашырэнне для падтрымкі напісання прыкладанняў на мове Kotlin, у дадатак да Java.

Заключэнне

На маю думку, Quarkus цалкам сабе ў трэндах часу. Распрацоўка backend кода становіцца ўсё прасцей і прасцей, і гэты фрэймворк яшчэ больш спрашчае і паскарае распрацоўку сэрвісаў, дадаючы "родную" падтрымку Docker і Kubernetes. Велізарны плюс — убудаваная падтрымка GraalVM і генерацыі платформа-залежных выяў, што дазваляе рабіць сэрвісы па-сучаснасці хутка якія стартуюць і што займаюць мала месцы ў памяці. А гэта вельмі важна ў наш час масавага захаплення мікрасэрвісамі і serverless архітэктурай.

Афіцыйны сайт - quarkus.io. Прыклады праектаў для хуткага старту ўжо ёсць на GitHub.

Крыніца: habr.com

Дадаць каментар