Blog ENI : Toute la veille numérique !
🐠 -25€ dès 75€ 
+ 7 jours d'accès à la Bibliothèque Numérique ENI. Cliquez ici
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Quarkus
  3. Développement d'applications avec Quarkus
Extrait - Quarkus Développer des applications microservices en Java pour le cloud et Kubernetes
Extraits du livre
Quarkus Développer des applications microservices en Java pour le cloud et Kubernetes Revenir à la page d'achat du livre

Développement d'applications avec Quarkus

Création d’un projet avec la ligne de commande, code.quarkus.io ou un IDE

Pour créer un projet, on peut utiliser la CLI (Command-Line Interface - interface ligne de commande) de Quarkus, Maven, le site https://code.quarkus.io ou un IDE (Integrated Development Environment ou environnement de développement intégré).

La manière la plus simple de créer un projet est d’utiliser le site https://code.quarkus.io. Il contient un formulaire pour spécifier les coordonnées du projet Maven ou Gradle à créer, ainsi qu’une barre de recherche afin d’ajouter les extensions que vous voulez utiliser. Ce site permet d’ajouter les extensions présentes sur la plateforme Quarkus ; la plateforme est un ensemble d’extensions testées les unes avec les autres et qui garantissent qu’elles peuvent être utilisées conjointement sans conflit.

Une fois la sélection d’extensions réalisée, vous pouvez télécharger un ZIP du projet ou directement faire un push sur un repository GitHub.

images/04EP01.png

Pour créer un projet en ligne de commande, on peut utiliser la CLI Quarkus ou Maven.

La CLI Quarkus est installable de plusieurs manières en fonction de l’OS : SDKMAN (Linux et macOS), Homebrew (Linux et macOS) ou Chocolatey (Windows).

Pour installer la CLI via SDKMAN!, utilisez la commande suivante :

sdk install...

Anatomie d’un projet Quarkus

Voici la structure du projet Quarkus généré :

images/04EP03.png

Le projet généré contient les éléments suivants :

  • Plusieurs Dockerfiles permettant de générer une image Docker de diverses manières.

  • Une classe exemple de ressource REST de type Hello World.

  • Un index.html qui permet de tester le projet directement dans un navigateur.

  • Le fichier principal de configuration de l’application : application.properties.

  • Une classe de test unitaire et une classe de test d’intégration.

  • Un pom.xml qui définit le build Maven.

  • Un README.md qui contient les principales commandes Maven permettant de lancer l’application et de la packager. Dans ce README.md, une section sera ajoutée pour chaque extension avec lien vers son guide.

Chaque extension Quarkus a un guide associé disponible sur https://quarkus.io/guides. Les guides forment la documentation de Quarkus, ce sont des explications pas-à-pas d’utilisation d’une extension associée le plus souvent à un projet quickstart (exemple de démarrage rapide), téléchargeable à l’adresse https://github.com/quarkusio/quarkus-quickstarts

Si on regarde plus en détail le pom.xml, celui-ci va procéder comme suit :

  • Importer la BOM (Bill of Materials) de Quarkus qui permet de gérer les dépendances des extensions :

<dependencyManagement> 
  <dependencies> 
    <dependency> 
      <groupId>${quarkus.platform.group-id}</groupId> 
      <artifactId>${quarkus.platform.artifact-id}</artifactId> 
      <version>${quarkus.platform.version}</version> ...

Bases : configuration, logs, injection de dépendances et tests

1. La configuration

Le fichier principal de configuration de Quarkus est le fichier application.properties qui doit être dans le classpath de l’application. On le retrouvera donc dans le répertoire standard Maven src/main/resources.

La classe GreetingResource générée par défaut est la suivante :

@Path("/hello") 
public class GreetingResource { 
 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String hello() { 
        return "Hello RESTEasy"; 
    } 
} 

Faire une requête GET sur l’URI (Uniform Resource Identifier) /hello de l’application va retourner une réponse HTTP avec comme corps les mots « Hello RESTEasy ». Le développement d’applications REST sera vu en détail dans le chapitre Développement d’applications avec Quarkus, section Webservice REST avec JAX-RS.

Pour passer d’un message de retour codé en dur à un message de retour stocké dans la configuration, nous devons définir une propriété de configuration dans le fichier application.properties :

