Quarkus et la DevUI

Contexte

L’annonce de Quarkus a été faite en mars 2019 et la première release en novembre 2019. Le projet est jeune et mature par ses fondations.

avertissement Pour ceux qui connaissent déjà Quarkus, vous pouvez aller directement à la section Dev UI.

Le developpeur Java ne sera pas perdu car il va continuer à travailler avec des API connues commes JAX-RS, JPA et plein d’autres.

avertissement Pour les habitués à Spring, il existe des extensions pour assurer la compatibilité avec Spring DI, Spring Data JPA par exemple.

Le nombre d’extension est très important. Une extension est ni plus ni plus moins une dépendance du projet. Cela permet d’ajouter Hibernate, OpenAPI, Kafka.

Cependant, l’intérêt de l’extension est que cela permet de prendre en charge une partie du travail lors de la compilation pour améliorer les performances à l’exécution. Cela prend au compte aussi des opérations pour le support de GraalVM et de la compilation native.

astuce Nous parlons souvent de Cloud Native. Mais les applications Quarkus fonctionnent avec un simple JDK et pas forcément dans un conteneur.

Comment commencer ?

Des commandes Maven existent pour la création du projet. Le plus simple, à mon avis, est de passer par le site https://code.quarkus.io/

code quarkus

Pour commencer, il suffit de renseigner :

  • Groupe Id

  • Artefact Id

  • Outil de construction : Maven ou Gradle

Puis, il suffit de choisir ces extensions.

Nous allons commencer par sélectionner uniquement l’extension RESTeasy JSON-B afin de réaliser des api REST.

astuce Le petit avion après le nom de l’extension précise que du code d’exemple est fourni dans l’archive générée.

Nous téléchargeons et importons l’archive dans notre IDE. Et nous avons la structure du projet.

  • pom.xml

  • README.md

  • application.properties (dans le dossier src/main/resources)

un exemple d’implémentation JAX-RS dans le répertoire src/main/java

@Path("/hello-resteasy")
public class GreetingResource {

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

mais aussi un test d’intégration dans le répertoire src/test/java

    @Test
    public void testHelloEndpoint() {
        given()
          .when().get("/hello-resteasy")
          .then()
             .statusCode(200)
             .body(is("Hello RESTEasy"));
    }

Pour l’exécution, il faut utiliser la cible quarkus:dev qui permet notamment la recharge automatique de l’application lors des modifications du code.

mvn package quarkus:dev

Et voila, le tour est joué. L’API est disponible.

__  ____  __  _____   ___  __ ____  ______
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/
            Powered by Quarkus 1.11.3.Final
2021-02-14 15:17:54,453 INFO  [io.quarkus] (Quarkus Main Thread) 2021-02-Quarkus-DevUI 1.0.0-SNAPSHOT on JVM (powered by Quarkus 1.11.3.Final) started in 0.811s. Listening on: http://localhost:8080
2021-02-14 15:17:54,454 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2021-02-14 15:17:54,454 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jsonb]

Lors du démarrage, l’application précise qu’elle écoute au port 8080. En prenant notre navigateur, nous obtenons la page suivante en allant http://localhost:8080 :

quarkus index

astuce La page d’accueil et les ressources statiques sont disponibles dans le répertoire src/main/resources/META-INF/resources.

Cette page nous indique que nous avons une ressource. Il nous reste simplement à cliquer sur le GET /hello-reasteasy pour appeler directement notre ressource et obtenir le message suivant : Hello RESTEasy

La Dev UI

C’est une page pour les développeurs qui a été introduite dans la version 1.11 de Quarkus (janvier 2021).

Elle est accessible via l’URI suivante /q/dev, soit l’url : http://localhost:8080/q/dev/

avertissement Elle est disponible uniquement si nous sommes en mode dev.

Voici le résultat de l’affichage de cette page :

quarkus devui accueil

Le principe des panneaux

