Introductie
Op XNUMX maart zal RedHat (binnenkort IBM)
Het doel is om van Java het leidende platform te maken voor de implementatie van Kubernetes en de ontwikkeling van serverloze applicaties, waardoor ontwikkelaars een uniforme benadering van ontwikkeling krijgen in zowel reactieve als imperatieve stijlen.
Als je kijkt
Er wordt een zeer hoge snelheid bij het starten van applicaties en een laag geheugengebruik beloofd. Hier zijn de gegevens van de website van de ontwikkelaar:
Tijd vanaf start tot eerste reactie(s):
Configuratie
REST
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
Traditionele cloud-native stack*
4.3
9.5
Geheugenverbruik (Mb):
Configuratie
REST
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
Traditionele cloud-native stack*
140
218
Indrukwekkend, nietwaar?
*Ik heb geen informatie gevonden over deze technologiestapel, we kunnen aannemen dat dit een soort Spring Boot is met een extra bodykit.
Hallo Wereld!
De eenvoudigste applicatie geschreven in Quarkus zou er als volgt uitzien:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
Het is letterlijk één les en dat is genoeg! U kunt de applicatie uitvoeren met Maven in de ontwikkelingsmodus:
mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello
Het verschil met een reguliere applicatie is dat er geen Application klasse is! Quarkus ondersteunt hot reload, zodat u uw applicatie kunt wijzigen zonder deze opnieuw te starten, waardoor de ontwikkeling nog sneller gaat.
Wat is het volgende? U kunt een service aan een controller toevoegen met behulp van een annotatie
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "Hello " + name + "!";
}
}
controleur:
@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!
Merk op dat Quarkus standaardannotaties gebruikt uit bekende raamwerken - CDI en JAX-RS. Als je al eerder met CDI en JAX-RS hebt gewerkt, hoef je natuurlijk niets nieuws te leren.
Werken met de databank
Er worden slaapstand- en standaard JPA-annotaties voor entiteiten gebruikt. Net als bij REST-controllers moet je een minimum aan code schrijven. Het volstaat om de afhankelijkheden in het assemblagebestand aan te geven en annotaties toe te voegen @Entity
en configureer de gegevensbron in application.properties.
Alle. Geen sessionFactory, persistentie.xml of andere servicebestanden. Wij schrijven alleen de code die nodig is. Indien nodig kunt u echter een persistentie.xml-bestand maken en de ORM-laag nauwkeuriger configureren.
Quarkus ondersteunt het cachen van entiteiten, verzamelingen voor één-op-veel-relaties en query's. Op het eerste gezicht lijkt het geweldig, maar dat is het ook lokaal caching, voor één Kubernetes-knooppunt. Die. De caches van verschillende knooppunten zijn niet met elkaar gesynchroniseerd. Ik hoop dat dit tijdelijk is.
Asynchrone code-uitvoering
Zoals hierboven vermeld ondersteunt Quarkus ook de reactieve programmeerstijl. De code van de vorige applicatie kan in een andere vorm worden geschreven.
@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 + "!";
});
}
}
Asynchrone code kan ook naar de service worden overgedragen, het resultaat zal hetzelfde zijn.
Testen
Tests voor Quarkus-applicaties kunnen worden geschreven in JUnit4 of JUnit5. Hieronder staat een voorbeeldtest voor een endpoint, deze is geschreven met RestAssured, maar er kan ook een ander framework worden gebruikt:
@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 + "!"));
}
}
De @QuarkusTest-annotatie geeft aan dat u de applicatie moet uitvoeren voordat u tests uitvoert. De rest is code die bekend is bij alle ontwikkelaars.
Platformspecifieke applicatie
Omdat Quarkus nauw geïntegreerd is met GraalVM, is het uiteraard mogelijk om platformspecifieke code te genereren. Om dit te doen, moet u GraalVM installeren en de omgevingsvariabele GRAALVM_HOME opgeven. Verder
mvn package -Pnative
Interessant is dat de gegenereerde applicatie kan worden getest. En dit is belangrijk omdat de uitvoering van native code kan verschillen van de uitvoering op de JVM. De @SubstrateTest-annotatie voert platformspecifieke applicatiecode uit. Het hergebruiken van bestaande testcode kan via overerving, waardoor de code voor het testen van een platformafhankelijke applicatie er als volgt uit zal zien:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
De gegenereerde image kan worden verpakt in Docker en worden uitgevoerd in Kubernetes of OpenShift, zoals gedetailleerd beschreven in
Toolkit
Het Quarkus-framework kan worden gebruikt met Maven en Gradle. Maven wordt volledig ondersteund, in tegenstelling tot Gradle. Helaas ondersteunt Gradle momenteel geen het genereren van een leeg project; er staat gedetailleerde informatie op de website
uitbreiding
Quarkus is een uitbreidbaar raamwerk. Momenteel is er een bestelling
Conclusie
Wat mij betreft sluit Quarkus helemaal aan bij de trends van die tijd. Het ontwikkelen van backend-code wordt steeds eenvoudiger, en dit raamwerk vereenvoudigt en versnelt de ontwikkeling van diensten verder door native ondersteuning voor Docker en Kubernetes toe te voegen. Een groot pluspunt is de ingebouwde ondersteuning voor GraalVM en het genereren van platformafhankelijke images, waardoor services heel snel kunnen opstarten en weinig geheugenruimte in beslag nemen. En dit is erg belangrijk in onze tijd van massale passie voor microservices en serverloze architectuur.
Officiële site -
Bron: www.habr.com