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.