|
Publié le par Davy CLAISSE

Undertow

Créer un micro-service en deux minutes avec Undertow

Undertow késako ?

Undertow est un framework web utilisable sur une JVM 7 et +, en Java ou en Kotlin. Ce dernier dérive du projet Wildfly Swarm visant à décomposer JEE en éléments petits (vraiment très petits) et rapides (vraiment très rapides).

À titre d'exemple, le JAR undertow-core permettant de fournir un serveur HTTP minimaliste pèse environ 2 Mo sur le disque et Undertow encaisse une charge d'environ 5 fois supérieure à celle de Sparkjava.

Comment ajouter Undertow à mon projet ?

Avec Maven : en ajoutant la dépendance undertow-core au fichier pom.xml de votre projet.

<dependency>
    <groupId>io.undertow</groupId>
    <artifactId>undertow-core</artifactId>
    <version>1.4.20.Final</version>
</dependency>

Avec Gradle : en ajoutant la dépendance undertow-core au fichier build.gradle de votre projet.

compile "io.undertow:undertow-core:1.4.20.Final"

N.B : vous pouvez retrouver la dernière version disponible sur Maven Central.

Créer une instance Undertow

Le principe est toujours le même :

  • Faire appel au Undertow builder.
  • Le déclarer une par une les routes souhaitées.
  • Démarrer le serveur depuis l'instance initialisée via le builder.

En voici un exemple :

import io.undertow.Handlers;
import io.undertow.Undertow;
import io.undertow.server.HttpServerExchange;
import io.undertow.util.Headers;

public class Main {
    public static void main(String[] args) {
        // Construction du serveur + Déclaration des routes
        Undertow server = Undertow.builder()
            .addHttpListener(8080, "localhost")
            .setHandler(
                Handlers.routing().add("GET", "/titi/{value}", (HttpServerExchange exchange) -> {
                        exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
                        exchange.getResponseSender().send(
                            "Param = " + exchange.getQueryParameters().get("value").getFirst()
                        );
                    }
                )
            ).build();

        // Démarrage du serveur
        server.start();
    }
}

Remarques

  • La déclaration des routes utilise tous les verbes de REST (GET, POST, PUT, DELETE, OPTION, PATH).
  • Le format des réponses est personnalisable (XML, JSON).
  • Les routes peuvent être des lambdas comme dans l'exemple, ou des classes à part entière, à l'image de ce qui est fait dans cet article sur Sparkjava.