
Présentation
Le 7 mars, RedHat (bientôt IBM) a présenté le nouveau framework, Quarkus . Selon les développeurs, ce framework est basé sur GraalVM et OpenJDK HotSpot et est conçu pour Kubernetes. La pile Quarkus comprend: JPA / Hibernate, JAX-RS / RESTEasy, Eclipse Vert.x, Netty, Apache Camel, Kafka, Prometheus et autres.
L'objectif est de faire de Java la plate-forme leader pour le déploiement sur Kubernetes et le développement d'applications sans serveur, offrant aux développeurs une approche unifiée du développement de styles réactifs et impératifs.
Si vous regardez cette classification des frameworks, Quarkus se situe quelque part entre "Aggregators / Code Generators" et "High-level fullstack frameworks". C'est déjà plus qu'un agrégateur, mais n'atteint pas non plus la pile complète, car terrain pour le développement du backend.
Une vitesse de lancement d'application très élevée et une faible consommation de mémoire sont promises. Voici les données du site du développeur:
Temps du début à la ou aux premières réponses:
La configuration | REPOS | REST + JPA |
---|
Quarkus + GraalVM | 0,014 | 0,055 |
Quarkus + OpenJDK | 0,75 | 2,5 |
Pile native cloud traditionnelle * | 4.3 | 9.5 |
Consommation de mémoire (Mo):
La configuration | REPOS | REST + JPA |
---|
Quarkus + GraalVM | 13 | 35 |
Quarkus + OpenJDK | 74 | 130 |
Pile native cloud traditionnelle * | 140 | 218 |
Impressionnant, non?
* Je n'ai pas trouvé d'informations sur cette pile technologique, nous pouvons supposer qu'il s'agit d'une sorte de Spring Boot avec un kit de carrosserie supplémentaire .
Bonjour tout le monde!
L'application la plus simple écrite en Quarkus ressemblerait à ceci:
@Path("/hello") public class GreetingResource { @GET @Produces(MediaType.TEXT_PLAIN) public String hello() { return "hello"; } }
C'est littéralement une classe et c'est suffisant! Vous pouvez démarrer l'application en utilisant Maven en mode développement:
mvn compile quarkus:dev … $ curl http://localhost:8080/hello hello
Contrairement à l'application habituelle - il n'y a pas de classe Application! Quarkus prend en charge le rechargement à chaud, de sorte que vous pouvez modifier l'application sans la redémarrer, développant ainsi encore plus rapidement.
Et ensuite? Vous pouvez ajouter un service au contrôleur à l'aide de l'annotation Inject . Code de service:
@ApplicationScoped public class GreetingService { public String greeting(String name) { return "Hello " + name + "!"; } }
Contrôleur:
@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!
Notez que Quarkus utilise des annotations standard à partir de frameworks familiers - CDI et JAX-RS. Vous n'avez pas besoin d'apprendre quoi que ce soit de nouveau si vous avez travaillé avec CDI et JAX-RS avant cela, bien sûr.
Travailler avec la base de données
Utilisé par Hibernate et les annotations JPA standard pour les entités. Comme pour les contrôleurs REST, vous devez écrire un minimum de code. Il suffit de spécifier les dépendances dans le fichier d'assemblage, d'organiser les annotations @Entity
et de configurer la source de données dans application.properties.
C’est tout. Aucun sessionFactory, persistence.xml et autres fichiers de service. Nous écrivons uniquement le code nécessaire. Cependant, si nécessaire, vous pouvez créer un fichier persistence.xml et configurer plus finement la couche ORM.
Quarkus prend en charge la mise en cache des entités, les collections pour les relations un-à-plusieurs, ainsi que les requêtes. À première vue, il a fière allure, mais c'est la mise en cache locale , pour un seul hôte Kubernetes. C'est-à-dire les caches de différents nœuds ne sont pas synchronisés entre eux. J'espère que c'est temporaire.
Exécution de code asynchrone
Comme indiqué ci-dessus, Quarkus prend également en charge un style de programmation réactif. Le code de l'application précédente peut être écrit sous une autre 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 + "!"; }); } }
Le code asynchrone peut également être transféré au service, le résultat sera le même.
Test
Les tests pour les applications Quarkus peuvent être écrits en JUnit4 ou JUnit5. Ce qui suit est un exemple de test pour le point de terminaison, il a été écrit à l'aide de RestAssured, mais vous pouvez utiliser un autre cadre:
@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 + "!")); } }
L'annotation @QuarkusTest vous indique d'exécuter l'application avant d'exécuter les tests. Le reste est familier à tous les développeurs de code.
Parce que Quarkus est étroitement intégré à GraalVM, bien sûr, du code spécifique à la plate-forme peut être généré. Pour ce faire, définissez GraalVM et spécifiez la variable d'environnement GRAALVM_HOME. Ensuite, enregistrez un profil pour l'assembly et spécifiez-le lors de la création de l'application:
mvn package -Pnative
Fait intéressant, l'application générée peut être testée. Et cela est important, car l'exécution du code «natif» peut différer de l'exécution sur la JVM. Annotation @SubstrateTest exécute le code d'application spécifique à la plate-forme. La réutilisation du code de test existant peut être effectuée en utilisant l'héritage, par conséquent, le code pour tester l'application spécifique à la plate-forme ressemblera à ceci:
@SubstrateTest public class GreetingResourceIT extends GreetingResourceTest { }
L'image générée peut être empaquetée dans Docker et exécutée dans Kubernetes ou OpenShift, décrite en détail dans les instructions .
Boîte à outils
Le framework Quarkus peut être utilisé avec Maven et Gradle. Maven est entièrement pris en charge, contrairement à Gradle. Malheureusement, pour le moment Gradle ne prend pas en charge la génération d'un projet vide, le site dispose d'un tutoriel détaillé.
Extensions
Quarkus est un framework extensible. Actuellement, il existe environ 40 extensions qui ajoutent diverses fonctionnalités - de la prise en charge du conteneur Spring DI et d' Apache Camel à la journalisation et à la publication des métriques pour l'exécution des services. Et il existe déjà une extension pour prendre en charge l'écriture d'applications dans le langage Kotlin, en plus de Java.
Conclusion
À mon avis, Quarkus fait partie intégrante des tendances temporelles. Le développement du code backend devient plus facile et plus simple, et ce cadre simplifie et accélère davantage le développement des services, en ajoutant la prise en charge «native» de Docker et Kubernetes. Un énorme avantage est la prise en charge intégrée de GraalVM et la génération d'images spécifiques à la plate-forme, qui vous permettent de rendre les services très rapides à démarrer et à occuper peu d'espace mémoire. Et cela est très important à notre époque d'enthousiasme massif pour les microservices et l'architecture sans serveur.
Le site officiel est quarkus.io . Des exemples de projets pour un démarrage rapide sont déjà sur GitHub .