Introduzione a Dropwizard

Java Top

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO

1. Panoramica

Dropwizard è un framework Java open source utilizzato per il rapido sviluppo di servizi Web RESTful ad alte prestazioni . Raccoglie alcune librerie popolari per creare il pacchetto leggero. Le principali librerie che utilizza sono Jetty, Jersey, Jackson, JUnit e Guava. Inoltre, utilizza la propria libreria chiamata Metrics.

In questo tutorial impareremo come configurare ed eseguire una semplice applicazione Dropwizard. Al termine, la nostra applicazione esporrà un'API RESTful che ci consente di ottenere un elenco di marchi memorizzati.

2. Dipendenze di Maven

In primo luogo, la dipendenza dropwizard-core è tutto ciò di cui abbiamo bisogno per creare il nostro servizio. Aggiungiamolo al nostro pom.xml :

 io.dropwizard dropwizard-core 2.0.0 

3. Configurazione

Ora creeremo le classi necessarie che sono necessarie per l'esecuzione di ogni applicazione Dropwizard.

Le applicazioni Dropwizard memorizzano le proprietà nei file YML. Pertanto, creeremo il file Introduction-config.yml nella directory delle risorse:

defaultSize: 5

Possiamo accedere ai valori in quel file creando una classe che estende io.dropwizard.Configuration :

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 utilizza Jackson per deserializzare il file di configurazione nella nostra classe . Quindi, abbiamo usato le annotazioni di Jackson.

Successivamente, creiamo la classe dell'applicazione principale, che è responsabile della preparazione del nostro servizio per l'utilizzo:

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); } }

In primo luogo, il metodo principale è responsabile dell'esecuzione dell'applicazione. Potremmo passare gli argomenti al metodo run o riempirlo da soli.

Il primo argomento può essere server o check . L' opzione di controllo convalida la configurazione, mentre l' opzione server esegue l'applicazione. Il secondo argomento è la posizione del file di configurazione.

Inoltre, il metodo initialize imposta il provider di configurazione su ResourceConfigurationSourceProvider , che consente all'applicazione di trovare un determinato file di configurazione nella directory delle risorse. Non è obbligatorio ignorare questo metodo.

Infine, il metodo run ci permette di accedere sia all'ambiente che a BaseConfiguration , che useremo più avanti in questo articolo.

4. Risorsa

In primo luogo, creiamo una classe di dominio per il nostro marchio:

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

In secondo luogo, creiamo una classe BrandRepository che sarà responsabile della restituzione dei marchi:

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(); } }

Inoltre, siamo stati in grado di utilizzare ImmutableList di Guava perché fa parte di Dropwizard stesso.

Terzo, creeremo una classe BrandResource . Dropwizard utilizza JAX-RS per impostazione predefinita con Jersey come implementazione . Pertanto, utilizzeremo le annotazioni da questa specifica per esporre i nostri endpoint 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); } }

Inoltre, abbiamo definito size come Opzionale per poter usare defaultSize dalla nostra configurazione se l'argomento non è fornito.

Infine, registreremo BrandResource nella classe IntroductionApplicaton . Per fare ciò, implementiamo il metodo 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); }

Tutte le risorse create dovrebbero essere registrate in questo metodo.

5. Applicazione in esecuzione

In questa sezione impareremo come eseguire l'applicazione dalla riga di comando.

Per prima cosa, configureremo il nostro progetto per creare un file JAR usando il 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      

Questa è la configurazione suggerita del plugin. Inoltre, abbiamo incluso il percorso per la nostra classe principale nel file elemento.

Infine, creeremo l'applicazione con Maven. Una volta ottenuto il nostro file JAR, possiamo eseguire l'applicazione:

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

Non è necessario passare i parametri perché li abbiamo già inclusi nella classe IntroductionApplication .

Dopodiché, il registro della console dovrebbe terminare con:

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

Ora l'applicazione è in ascolto sulla porta 8080 e possiamo accedere al nostro endpoint del marchio su // localhost: 8080 / brands .

6. Controllo dello stato di salute

All'avvio dell'applicazione, siamo stati informati che l'applicazione non dispone di controlli di integrità. Fortunatamente, Dropwizard fornisce una soluzione semplice per aggiungere controlli di integrità alla nostra applicazione .

Iniziamo aggiungendo una semplice classe che estende 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.

Abbiamo scoperto che la configurazione di base dell'applicazione è davvero semplice e veloce. Inoltre, Dropwizard include tutte le librerie necessarie per eseguire il servizio Web RESTful ad alte prestazioni.

Come sempre, il codice per questi esempi è disponibile su GitHub.

Fondo Java

Ho appena annunciato il nuovo corso Learn Spring , incentrato sui fondamenti di Spring 5 e Spring Boot 2:

>> SCOPRI IL CORSO