Introduction à Dropwizard

Haut Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS

1. Vue d'ensemble

Dropwizard est un framework Java open source utilisé pour le développement rapide de services Web RESTful hautes performances . Il rassemble quelques bibliothèques populaires pour créer le package léger. Les principales bibliothèques qu'il utilise sont Jetty, Jersey, Jackson, JUnit et Guava. De plus, il utilise sa propre bibliothèque appelée Metrics.

Dans ce didacticiel, nous allons apprendre à configurer et à exécuter une application Dropwizard simple. Lorsque nous aurons terminé, notre application exposera une API RESTful qui nous permet d'obtenir une liste des marques stockées.

2. Dépendances de Maven

Tout d'abord, la dépendance dropwizard-core est tout ce dont nous avons besoin pour créer notre service. Ajoutons-le à notre pom.xml :

 io.dropwizard dropwizard-core 2.0.0 

3. Configuration

Nous allons maintenant créer les classes nécessaires à l'exécution de chaque application Dropwizard.

Les applications Dropwizard stockent les propriétés dans des fichiers YML. Par conséquent, nous allons créer le fichier introduction-config.yml dans le répertoire de ressources:

defaultSize: 5

Nous pouvons accéder aux valeurs de ce fichier en créant une classe qui étend io.dropwizard .

public class BasicConfiguration extends Configuration { @NotNull private final int defaultSize; @JsonCreator public BasicConfiguration(@JsonProperty("defaultSize") int defaultSize) { this.defaultSize = defaultSize; } public int getDefaultSize() { return defaultSize; } }

Dropwizard utilise Jackson pour désérialiser le fichier de configuration dans notre classe . Par conséquent, nous avons utilisé les annotations Jackson.

Ensuite, créons la classe d'application principale, qui est chargée de préparer notre service à l'utilisation:

public class IntroductionApplication extends Application { public static void main(String[] args) throws Exception { new IntroductionApplication().run("server", "introduction-config.yml"); } @Override public void run(BasicConfiguration basicConfiguration, Environment environment) { //register classes } @Override public void initialize(Bootstrap bootstrap) { bootstrap.setConfigurationSourceProvider(new ResourceConfigurationSourceProvider()); super.initialize(bootstrap); } }

Tout d'abord, la méthode principale est responsable de l'exécution de l'application. Nous pouvons soit passer les arguments à la méthode run , soit le remplir nous-mêmes.

Le premier argument peut être serveur ou chèque . L' option check valide la configuration, tandis que l' option serveur exécute l'application. Le deuxième argument est l'emplacement du fichier de configuration.

En outre, la méthode initialize définit le fournisseur de configuration sur ResourceConfigurationSourceProvider , qui permet à l'application de trouver un fichier de configuration donné dans le répertoire de ressources. Il n'est pas obligatoire de remplacer cette méthode.

Enfin, la méthode run nous permet d'accéder à la fois à l' environnement et à la configuration de base , que nous utiliserons plus loin dans cet article.

4. Ressource

Tout d'abord, créons une classe de domaine pour notre marque:

public class Brand { private final Long id; private final String name; // all args constructor and getters }

Deuxièmement, créons une classe BrandRepository qui sera responsable du retour des marques:

public class BrandRepository { private final List brands; public BrandRepository(List brands) { this.brands = ImmutableList.copyOf(brands); } public List findAll(int size) { return brands.stream() .limit(size) .collect(Collectors.toList()); } public Optional findById(Long id) { return brands.stream() .filter(brand -> brand.getId().equals(id)) .findFirst(); } }

De plus, nous avons pu utiliser ImmutableList de Guava car il fait partie de Dropwizard lui-même.

Troisièmement, nous allons créer une classe BrandResource . Dropwizard utilise JAX-RS par défaut avec Jersey comme implémentation . Par conséquent, nous utiliserons les annotations de cette spécification pour exposer nos points de terminaison d'API REST:

@Path("/brands") @Produces(MediaType.APPLICATION_JSON) public class BrandResource { private final int defaultSize; private final BrandRepository brandRepository; public BrandResource(int defaultSize, BrandRepository brandRepository) { this.defaultSize = defaultSize; this.brandRepository = brandRepository; } @GET public List getBrands(@QueryParam("size") Optional size) { return brandRepository.findAll(size.orElse(defaultSize)); } @GET @Path("/{id}") public Brand getById(@PathParam("id") Long id) { return brandRepository .findById(id) .orElseThrow(RuntimeException::new); } }

De plus, nous avons défini la taille comme facultative afin d'utiliser defaultSize à partir de notre configuration si l'argument n'est pas fourni.

Enfin, nous enregistrerons BrandResource dans la classe IntroductionApplicaton . Pour ce faire, implémentons la méthode run :

@Override public void run(BasicConfiguration basicConfiguration, Environment environment) { int defaultSize = basicConfiguration.getDefaultSize(); BrandRepository brandRepository = new BrandRepository(initBrands()); BrandResource brandResource = new BrandResource(defaultSize, brandRepository); environment .jersey() .register(brandResource); }

Toutes les ressources créées doivent être enregistrées dans cette méthode.

5. Application en cours d'exécution

Dans cette section, nous allons apprendre à exécuter l'application à partir de la ligne de commande.

Tout d'abord, nous allons configurer notre projet pour créer un fichier JAR en utilisant le plugin maven-shade :

