Tutorial de Dropwizard: Desarrolle servicios web RESTful más rápido

¿Qué es Dropwizard?

Dropwizard es un marco Java de código abierto utilizado para el rápido desarrollo de los servicios web RESTful. O, mejor aún, es un conjunto de herramientas y marcos ligeros, el mejor en su clase, para crear servicios web RESTful.
Es bastante fácil de usar, muy fácil de mantener y ha funcionado extremadamente bien en muchos casos diferentes y de acuerdo con la documentación oficial :
"Su objetivo es proporcionar implementaciones confiables y eficaces de todo lo que necesita una aplicación web lista para producción. Debido a que esta funcionalidad se extrae en una biblioteca reutilizable, su aplicación sigue siendo ágil y enfocada, lo que reduce tanto el tiempo de comercialización como las cargas de mantenimiento".
Dropwizard permite a un desarrollador construir un proyecto inicial muy rápido, el llamado proyecto de arranque rápido. Esto ayuda a que la aplicación sea empaquetada de una manera que le permita instalarla fácilmente en el entorno de producción como un servicio independiente.
Si alguna vez ha estado en una situación para desarrollar un servicio REST en Spring, por ejemplo, probablemente sepa lo difícil que puede ser configurar un servicio de esqueleto (compararemos los enfoques Dropwizard y Spring Boot más adelante). Con Dropwizard, se trata de agregar literalmente una de las configuraciones de dependencia de Maven .
Aunque, Dropwizard no es una taza de té para todos, a algunas personas no les gusta usar los componentes y las bibliotecas que proporciona, y eso está perfectamente bien.

Componentes predeterminados de Dropwizard

Dropwizard viene con el paquete básico de componentes o bibliotecas necesarios para desarrollar servicios web RESTful, por lo que no necesita incluir y configurar cada uno de ellos por separado:
  • Biblioteca HTTP de Jetty : Como sabemos, necesitamos un servidor HTTP para iniciar la aplicación web. Dropwizard utiliza la biblioteca HTTP de Jetty para inyectar un servidor HTTP sintonizado directamente en su proyecto. En lugar de implementar sus aplicaciones en un servidor de aplicaciones o en un servidor web, Dropwizard define un método principal que invoca al servidor Jetty como un proceso independiente. Dropwizard recomienda el uso del servidor Jetty para ejecutar aplicaciones, otros servidores como Tomcat no son oficialmente compatibles.
  • Jersey : es una de las mejores implementaciones de REST API en el mercado. Esto le permite crear clases limpias que asignan solicitudes HTTP a objetos Java simples. Además, sigue la especificación estándar de JAX-RSX, y Dropwizard lo utiliza como la herramienta predeterminada para desarrollar aplicaciones web RESTful.
  • Jackson : ciertamente se ha convertido en un estándar cuando se trata de objetos de mapeo de datos desde y hacia JSON. Es una de las mejores API de mapeo de objetos para el formato JSON.
  • Métricas : Dropwizard tiene su propia biblioteca, que nos permite leer las métricas de la aplicación a través de puntos finales HTTP.
  • Guava : es la biblioteca de utilidades de Google que nos brinda una gran cantidad de clases para acelerar el desarrollo en Java.
  • Logback y Slf4j : estas dos bibliotecas se utilizan para el registro, similar al registro JDK (java.util.logging)
  • Freemarker y Bigote : Elegir un procesador de plantillas es una de las decisiones más importantes. Dropwizard utiliza procesadores y conocidos para crear interfaces de usuario. 
  • Apache HttpClient : proporciona la capacidad de interactuar con otros servicios web.
  • Validador de hibernación : se utiliza para validar la entrada del usuario.
  • Jdbi : clases de acceso a la base de datos que tienen soporte de Hibernate.
  • Hora de Joda : Biblioteca para el manejo de fechas y horas.
  • Liquidbase : biblioteca independiente de base de datos de origen abierto para el seguimiento, la administración y la aplicación de cambios en el esquema de la base de datos.