greeting.message=Hello World 

Le fichier de configuration va contenir une ligne définissant la propriété  greeting.message.

Puis il nous faut injecter cette propriété dans la classe GreetingResource :

@Path("/hello") 
public class GreetingResource { 
    @ConfigProperty(name="greeting.message") String message; 
 
    @GET 
    @Produces(MediaType.TEXT_PLAIN) 
    public String hello() { 
        return message; 
    } 
} 

La classe GreetingResource va être modifiée pour injecter la propriété de configuration grâce à l’annotation @ConfigProperty, puis elle va utiliser sa valeur comme corps de réponse HTTP.

L’annotation @ConfigProperty permet de définir une valeur par défaut si la propriété n’est...

Developer Joy : dev mode, dev UI, continuous testing, dev services

1. Le dev mode

Le dev mode est un mode spécial de lancement d’une application Quarkus sur le poste local d’un développeur en ligne de commande. Dans ce mode, l’application va utiliser le profil de configuration %dev et de nombreux outils d’aide au développement seront disponibles.

On peut lancer l’application en mode développeur (dev) avec la CLI, le plugin Maven, ou le plugin Gradle.

Pour lancer l’application avec la CLI, utilisez la ligne de commande suivante :

quarkus dev 

Pour lancer l’application avec le plugin Maven, utilisez la ligne de commande suivante :

mvn quarkus:dev 

Pour lancer l’application avec le plugin Gradle, utilisez la ligne de commande suivante :

gradle --console=plain quarkusDev 

Le résultat est le suivant :

images/04EP04.png

Dans les logs, on voit la bannière Quarkus, trois logs de démarrage, puis l’aide de la dev console

Vous voici maintenant dans la dev console. Celle-ci est interactive, les principales commandes sont affichées en bas : [r] pour activer les tests en continu, [:] pour un terminal interactif permettant de passer des commandes à la console, [h] pour l’aide, [s] pour forcer le redémarrage de l’application et [q] pour la quitter.

Redémarrer l’application n’est normalement pas nécessaire car Quarkus va le faire automatiquement à chaque modification de code, fichier de configuration ou ajout de dépendance dans le fichier pom.xml. Et ce redémarrage...

Webservice REST avec JAX-RS

1. Les extensions HTTP

Quarkus permet de développer des endpoints (points de terminaison) HTTP via les frameworks suivants :

  • RESTEasy : pour les services web REST selon la spécification JAX-RS (Jakarta RESTful Web Services).

  • Undertow : pour le développement de Servlet.

  • Vert.x Reactive routes : pour des endpoints légers et réactifs directement basés sur Vert.x.

  • Spring Web : pour les services web REST compatibles avec les annotations Spring Web. Quarkus n’utilise pas de librairie Spring lors du fonctionnement d’une application. La couche de compatibilité Spring va lire les annotations spécifiques Spring, puis générer le code Quarkus correspondant. Pour Spring Web, elle va générer du code RESTEasy.

Quelle que soit l’extension HTTP utilisée, celle-ci s’intégrera avec le framework Eclipse Vert.x qui est au cœur de la stack (pile en français) HTTP de Quarkus.

Vert.x utilise le framework Netty pour le transport HTTP, les entrées-sorties sur le réseau seront donc faites via Netty. Netty implémente des entrées-sorties non bloquantes ; c’est grâce à Vert.x et Netty que le cœur de Quarkus est réactif. Ceci sera expliqué plus en détail dans le chapitre Développement d’applications réactives.

images/04EP10.png

2. Le développement d’un endpoint REST avec JAX-RS