 org.apache.maven.plugins maven-shade-plugin  true   *:*  META-INF/*.SF META-INF/*.DSA META-INF/*.RSA       package  shade      com.baeldung.dropwizard.introduction.IntroductionApplication      

Ceci est la configuration suggérée du plugin. De plus, nous avons inclus le chemin vers notre classe principale dans le élément.

Enfin, nous allons créer l'application avec Maven. Une fois que nous avons notre fichier JAR, nous pouvons exécuter l'application:

java -jar target/dropwizard-0.0.1-SNAPSHOT.jar

Il n'est pas nécessaire de transmettre les paramètres car nous les avons déjà inclus dans la classe IntroductionApplication .

Après cela, le journal de la console doit se terminer par:

INFO [2020-01-08 18:55:06,527] org.eclipse.jetty.server.Server: Started @1672ms

Maintenant, l'application écoute sur le port 8080 et nous pouvons accéder à notre point de terminaison de marque à l' adresse // localhost: 8080 / Brands .

6. Bilan de santé

Lors du démarrage de l'application, nous avons été informés que l'application ne dispose d'aucun contrôle de santé. Heureusement, Dropwizard fournit une solution simple pour ajouter des contrôles de santé à notre application .

Commençons par ajouter une classe simple qui étend com.codahale.metrics.health.HealthCheck :

public class ApplicationHealthCheck extends HealthCheck { @Override protected Result check() throws Exception { return Result.healthy(); } }

This simple method will return information about the healthiness of our component. We could create multiple health checks, and some of them might fail in certain situations. For instance, we would return Result.unhealthy() if the connection to the database failed.

Lastly, we need to register our health check in the run method of our IntroductionApplication class:

environment .healthChecks() .register("application", new ApplicationHealthCheck());

After running the application, we can check the health check response under //localhost:8081/healthcheck:

{ "application": { "healthy": true, "duration": 0 }, "deadlocks": { "healthy": true, "duration": 0 } }

As we can see, our health check has been registered under the application tag.

7. Conclusion

In this article, we've learned how to set up the Dropwizard application with Maven.

Nous avons découvert que la configuration de base de l'application est vraiment simple et rapide. De plus, Dropwizard inclut toutes les bibliothèques dont nous avons besoin pour exécuter le service Web RESTful hautes performances.

Comme toujours, le code de ces exemples est disponible à l'adresse over sur GitHub.

Fond Java

Je viens d'annoncer le nouveau cours Learn Spring , axé sur les principes de base de Spring 5 et Spring Boot 2:

>> VOIR LE COURS