Úvod
XNUMX. marca RedHat (čoskoro IBM)
Cieľom je urobiť z Java poprednú platformu pre nasadenie Kubernetes a vývoj aplikácií bez servera, čo vývojárom poskytne jednotný prístup k vývoju v reaktívnom aj imperatívnom štýle.
Ak sa pozriete na
Sľubovaná je veľmi vysoká rýchlosť spúšťania aplikácií a nízka spotreba pamäte. Tu sú údaje z webovej stránky vývojára:
Čas od začiatku po prvú odpoveď (odpovede):
konfigurácia
REST
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
Tradičný cloudový natívny zásobník*
4.3
9.5
Spotreba pamäte (Mb):
konfigurácia
REST
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
Tradičný cloudový natívny zásobník*
140
218
Pôsobivé, však?
*Nenašiel som žiadne informácie o tomto technologickom balíku, môžeme predpokladať, že ide o nejaký druh Spring Boot s dodatočnou súpravou karosérie.
Ahoj svet!
Najjednoduchšia aplikácia napísaná v Quarkus by vyzerala takto:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
Je to doslova jedna trieda a to stačí! Aplikáciu môžete spustiť pomocou Maven vo vývojovom režime:
mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello
Rozdiel oproti bežnej aplikácii je v tom, že neexistuje trieda aplikácií! Quarkus podporuje rýchle opätovné načítanie, takže svoju aplikáciu môžete zmeniť bez jej reštartovania, vďaka čomu je vývoj ešte rýchlejší.
Čo bude ďalej? Službu môžete do ovládača pridať pomocou anotácie
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "Hello " + name + "!";
}
}
Ovládač:
@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!
Všimnite si, že Quarkus používa štandardné anotácie zo známych rámcov - CDI a JAX-RS. Nie je potrebné sa učiť nič nové, ak ste už s CDI a JAX-RS pracovali, samozrejme.
Práca s databázou
Používajú sa anotácie hibernácie a štandardné anotácie JPA pre entity. Rovnako ako v prípade ovládačov REST musíte napísať minimum kódu. Stačí uviesť závislosti v súbore zostavy, pridať anotácie @Entity
a nakonfigurovať zdroj údajov v application.properties.
Všetky. Žiadne súbory sessionFactory, persistence.xml alebo iné súbory služieb. Píšeme len kód, ktorý je potrebný. V prípade potreby však môžete vytvoriť súbor persistence.xml a jemnejšie nakonfigurovať vrstvu ORM.
Quarkus podporuje ukladanie entít do vyrovnávacej pamäte, kolekcie pre vzťahy typu one-to-many a dotazy. Na prvý pohľad to vyzerá super, ale je to tak miestne ukladanie do vyrovnávacej pamäte pre jeden uzol Kubernetes. Tie. Vyrovnávacie pamäte rôznych uzlov nie sú navzájom synchronizované. Dúfam, že je to dočasné.
Asynchrónne vykonávanie kódu
Ako už bolo spomenuté vyššie, Quarkus podporuje aj reaktívny štýl programovania. Kód predchádzajúcej aplikácie môže byť napísaný v inej forme.
@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 + "!";
});
}
}
Do služby je možné preniesť aj asynchrónny kód, výsledok bude rovnaký.
Testovanie
Testy pre aplikácie Quarkus môžu byť napísané v JUnit4 alebo JUnit5. Nižšie je uvedený príklad testu pre koncový bod, je napísaný pomocou RestAssured, ale možno použiť aj iný rámec:
@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 + "!"));
}
}
Anotácia @QuarkusTest vám dáva pokyn na spustenie aplikácie pred spustením testov. Zvyšok je kód známy všetkým vývojárom.
Aplikácia špecifická pre platformu
Keďže Quarkus je úzko integrovaný s GraalVM, je samozrejme možné generovať kód špecifický pre platformu. Ak to chcete urobiť, musíte nainštalovať GraalVM a zadať premennú prostredia GRAALVM_HOME. Ďalej
mvn package -Pnative
Zaujímavosťou je, že vygenerovanú aplikáciu je možné otestovať. A to je dôležité, pretože vykonávanie natívneho kódu sa môže líšiť od vykonávania na JVM. Anotácia @SubstrateTest spúšťa kód aplikácie špecifický pre platformu. Opätovné použitie existujúceho testovacieho kódu je možné vykonať pomocou dedičnosti; v dôsledku toho bude kód na testovanie aplikácie závislej od platformy vyzerať takto:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
Vygenerovaný obrázok je možné zabaliť do Dockera a spustiť v Kubernetes alebo OpenShift, podrobne popísaných v
náradie
Rámec Quarkus je možné použiť s Maven a Gradle. Maven je plne podporovaný, na rozdiel od Gradle. Žiaľ, momentálne Gradle nepodporuje generovanie prázdneho projektu, podrobné informácie sú na webovej stránke
expanzia
Quarkus je rozšíriteľný rámec. V súčasnosti existuje objednávka
Záver
Quarkus je podľa mňa celkom v súlade s dobovými trendmi. Vývoj backendového kódu je čoraz jednoduchší a tento rámec ďalej zjednodušuje a urýchľuje vývoj služieb pridaním natívnej podpory pre Docker a Kubernetes. Obrovským plusom je vstavaná podpora pre GraalVM a generovanie obrazov závislých od platformy, čo umožňuje, aby sa služby spúšťali naozaj rýchlo a zaberali málo miesta v pamäti. A to je veľmi dôležité v našej dobe masovej vášne pre mikroslužby a architektúru bez serverov.
Oficiálna stránka -
Zdroj: hab.com