RESTEasy (https://resteasy.dev) est un framework de développement de service web RESTful (service web obéissant aux principes de développement REST) qui implémente la spécification JAX-RS (Jakarta RESTful Web Services, anciennement Java API for RESTful Web Services).

Les principes RESTful peuvent être résumés en l’utilisation du protocole HTTP pour exposer un service web :

  • L’URI définit la ressource à appeler.

  • Les verbes HTTP (GET, POST, PUT, DELETE) définissent l’action à effectuer sur la ressource.

  • Les codes de statut HTTP définissent le résultat de la requête : 2XX OK, 4XX erreur client, 5XX erreur serveur.

On appellera « ressource » la classe qui implémente un service REST, et « endpoint » l’URI racine du service. Par exemple, la ressource...

Documentation d’API avec OpenAPI

OpenAPI est une spécification qui vise à standardiser la description des API pour tous les langages de programmation. Elle permet la découverte du fonctionnement d’une API sans nécessiter l’accès au code source ou l’introspection du réseau.

Eclipse Microprofile OpenAPI fournit un ensemble d’annotations permettant de documenter une API de manière compatible avec la spécification OpenAPI. 

SmallRye OpenAPI est l’extension qui permet le support d’Eclipse Microprofile OpenAPI dans Quarkus ; vous pouvez l’ajouter à votre application via :

  • la CLI Quarkus :

quarkus extension add quarkus-smallrye-openapi 
  • le plugin Maven :

mvn quarkus:add-extension -Dextensions="quarkus-smallrye-openapi" 

Ceci va ajouter la dépendance Maven suivante :

<dependency> 
    <groupId>io.quarkus</groupId> 
    <artifactId>quarkus-smallrye-openapi</artifactId> 
</dependency> 

Dès l’ajout de cette dépendance, une documentation par défaut de l’API est disponible à l’URL http://localhost:8080/q/openapi. Cette URL est configurable via la propriété quarkus.smallrye-openapi.path.

Pour personnaliser cette documentation par défaut, vous pouvez utiliser les annotations suivantes :...

Appel d’un autre service web avec le client REST

Dans une architecture de type micro-service, il est fréquent qu’un service ait besoin d’en appeler un autre.

Par exemple, un service produit pourrait avoir besoin d’appeler un service prix pour récupérer le prix d’un produit. Si ce service prix est un service accessible via HTTP, il est possible d’utiliser l’extension REST Client qui fournit un client HTTP obéissant aux principes REST.

Quarkus propose deux extensions REST Client : REST Client Classic et REST Client Reactive. Le client REST réactif est plus performant que le client REST classique et est compatible avec un développement impératif. De plus, il détecte et gère automatiquement les entrées-sorties bloquantes. Nous n’allons pour l’instant utiliser aucune fonctionnalité propre au développement réactif qui sera vu dans le chapitre Développement d’applications réactives. L’extension REST Client reactive est donc conseillée même pour le développement impératif et l’utilisation d’entrées-sorties bloquante.

Des extensions REST Client spécifiques supportant la sérialisation JSON via Jackson ou JSON-B existent. Il est plus simple de les utiliser que d’ajouter séparément l’extension REST Client et une extension JSON. La librairie Jackson étant plus connue que JSON-B, nous allons l’utiliser dans les exemples de ce chapitre.

Pour ajouter l’extension REST Client Reactive avec Jackson a un projet existant, vous pouvez utiliser la ligne de commande de la CLI Quarkus suivante :

quarkus extension add rest-client-reactive-jackson 

ou la ligne de commande Maven suivante :

mvn quarkus:add-extension \ 
    -Dextension=rest-client-reactive-jackson 

Ces commandes ajouteront la dépendance Maven suivante au fichier pom.xml :

<dependency> 
    <groupId>io.quarkus</groupId> 
    <artifactId>quarkus-rest-client-reactive-jackson</artifactId> ...

Fonctionnalités HTTP

1. Servir du contenu statique

Il est possible d’ajouter du contenu statique (fichiers HTML, CSS, JS, images…) dans le répertoire META-INF/resources, il sera servi automatiquement par le serveur HTTP de Quarkus.

Ce contenu statique n’est pas compressé par défaut. Pour activer la compression, il faut configurer la propriété quarkus.http.enable-compression=true.

Quarkus va compresser uniquement les ressources dont les types de contenu, inférés depuis l’extension du fichier à servir, sont text/html, text/plain, text/xml, text/css, text/javascript ou application/javascript. Cette liste est configurable via la propriété de configuration quarkus.http.compress-media-types.

WebJars est un projet qui fournit des dépendances web (HTML, JS, CSS) en tant que JAR pour faciliter leur utilisation depuis une application Java.

Quarkus facilite l’utilisation des WebJars via l’extension Quarkus WebJars Locator.

Pour ajouter l’extension WebJars Locator à un projet existant, vous pouvez utiliser la ligne de commande de la CLI Quarkus suivante :

quarkus extension add webjars-locator 

ou la ligne de commande Maven suivante :

mvn quarkus:add-extension \ 
    -Dextension=webjars-locator 

Ces commandes ajouteront la dépendance Maven suivante au fichier pom.xml :

<dependency> 
    <groupId>io.quarkus</groupId> 
    <artifactId>quarkus-webjars-local</artifactId> 
</dependency> 

Vous pouvez ensuite ajouter un WebJar au pom.xml de l’application ; par exemple, pour le WebJar Jquery, il faut ajouter la dépendance suivante :

<dependency> 
    <groupId>org.webjars</groupId> 
    <artifactId>jquery</artifactId> 
    <version>3.1.1</version> 
</dependency> 

Puis il faut utiliser la dépendance web dans le code HTML :

<script src="/webjars/jquery/jquery.min.js"> 

Quarkus WebJars Locator permet de se passer de la version de la librairie...

Sécurité : authentification et habilitation

Quarkus supporte un grand nombre de méthodes d’authentification différentes : HTTP Basic, Bearer Token, mTLS… ainsi qu’un grand nombre de fournisseurs d’authentification différents : properties file, JWT, OIDC, LDAP, BDD…

Pour simplifier les exemples de ce livre, nous utiliserons une authentification de type HTTP Basic avec des authentifications (utilisateur et mot de passe) incluses dans le fichier application.properties. Celle-ci est fournie par l’extension Elytron Security Properties File.

Dans la vie réelle, nous utiliserions plutôt une authentification de type OAuth2 ou OIDC. Une fois configurées, ces extensions permettent de gérer les habilitations de la même manière que l’extension Elytron Security Properties File.

Pour ajouter l’extension Elytron Security Properties File à un projet existant, vous pouvez utiliser la ligne de commande de la CLI Quarkus suivante :

quarkus extension add elytron-security-properties-file 

ou la ligne de commande Maven suivante :

mvn quarkus:add-extension \ 
    -Dextension=elytron-security-properties-file 

Ces commandes ajouteront la dépendance Maven suivante au fichier pom.xml :

<dependency> 
    <groupId>io.quarkus</groupId> 
    <artifactId>quarkus-elytron-security-properties-file</artifactId> 
</dependency> 

1. L’authentification via fichier de configuration

L’authentification via fichier de configuration permet de définir dans le fichier application.properties des couples utilisateur/mot de passe ainsi que leurs rôles :

quarkus.security.users.embedded.enabled=true 
quarkus.security.users.embedded.plain-text=true 
quarkus.security.users.embedded.users.jdoe=p4ssw0rd 
quarkus.security.users.embedded.users.admin=n0Adm1n 
quarkus.security.users.embedded.roles.jdoe=user 
quarkus.security.users.embedded.roles.admin=user,admin 

Nous avons ici défini deux utilisateurs : admin dont le mot de passe est n0Adm1n et qui a les rôles user et admin ; et jdoe dont le mot de passe est p4ssw0rd et qui a le rôle user.

Quel que soit le type d’authentification choisi, les habilitations se feront soit via annotations, soit via le fichier...

Applications ligne de commande

Jusqu’ici, nous avons uniquement vu le développement d’applications de type service web qui se démarrent mais ne se finissent jamais.

Il est aussi possible avec Quarkus de créer des applications de type ligne de commande qui se démarrent et se finissent.

Pour créer une application ligne de commande, aucune extension n’est nécessaire. 

Vous pouvez créer une application ligne de commande via la commande de la CLI Quarkus suivante :

quarkus create app hello-command --no-code 

ou via la commande Maven suivante :

mvn io.quarkus.platform:quarkus-maven-plugin:2.16.1.Final:create \ 
    -DnoCode 

Par défaut, la CLI et le plugin Maven vont inclure l’extension RESTEasy lors de la création d’un projet. Pour créer un projet qui n’inclut aucune extension, il faut ajouter l’option --no-code (pour la CLI) ou -DnoCode (pour Maven). De même, si vous générez une application depuis code.quarkus.io, il faut cliquer sur More Options et sélectionner Started Code à none pour éviter de devoir supprimer manuellement l’extension RESTEasy du fichier pom.xml.

L’implémentation d’une application ligne de commande se fait via une classe qui implémente QuarkusApplication et est annotée par @QuarkusMain.

Voici un simple Hello World :

@QuarkusMain ...