Estos son una especie de ingredientes muy básicos si quieres hacer un buen servicio RESTful JSON para Java. Dropwizard lo combina muy bien desde una perspectiva de operaciones. La métrica es realmente importante porque no solo proporciona métricas, sino que también le alerta si no está implementando las mejores prácticas operativas, como la creación de controles de estado.
Los controles de estado se registran como parte de la creación de la aplicación. Si no registra un chequeo de estado, el inicio le avisará y se quejará cada vez que lo inicie. Incluiré esto en un ejemplo más adelante.

Configuración de Maven

Dropwizard apoya oficialmente a Maven. También puede utilizar otras herramientas de compilación, aunque la mayoría de las guías y la documentación utilizan Maven. Maven es una herramienta de gestión de proyectos , basada en el concepto de modelo de objeto de proyecto (POM).
POM.xml contiene toda la información sobre su proyecto (descripción del proyecto, atributos, licencia, versión, lista de dependencias, etc.)
Definiremos dropwizard.version, antes de agregar las dependencias, en la <properties>etiqueta en nuestro "pom.xml":
<properties>  
  <dropwizard.version>1.3.5</dropwizard.version>
</properties>  
Agregue las siguientes dependencias a su pom.xmlarchivo:
<dependencies>  
  <dependency>
    <groupId>io.dropwizard</groupId>
    <artifactId>dropwizard-core</artifactId>
    <version>${dropwizard.version}</version>
  </dependency>
</dependencies>  
Puede agregar el número de versión directamente en la <version>sección, por ejemplo:
<version>1.3.5<version>  
Al configurar con éxito Maven, podemos comenzar a hacer nuestra aplicación Dropwizard.

Creación de una clase de configuración

Cada aplicación de Dropwizard almacena la configuración en archivos YAML . Debemos crear el archivo "config.yml" en el directorio raíz de nuestra aplicación. Este archivo "yml" se deserializará en una instancia de la Configurationclase de nuestra aplicación. La clase de configuración de nuestra aplicación es una subclase de la clase de configuración de Dropwizard ( io.dropwizard.Configuration).
Clase de configuración:
public class DemoConfiguration extends Configuration {

    @NotEmpty
    private String message;

    @NotEmpty
    private String firstParameter;

    @NotEmpty
    private String secondParameter;

    @JsonProperty
    public String getMessage() {
        return message;
    }

    @JsonProperty
    public void setMessage(String message) {
        this.message = message;
    }

    public String getFirstParameter() {
        return firstParameter;
    }

    public void setFirstParameter(String firstParameter) {
        this.firstParameter = firstParameter;
    }

    public String getSecondParameter() {
        return secondParameter;
    }

    public void setSecondParameter(String secondParameter) {
        this.secondParameter = secondParameter;
    }
}
Ahora, para el archivo "config.yml" en el directorio raíz de nuestra aplicación:
message: Hi %s!, now you will learn about %s from Stack Abuse!  
firstParameter: Friend  
secondParameter: Dropwizard  
La DemoConfigurationclase se deserializará desde el archivo YML y los valores de campo se rellenarán a medida que se configuren en ella.

Creación de una clase de aplicación

Ahora se debe crear la clase de aplicación principal. Esta clase recogerá todos los módulos necesarios y preparará nuestro servicio para su uso. 
Aquí hay un ejemplo simple de la clase de aplicación:
DemoApplication:
public class DemoApplication extends Application<DemoConfiguration> {

    public static void main(String[] args) throws Exception {
        new DemoApplication().run(new String[] {"server", "config.yml"});
    }

    public void run(DemoConfiguration configuration, Environment environment) {
        // code to register module
    }
}

Creación de una clase de representación

Ahora debemos considerar nuestro servicio REST API y cómo se representarán los recursos. Necesitamos diseñar el formato JSON y definir la clase de representación adecuada para garantizar que los datos estén en el formato deseado:
{
    "content""Hi Friend! Now you will learn about Dropwizard from Stack Abuse!"
}
Para lograr este formato, usaremos la siguiente implementación de la Representationclase:
Representación:
public class Representation {  
    @Length(max = 3)
    private String content;

    public Representation() {
        // Jackson deserialization
    }

