Dropwizard est un framework Java léger adapté au développement rapide de microservices REST et ne nécessitant pas de serveur d’application comme environnement d’exécution.
Cela dit, au delà du framework, c’est surtout un assemblage habile de composants spécialisés parmi les meilleurs de l’écosystème Java :
- Jetty, un serveur HTTP et un moteur de servlet compacts et très performants
- Jersey, l’implémentation de référence de la spécification JAX-RS (web services REST)
- Jackson, une librairie de sérialisation/dé-sérialisation JSON
- Hibernate Validator, l’implémentation de référence de l’API Bean Validation (JSR 303)
- SLF4J et Logback pour la gestion des traces
- Metrics pour le monitoring
- jDBI pour l’interfaçage rapide à une base de données relationnelle. Cette librairie est de bien plus bas niveau que JPA ou Hibernate et présente peu d’abstraction ce qui rend sa prise en main aisée
On peut considérer ce projet comme une alternative crédible aux serveurs d’applications Java EE perçus comme lourds, compliqués et gourmands en ressources. Le champ des applications couvert par Dropwizard est en réalité plus vaste que celui des microservices (il est tout a fait possible de développer une IHM web) mais l’aisance avec laquelle on développe et déploie un service REST en fait une solution très adaptée à ce type d’usage (à l’instar de Spring Boot de Pivotal ou Spark avec lesquels il est en compétition).
Packagée sous la forme d’un jar autonome contenant toutes ses dépendances, l’unité de déploiement n’a pas besoin de serveur d’application pour être exécutée (le conteneur Jetty est embarqué dans le jar). Avec ses 10 Mo tout au plus (dépendances comprises) l’empreinte mémoire d’une application Dropwizard est donc incomparablement plus faible qu’un Web Service SOAP déployé dans un serveur d’application Java EE (jusqu’à plusieurs centaines de Mo).
Conséquemment, le temps de démarrage d’une application Dropwizard est de quelques secondes quand il faut parfois plusieurs minutes pour un serveur d’application.
Struture type d’une application
Le schéma ci-dessous décrit les principaux éléments d’une application Dropwizard de type API RESTful :
Les composants mis en oeuvre sont les suivants :
- Configuration : le gestionnaire de configuration permet l’accès aux paramètres externalisés dans le fichier de configuration de l’application, représenté sur le schéma par le fichier
conf.yml
au format YAML - Ressource : la ressource (au sens REST du terme) est l’implémentation d’un service JAX-RS (Jersey).
- ExceptionMapper : c’est une fontionnalité de Jersey. Ce composant (facultatif) permet de traiter une exception de manière globale en retournant, lorsqu’elle est levée, une réponse HTTP au format souhaité (JSON le plus souvent) et associée à un code HTTP correspondant à vos besoins.
- HealthCheck : facultatives mais fortement conseillées, ce sont dans ces classes que l’on implémente les tests de disponibilité de toutes les ressources nécessaires à la bonne exécution de l’application. Le “bilan de santé” de l’application est consultable par simple interrogation de la ressource
GET /healthcheck?pretty=true
. - Application : c’est la classe
main
assemblant le tout (enregistrement des ressources, exception mappers, configuration, health checkers).
L’écosystème Dropwizard
A ce jour, la dernière version stable est la 0.7.1. Il est important de noter que cette version est liée à Jersey 1.8 (JAX-RS 1.1) et n’est pas compatible avec Jersey 2.0 (JAX-RS 2.0). On ne pourra donc malheureusement pas tirer parti, entre autre, des validateurs de méthode de resources REST.
Néanmoins, il existe un fork de Dropwizard intégrant Jersey 2.7 mais il s’agit d’une branche expérimentale.
Note 08 Mars 2015 : Jersey 2 est désormais supporté depuis la version 0.8 publiée le 05 Mars 2015.
Dropwizard est un framework modulaire et extensible dont l’étude du module central (Dropwizard Core) a fait l’objet de cet article.
Parmi les modules officiels intéressants, citons :
- Dropwizard Views : un module de développement de vues HTML s’appuyant sur un moteur de template (les moteurs Freemarker et Mustache sont supportés)
- Dropwizard Migration : un wrapper Liquibase pour gérer les évolutions d’une base de données
- Dropwizard Hibernate : un wrapper Hibernate
- Dropwizard Authentication : le support des mécanismes d’authentification HTTP Basic Authentication et OAuth
Il existe également de nombreuses contributions officieuses. Citons entre autre :
- Dropwizard LDAP : un module d’authentification LDAP
- Dropwizard Redis : un client de la base NoSQL orientée clé/valeur Redis
Dans le prochain billet de la série, nous verrons comment développer un service de consultation du trafic métro RATP en temps-réel avec Dropwizard.