Einführung
Am XNUMX. März wurde RedHat (bald IBM)
Ziel ist es, Java zur führenden Plattform für die Kubernetes-Bereitstellung und serverlose Anwendungsentwicklung zu machen und Entwicklern einen einheitlichen Ansatz für die Entwicklung sowohl im reaktiven als auch imperativen Stil zu bieten.
Wenn man hinschaut
Es werden eine sehr hohe Geschwindigkeit beim Anwendungsstart und ein geringer Speicherverbrauch versprochen. Hier sind die Daten von der Website des Entwicklers:
Zeit vom Start bis zur ersten Antwort(en):
Konfiguration
REST
REST+JPA
Quarkus+GraalVM
0.014
0.055
Quarkus+OpenJDK
0.75
2.5
Traditioneller Cloud Native Stack*
4.3
9.5
Speicherverbrauch (MB):
Konfiguration
REST
REST+JPA
Quarkus+GraalVM
13
35
Quarkus+OpenJDK
74
130
Traditioneller Cloud Native Stack*
140
218
Beeindruckend, nicht wahr?
*Ich habe keine Informationen zu diesem Technologie-Stack gefunden, wir können davon ausgehen, dass es sich um eine Art Spring Boot mit zusätzlichem Bodykit handelt.
Hallo Welt!
Die einfachste in Quarkus geschriebene Anwendung würde so aussehen:
@Path("/hello")
public class GreetingResource {
@GET
@Produces(MediaType.TEXT_PLAIN)
public String hello() {
return "hello";
}
}
Es ist buchstäblich eine Klasse und das ist genug! Sie können die Anwendung mit Maven im Entwicklungsmodus ausführen:
mvn compile quarkus:dev
…
$ curl http://localhost:8080/hello
hello
Der Unterschied zu einer regulären Anwendung besteht darin, dass es keine Anwendungsklasse gibt! Quarkus unterstützt Hot Reload, sodass Sie Ihre Anwendung ändern können, ohne sie neu starten zu müssen, was die Entwicklung noch schneller macht.
Was weiter? Sie können einem Controller mithilfe einer Anmerkung einen Dienst hinzufügen
@ApplicationScoped
public class GreetingService {
public String greeting(String name) {
return "Hello " + name + "!";
}
}
Regler:
@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!
Beachten Sie, dass Quarkus Standardanmerkungen aus bekannten Frameworks verwendet – CDI und JAX-RS. Wenn Sie bereits mit CDI und JAX-RS gearbeitet haben, müssen Sie natürlich nichts Neues lernen.
Arbeiten mit der Datenbank
Es werden Hibernate- und Standard-JPA-Annotationen für Entitäten verwendet. Wie bei REST-Controllern müssen Sie ein Minimum an Code schreiben. Es reicht aus, die Abhängigkeiten in der Assemblydatei anzugeben und Anmerkungen hinzuzufügen @Entity
und konfigurieren Sie die Datenquelle in application.properties.
Alle. Keine sessionFactory, persistence.xml oder andere Servicedateien. Wir schreiben nur den Code, der benötigt wird. Bei Bedarf können Sie jedoch eine Datei persistence.xml erstellen und die ORM-Ebene feiner konfigurieren.
Quarkus unterstützt das Caching von Entitäten, Sammlungen für Eins-zu-viele-Beziehungen und Abfragen. Auf den ersten Blick sieht es toll aus, ist es aber lokal Caching für einen Kubernetes-Knoten. Diese. Die Caches verschiedener Knoten sind nicht miteinander synchronisiert. Ich hoffe, das ist nur vorübergehend.
Asynchrone Codeausführung
Wie oben erwähnt unterstützt Quarkus auch den reaktiven Programmierstil. Der Code der vorherigen Anwendung kann in einer anderen Form geschrieben werden.
@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 + "!";
});
}
}
Es kann auch asynchroner Code an den Dienst übergeben werden, das Ergebnis ist das gleiche.
Testing
Tests für Quarkus-Anwendungen können in JUnit4 oder JUnit5 geschrieben werden. Nachfolgend finden Sie einen Beispieltest für einen Endpunkt. Er wurde mit RestAssured geschrieben, es kann jedoch auch ein anderes Framework verwendet werden:
@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 + "!"));
}
}
Die Annotation @QuarkusTest weist Sie an, die Anwendung auszuführen, bevor Sie Tests ausführen. Der Rest ist Code, der allen Entwicklern bekannt ist.
Plattformspezifische Anwendung
Da Quarkus eng mit GraalVM integriert ist, ist es natürlich möglich, plattformspezifischen Code zu generieren. Dazu müssen Sie GraalVM installieren und die Umgebungsvariable GRAALVM_HOME angeben. Weiter
mvn package -Pnative
Interessanterweise kann die generierte Anwendung getestet werden. Dies ist wichtig, da sich die Ausführung von nativem Code von der Ausführung auf der JVM unterscheiden kann. Die Annotation @SubstrateTest führt plattformspezifischen Anwendungscode aus. Die Wiederverwendung vorhandener Testcodes kann durch Vererbung erfolgen; der Code zum Testen einer plattformabhängigen Anwendung sieht dann folgendermaßen aus:
@SubstrateTest
public class GreetingResourceIT extends GreetingResourceTest {
}
Das generierte Image kann in Docker gepackt und in Kubernetes oder OpenShift ausgeführt werden, ausführlich beschrieben in
Werkzeuge
Das Quarkus-Framework kann mit Maven und Gradle verwendet werden. Maven wird im Gegensatz zu Gradle vollständig unterstützt. Leider unterstützt Gradle derzeit nicht das Erstellen eines leeren Projekts; detaillierte Informationen finden Sie auf der Website
Extensions
Quarkus ist ein erweiterbares Framework. Derzeit liegt eine Bestellung vor
Abschluss
Meiner Meinung nach liegt Quarkus durchaus im Trend der Zeit. Die Backend-Codeentwicklung wird immer einfacher, und dieses Framework vereinfacht und beschleunigt die Serviceentwicklung weiter, indem es native Unterstützung für Docker und Kubernetes hinzufügt. Ein großes Plus ist die integrierte Unterstützung für GraalVM und die Generierung plattformabhängiger Images, wodurch Dienste sehr schnell gestartet werden können und wenig Speicherplatz beanspruchen. Und das ist in unserer Zeit der Massenbegeisterung für Microservices und serverlose Architektur sehr wichtig.
Offiziellen Website -
Source: habr.com