    @JsonProperty
    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public Representation(String content) {
        this.content = content;
    }
}
Este es un modelo simple de POJO . Nuestra clase utiliza el estándar Java Bean para la contentpropiedad. Esto permite que Jackson lo serialice al JSON que necesitamos.
El código de asignación de objetos de Jackson llenará el campo de contenido del objeto JSON con el valor de retorno de getContent().

Creando una clase de recurso

Los recursos son la esencia de Dropwizard. Los recursos son en realidad las definiciones del URI de punto final de nuestro servicio al que se puede acceder a través del protocolo HTTP. En este ejemplo, crearemos una clase de recurso con un par de anotaciones para mapear las solicitudes HTTP.
Como Dropwizard usa la implementación de JAX-RS , usaremos la @Pathanotación para definir la ruta:
DemoResource :
@Path("/v1/resource")
@Produces(MediaType.APPLICATION_JSON)
public class DemoResource {

    private final String message;
    private final String firstParameter;
    private final String secondParameter;

    public DemoResource(String message, String firstParameter, String secondParameter) {
        this.message = message;
        this.firstParameter = firstParameter;
        this.secondParameter = secondParameter;
    }

    @GET
    @Timed
    public Representation getMessage(@QueryParam("first") Optional<String> first, @QueryParam("second") Optional<String> second) {
        final String value = String.format(message, first.or(firstParameter), second.or(secondParameter));
        return new Representation(value);
    }
}
@Timedse utiliza para registrar automáticamente la duración y la velocidad de sus invocaciones como un temporizador de métricas .

Registro de un recurso

Ahora es necesario registrar la clase anterior en la clase principal de la aplicación. Como se mencionó anteriormente, la clase de aplicación sirve para inicializar nuestro servicio y todos los módulos necesarios, por lo que todos los recursos deben registrarse aquí para iniciarse con el servicio.
En la clase de aplicación principal, agregue lo siguiente:
@Override
public void run(DemoConfiguration configuration, Environment environment) {  
    final DemoResource resource = new DemoResource(configuration.getMessage(),
            configuration.getFirstParameter(), configuration.getSecondParameter());
    environment.jersey().register(resource);
}

Construyendo una aplicación Dropwizard