La page contient un certain nombre de panneau en fonction des extensions que nous avons sélectionnées. Dans notre cas, nous avons choisi RESTEasy JSON-B, donc c’est normale d’avoir les panneaux suivants :

  • RESTEasy JAX-RS

  • RESTEasy JSON-B

  • ArC, pour CDI

Cela correspond bien aux fonctionnalités installées comme mentionnées lors du démarrage

...(Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jsonb]

Nous avons des panneaux supplémentaires liés aux dépendances :

  • Configuration, nécessaire pour la gestion des propriétés,

  • RESTEasy Server Common,

  • JSON-B, nécessaire car nous avons choisi l’implémentation JSON-B.

L’accès aux guides

Un point intéressant est qu' à chaque panneau correspond une petite icône bleu. C’est tout simplement un lien vers le guide approprié. Cela permet donc au développeur d’avoir l’ensemble des guides nécessaires en fonction des fonctionnalités installées.

L’accès aux informations

Propriétés

Nous avons un lien vers un éditeur de configuration. Cela permet de voir l’ensemble des propriétés utilisées lors de l’exécution :

  • Nom de la propriété,

  • Valeur de la propriété,

  • Valeur par défaut,

  • Source,

  • Description.

La source est intéressante car cela permet de savoir comment la valeur a été configurée :

  • SysPropConfigSource, pour les propriétés systèmes,

  • EnvConfigSource, pour les variables d’environnement,

  • PropertiesConfigSource[source=application.properties], pour le fichier application.properties,

  • PropertiesConfigSource[source=Build time config], pour le fichier application.properties dont les valeurs ont été précisées lors de la compilation,

  • default values, pour les valeurs prenant les valeurs par défaut.

La modification de la propriété est possible avec le bouton Update. Ainsi, la propriété sera renseignée dans le fichier application.properties

quarkus config editor

CDI

Coté CDI, nous pouvons avoir des informations supplémentaires sur :

  • Beans

  • Observeurs

  • Beans supprimés

  • Intercepteurs

Par exemple, étant donné que nous avons sélectionné JSON-B, nous allons pouvoir vérifier la présence du Producteur CDI. Effectivement, nous voyons que le bean est bien présent sur la ligne n°8.

quarkus arc jsonb

Naturellement, cela permettra de contrôler nos beans et leurs scopes.

L’accès à des URL techniques

Afin d’illuster ce point, nous allons utiliser l’extension concernant OpenAPI. Pour cela, il est nécessaire d’ajouter l’extension quarkus-smallrye-openapi

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

avertissement Nous pourrons noter qu’il suffit d’enregistrer le fichier pom.xml afin que l’application télécharge les dépendances via Maven et recharge l’application automatiquement.

Au redémarrage, nous avons deux nouvelles fonctionnalités smallrye-openapi et swagger-ui.

...(Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jsonb, smallrye-openapi, swagger-ui]

Côté Dev UI, nous avons deux nouveaux panneaux :

  • SmallRye OpenAPI

  • Swagger UI

quarkus devui openapi

Nous pouvons remarquer que la panneau SmallRye OpenAPI possède deux liens :

  • OpenAPI, lien vers l’url pour récupérer la définition OpenAPI /q/openapi

  • Swagger UI, lien vers la page Swagger UI /q/swagger-ui

Voici la page Swagger UI de notre projet :

quarkus openapi

Ces liens existaient déjà dans les précédentes versions de Quarkus. Cependant, il fallait se rappeller des URI ou relire le guide associé pour les retrouver.

avertissement Changement : Il a été décidé que toutes les URI techniques commencent par /q. Cela reste configurable via la propriété quarkus.http.non-application-root-path. Actuellement, une redirection est faite entre les anciennes URL et les nouvelles.

Extension

Toujours dans la lignée de Quarkus, il est possible d’étendre la Dev UI à travers le développement d’une extension. Pour cela, nous avons le guide suivant : Guide pour étendre la Dev UI

avertissement Savoir créer une extension est un pré-requis. Un guide est aussi disponible pour cela.

Comment tester ?

Le projet java contenant le code présenté dans ce billet est disponible sur github

A vous de profiter des joies du développpeur !