Dropwizard est un framework complet et éprouvé (première version publiée en 2011) pour faciliter le développement de services web “RESTful”. Il s’agit en fait du regroupement et de l’intégration de plusieurs outils du monde Java, parmi lesquels : Jetty, Jersey, Jackson, Logback, Liquibase, Hibernate…
J’ai eu l’occasion d’utiliser cet outil et je le trouve particulièrement efficace, notamment pour mettre en place rapidement un ensemble de micro-services, ou un back-end simple pour une application de type Single Page Application (AngularJS, etc.). Dans l’idée, Spring Boot est assez similaire, si ce n’est que Dropwizard n’est pas ancré dans l’écosystème Spring.
Je vous propose ici un rapide tour d’horizon des différentes fonctionnalités de l’outil.
Pour commencer
Avec Maven, le démarrage d’un projet Dropwizard est plutôt simple. Il suffit d’ajouter la dépendance à la dernière version du projet “core” (0.7.1) :
## Un peu de configurationChaque application Dropwizard a besoin d’une classe de configuration qui étend io.dropwizard.Configuration
. Voici notre classe de configuration, très simple, pour démarrer ce tutoriel :
- La configuration sera dé-sérialisée depuis un fichier YAML par Jackson. Donc il est possible (voir recommandé) d’utiliser les annotations de Jackson !
- La configuration est validée avec Hibernate Validator ! La liste des contraintes possibles est vaste (voir ici pour la liste complète), et l’application ne démarrera pas si le fichier de configuration n’est pas valide !
Voici le contenu du fichier de configuration correspondant à notre classe :
## Une application…Passons maintenant au coeur de notre application, la classe MyApplication qui étend io.dropwizard.Application
.
…pleine de ressources !
Et pour finir, une ressource très simple qui nous fera de l’écho :
Quelques remarques à propos de cette classe :- Elle utilise les annotations “standard” de JAX-RS
- L’annotation
@Timed
permet à Dropwizard de récolter des métriques sur les appels à cette méthode - Dropwizard ajoute le support natif des
Optional
de Guava à Jersey. Ainsi, si le paramètreecho
n’est pas passé, Optional vaudra absent, sinon il contiendra la valeur du paramètre.
Il ne nous reste plus qu’à déclarer notre ressource dans la méthode run
de la classe principale avec un simple environment.jersey().register(new EchoResource());
, et on peut passer au démarrage de notre application !
Lancement de l’application
Une des préconisations de la documentation Dropwizard, c’est de construire un fat JAR contenant tous les .class de notre application, y compris les dépendances.
Cela permet de lancer l’application avec un simple java -jar monJar.jar
. Pour configurer Maven pour packager un fat JAR, il suffit d’ajouter le plugin suivant dans la sections build > plugins
de votre pom.xml
:
L’exécution de la commande java -jar monJar-0.0.1-SNAPSHOT.jar server dev.yaml
démarre l’application dans un serveur Jetty embedded.
Un rapide test nous donne le résultat escompté :
## L’administrationUne des valeurs ajoutées de Dropwizard, c’est certainement l’interface d’administration disponible sur le port 8081 une fois l’application lancée.
En plus d’avoir accès à différentes statistiques sur l’utilisation des ressources de la JVM, des requêtes, des codes de réponse, on remarque que l’annotation `@Timed` précédemment ajoutée à notre méthode, ajoute des informations sur ses temps d’exécution et leur répartition statistique.Bilan de santé
Vous avez peut être remarqué, lors du démarrage de notre application, un message plutôt alarmant dans les logs :
Un Health Check (ou bilan de santé) est un test de la disponibilité d’un service externe indispensable au fonctionnement de notre application : connectivité à la base de données, disponibilité de services web tiers, etc.Je vous propose ici un StupidHealthCheck
qui échoue de temps en temps (à ne surtout pas utiliser en production donc !).
Une entrée est dès lors disponible dans l’interface d’administration et permet de superviser simplement le bon fonctionnement de l’application.
## ConclusionDropwizard apporte son lot de fonctionnalité et s’intègre avec de nombreux outils Java communément utilisés. Je vous encourage à regarder la documentation officielle pour plus de détails. De mon avis, la seule chose qu’il manque peut être à Dropwizard, c’est l’intégration native d’un framework d’injection de dépendance.