Es una buena idea crear un llamado FAT JAR que contendrá todos los archivos ".class" necesarios para ejecutar la aplicación. Este JAR se puede implementar en el entorno diferente desde la prueba hasta la producción sin ningún cambio.
Para hacer nuestro JAR necesitamos configurar el plugin de Maven maven-shadeLa siguiente configuración se debe agregar a nuestro "pom.xml", en la dependenciessección:
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.3</version>
                <configuration>
                    <createDependencyReducedPom>true</createDependencyReducedPom>
                    <filters>
                        <filter>
                            <artifact>*:*</artifact>
                            <excludes>
                                <exclude>META-INF/*.SF</exclude>
                                <exclude>META-INF/*.DSA</exclude>
                                <exclude>META-INF/*.RSA</exclude>
                            </excludes>
                        </filter>
                    </filters>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <transformers>
                                <transformer 
implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>  
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"/>
                                    <mainClass>com.dropwizard.DemoApplication</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Ejecutando su aplicación

Ahora deberíamos poder lanzar nuestra aplicación. Si ha construido con éxito su JAR, puede ejecutar desde la línea de comandos:
$ java –jar target/dropwizard-demo-1.0.SNAPSHOT.jar server config.yml
o directamente desde su IDE - ejecutando la DemoApplicationclase principal:
clase principal
Si todo comenzó correctamente, deberías preguntarte algo como esto:
outputLog
Ahora, su aplicación Dropwizard está escuchando en el puerto 8080 para solicitudes de aplicaciones y el puerto 8081 para solicitudes de administración. Notará que utilizamos los argumentos serverconfig.ymlpara ejecutar el servicio, indicando al servidor qué archivo de configuración usar.
Esto también se puede hacer en el mainmétodo de DemoApplicationclase, como en el ejemplo anterior.
Puede acceder a su aplicación en http://localhost:8080/v1/resourceo con parámetros http://localhost:8080/v1/resource?first=John&second=everything.
Debería recibir un mensaje con o sin parámetros reenviados, dependiendo de su llamada.

Cambiando la ruta de contexto

De forma predeterminada, la aplicación Dropwizard ejecutará sus puntos finales en /pathPor lo tanto, si no menciona ninguna ruta de contexto para su aplicación, se supone que se puede acceder a la aplicación en http://localhost:8080Sin embargo, si desea cambiar esto, puede configurar una ruta diferente agregando lo siguiente a su archivo YML:
server:  
    applicationContextPath: /application

Agregar un chequeo de salud

Con respecto a la declaración anterior sobre el marco de Métricas que hace cumplir los controles de salud:
Los controles de estado son simplemente puntos finales HTTP que se repiten en varios enlaces que creas. Si bien algunos ceden a la tentación de devolver un chequeo de salud que siempre devuelve un estado "saludable", siempre que el servicio se esté ejecutando, esta es una práctica realmente mala.
Las comprobaciones de estado deben utilizarse para mejorar el código, por ejemplo: si tiene una base de datos, debe poder proporcionar una conexión a la base de datos. Ponga un control de estado allí, asegúrese de que la base de datos no tenga demasiadas conexiones de clientes, ningún bloqueo de subprocesos, etc.
Vamos a crear nuestra HealthCheckclase:
DemoHealthCheck:
Por el bien del tutorial, mantendremos esto simple. En entornos de trabajo, estas verificaciones se verían diferentes, pero en su mayoría giran en torno a la verificación de casos, similar a esto:
public class DemoHealthCheck extends HealthCheck {

    @Override
    protected Result check() throws Exception {
        final String field = "Dropwizard";
        if (field.equalsIgnoreCase("Dropwizard")) {
            return Result.healthy();
        }
        return Result.unhealthy("Error, not Healthy!");
    }
}
Como antes, ahora registramos nuestra HealthCheckclase en la clase principal de la aplicación.
DemoApplication:
@Override
public void run(DemoConfiguration configuration, Environment environment) {  
    final DemoResource resource = new DemoResource(configuration.getMessage(),
            configuration.getFirstParameter(), configuration.getSecondParameter());
    final DemoHealthCheck healthCheck = new DemoHealthCheck();
    environment.healthChecks().register("Dropwizard", healthCheck);
    environment.jersey().register(resource);
}
Ahora, cuando inicie su aplicación, la salida del registro de la consola no se quejará de las comprobaciones de estado.

Diferencias entre los enfoques de Dropwizard y Spring Boot

Ambos son realmente fáciles de aprender y comenzar a las pocas horas de escribir su primera aplicación.
/DropwizardBota de primavera
HTTPEmbarcaderoGato
DESCANSOJerseyPrimavera, JAX-RS
JSONJacksonJackson, GSON, json-simple
MétricaMétricas de DropwizardPrimavera
Chequeos de saludDropwizardPrimavera
Explotación florestalLogback, slf4jLogback, Log4j, slf4j, Apache commong-logging
PruebasDropwizard-testing (Junit, Mockito)Spring-Boot-Starter-Test (JUnit, Mockito)
Integraciones oficialesValidador de hibernación, guayaba, Apache HttpClient, cliente de Jersey, JDBI, Liquibase, bigote, Freemaker, tiempo de Joda40+ oficial Starter POM para cualquier propósito

Conclusión

Con nuestra aplicación en funcionamiento, podemos dar algunas notas clave sobre el uso de Dropwizard para desarrollar servicios web RESTful.
Dropwizard está enfocado en la producción, es fácil de usar, simple de implementar, simple de monitorear, desarrollar y configurar un marco REST de alto rendimiento.
Tal vez una de las mayores ventajas es que ofrece una configuración de arranque increíblemente rápida para su proyecto. Con un conjunto de herramientas y bibliotecas incluidas para satisfacer la necesidad de la mayoría de los desarrolladores, no tiene que preocuparse por agregar y configurar cada uno de ellos por separado.
Algunas desventajas serían que está limitado a usar lo que Dropwizard ofrece o admite (perder libertad), pero también al agregar demasiadas bibliotecas de terceros puede causar una complejidad innecesaria en el desarrollo.

Acerca de: Programator

Somos Instinto Programador

0 comentarios:

Publicar un comentario

Dejanos tu comentario para seguir mejorando!

Con tecnología de Blogger.