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

    驴Qu茅 es Dropwizard?

    Dropwizard es un marco Java de c贸digo abierto que se utiliza para el desarrollo r谩pido de servicios web RESTful. O mejor, es el mejor conjunto de herramientas y marcos livianos de su clase para crear servicios web RESTful.

    Es bastante f谩cil de usar, muy f谩cil de mantener y ha funcionado muy bien en muchos casos diferentes y de acuerdo con la documentaci贸n oficial:

    “Su objetivo es proporcionar implementaciones confiables y de alto rendimiento 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 permanece optimizada y enfocada, reduciendo 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 empaquetar la aplicaci贸n de una manera que permite instalarla f谩cilmente en el entorno de producci贸n como un servicio independiente.

    Si alguna vez ha estado en la situaci贸n de desarrollar un servicio REST en Spring por ejemplo, probablemente sepa lo dif铆cil que puede ser configurar un servicio esqueleto (compararemos los enfoques de Dropwizard y Spring Boot m谩s adelante). Con Dropwizard, es cuesti贸n de agregar literalmente uno de los Maven configuraciones de dependencia.

    Aunque Dropwizard no es del agrado de todos, a algunas personas no les gusta usar los componentes y 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 Jetty HTTP: Como sabemos, necesitamos un servidor HTTP para iniciar la aplicaci贸n web. Dropwizard utiliza la biblioteca Jetty HTTP para inyectar un servidor HTTP sintonizado directamente en su proyecto. En lugar de implementar sus aplicaciones en un servidor de aplicaciones o 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 compatibles oficialmente.
    • Jersey: es una de las mejores implementaciones de API REST del mercado. Esto le permite crear clases limpias que mapean la solicitud HTTP a objetos java simples. Adem谩s, sigue la especificaci贸n est谩ndar JAX-RSX y Dropwizard la usa 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 hacia y desde JSON. Es una de las mejores API de mapeo de objetos para formato JSON.
    • M茅trica: Dropwizard tiene su propia biblioteca, que nos permite leer las m茅tricas de la aplicaci贸n a trav茅s de puntos finales HTTP.
    • Guayaba: es la biblioteca de utilidades de Google que nos brinda una gran cantidad de clases para acelerar el desarrollo en Java.
    • Volver a iniciar sesi贸n 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 conocidos y populares 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.
    • Tiempo de joda: Biblioteca para el manejo de fechas y horas.
    • Base l铆quida: Biblioteca independiente de base de datos de c贸digo abierto para rastrear, administrar y aplicar cambios en el esquema de la base de datos.

    Estos son algunos de los ingredientes fundamentales si desea hacer un buen servicio de Java RESTful JSON. Dropwizard lo combina muy bien desde una perspectiva de operaciones. La pieza de M茅tricas 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 verificaciones de estado.

    Controles de salud se registran como parte de la creaci贸n de la aplicaci贸n. Si no registra una verificaci贸n de estado, la startup le advertir谩 y se quejar谩 cada vez que inicie. Incluir茅 esto en un ejemplo m谩s adelante.

    Configuraci贸n de Maven

    Dropwizard es compatible oficialmente con Maven. Tambi茅n puede usar otras herramientas de compilaci贸n, aunque la mayor铆a de las gu铆as y la documentaci贸n usan 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.)

    Nosotros definiremos dropwizard.version, antes de agregar las dependencias, en el <properties> etiqueta en nuestro “pom.xml”:

    <properties>
      <dropwizard.version>1.3.5</dropwizard.version>
    </properties>
    

    Agregue las siguientes dependencias a su pom.xml archivo:

    <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 <version> secci贸n por ejemplo:

    <version>1.3.5<version>
    

    Despu茅s de configurar Maven con 茅xito, podemos comenzar a hacer nuestra aplicaci贸n Dropwizard.

    Crear una clase de configuraci贸n

    Cada aplicaci贸n Dropwizard almacena la configuraci贸n en YAML archivos. Debemos crear el archivo “config.yml” en el directorio ra铆z de nuestra aplicaci贸n. Este archivo “yml” se deserializar谩 en una instancia del Configuration clase de nuestra aplicaci贸n. La clase de configuraci贸n de nuestra aplicaci贸n es una subclase de la clase de configuraci贸n 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
    

    los DemoConfiguration La clase se deserializar谩 del archivo YML y los valores de campo se completar谩n a medida que est茅n configurados en 茅l.

    Crear una clase de aplicaci贸n

    Ahora deber铆a crearse 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
        }
    }
    

    Crear una clase de representaci贸n

    Ahora deber铆amos considerar nuestro servicio de API REST y c贸mo se representar谩n los recursos. Necesitamos dise帽ar el formato JSON y definir la clase de representaci贸n adecuada para asegurarnos de 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 del Representation clase:

    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 POJO simple. Nuestra clase usa el est谩ndar Java Bean para content propiedad. Esto le permite a Jackson serializarlo en el JSON que necesitamos.

    El c贸digo de mapeo de objetos de Jackson llenar谩 el campo de contenido del objeto JSON con el valor de retorno de getContent().

    Crear 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 solicitudes HTTP.

    Dado que Dropwizard usa el JAX-RS implementaci贸n, usaremos el @Path anotaci贸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);
        }
    }
    

    @Timed se 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 ser inicializados 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);
    }
    

    Creaci贸n de una aplicaci贸n Dropwizard

    Es una buena idea crear un FAT JAR que contendr谩 todos los archivos “.class” necesarios para ejecutar la aplicaci贸n. Este JAR se puede implementar en un entorno diferente desde la prueba hasta la producci贸n sin ning煤n cambio.

    Para hacer nuestro JAR necesitamos configurar el plugin Maven maven-shade. La siguiente configuraci贸n debe agregarse a nuestro “pom.xml”, debajo del dependencies secci贸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 creado correctamente su JAR, puede ejecutarlo desde la l铆nea de comandos:

    $ java 鈥搄ar target/dropwizard-demo-1.0.SNAPSHOT.jar server config.yml
    

    o directamente desde su IDE – ejecutando el DemoApplication clase principal:

    Si todo comenz贸 correctamente, deber铆a aparecer algo como esto:

    Ahora, su aplicaci贸n Dropwizard est谩 escuchando en el puerto 8080 para solicitudes de aplicaciones y en el puerto 8081 para solicitudes de administraci贸n. Notar谩s que usamos los argumentos server y config.yml para ejecutar el servicio, indic谩ndole al servidor qu茅 archivo de configuraci贸n utilizar.

    Esto tambi茅n se puede hacer en el main m茅todo de DemoApplication clase, como en el ejemplo anterior.

    Puede acceder a su aplicaci贸n en http://localhost:8080/v1/resource o con par谩metros http://localhost:8080/v1/resource?first=John&second=everything.

    Deber铆a recibir un mensaje con o sin par谩metros de reenv铆o, seg煤n su llamada.

    Cambiar la ruta del contexto

    De forma predeterminada, la aplicaci贸n Dropwizard ejecutar谩 sus puntos finales en /path. Por 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:8080. Sin embargo, si desea cambiar esto, puede configurar una ruta diferente agregando lo siguiente a su archivo YML:

    server:
        applicationContextPath: /application
    

    Agregar una verificaci贸n de estado

    Con respecto a la declaraci贸n anterior sobre el marco de m茅tricas que hace cumplir las verificaciones de estado:

    Las comprobaciones de estado son simplemente puntos finales HTTP que iteran sobre varios enlaces que usted crea. Si bien algunos ceden a la tentaci贸n de devolver un control de estado que siempre devuelve un estado “saludable”, siempre que el servicio est茅 funcionando, esta es una pr谩ctica realmente mala.

    Las comprobaciones de estado deben usarse 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 una verificaci贸n de estado all铆, aseg煤rese de que la base de datos no tenga demasiadas conexiones de cliente, o ning煤n subproceso bloqueado, etc.

    Vamos a crear nuestro HealthCheck clase:

    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 casos de verificaci贸n, similares 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 nuestro HealthCheck class 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 su consola no se quejar谩 de las verificaciones de estado.

    Diferencias entre los enfoques Dropwizard y Spring Boot

    Ambos son realmente f谩ciles de aprender y comenzar a trabajar pocas horas despu茅s de escribir su primera solicitud.

    / Bota de Spring Dropwizard

    HTTPEmbarcaderoGato
    DESCANSOJerseyResorte, JAX-RS
    JSONJacksonJackson, GSON, json-simple
    M茅tricaM茅tricas de DropwizardSpring
    Comprobaciones de estadoDropwizardSpring
    Inicio sesi贸nLogback, slf4jLogback, Log4j, slf4j, Apache commong-logging
    Pruebasdropwizard-testing (Junit, Mockito)prueba de arranque de arranque de Spring (JUnit, Mockito)
    Integraciones oficialesValidador de Hibernate, Guava, Apache HttpClient, cliente de Jersey, JDBI, Liquibase, Moustache, Freemaker, Joda time40+ Starter POM oficiales 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 se centra en la producci贸n, es f谩cil de usar, simple de implementar, simple de monitorear, desarrollar y configurar un marco REST de alto rendimiento.

    Quiz谩s 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 incluido para satisfacer las necesidades de la mayor铆a de los desarrolladores, no tiene que preocuparse por agregar y configurar cada una de ellas por separado.

    Algunas desventajas ser铆an que est谩 restringido al uso de lo que Dropwizard ofrece o admite (perdiendo libertad), pero tambi茅n agregar demasiadas bibliotecas de terceros puede causar una complejidad innecesaria en el desarrollo.

     

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *