Увядзенне
XNUMX сакавіка кампанія RedHat (неўзабаве – IBM)
Мэта стварэння - зрабіць Java лідзіруючай платформай для разгортвання ў Kubernetes і распрацоўкі serverless прыкладанняў, падаючы распрацоўнікам уніфікаваны падыход да распрацоўкі як у рэактыўным, так і ў імператыўным стылі.
Калі глядзець на
Абяцана вельмі высокая хуткасць запуску прыкладання і невялікі выдатак памяці. Вось дадзеныя з сайта распрацоўніка:
Час ад старту да першага адказу (з):
Канфігурацыя
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 - пашыраецца фрэймворк. На бягучы момант існуе парадку
Заключэнне
На маю думку, Quarkus цалкам сабе ў трэндах часу. Распрацоўка backend кода становіцца ўсё прасцей і прасцей, і гэты фрэймворк яшчэ больш спрашчае і паскарае распрацоўку сэрвісаў, дадаючы "родную" падтрымку Docker і Kubernetes. Велізарны плюс — убудаваная падтрымка GraalVM і генерацыі платформа-залежных выяў, што дазваляе рабіць сэрвісы па-сучаснасці хутка якія стартуюць і што займаюць мала месцы ў памяці. А гэта вельмі важна ў наш час масавага захаплення мікрасэрвісамі і serverless архітэктурай.
Афіцыйны сайт -
Крыніца: habr.com