Microframeworks en Java

¡Hola! Después de unas semanas de inactivdad continúo con el tema de los frameworks para microservicios, ahora con Java que es otro de mis lengajes favoritos. Ya que todo el mundo conoce a los jugadores fuertes como Dropwizard, Spring y Swarm voy a hablar de los llamados “microframeworks”.

Ratpack

En primer lugar tenemos Ratpack, que nos brinda basicamente un servidor Web basado en Netty y un DSL para manejar rutas (muy a lo Rack+ Sinatra) y una fuerte integración con Groovy . Como un plus podemos utilizar Lazybones para generar esqueletos de aplicaciones.

Aparte del core del framework, existen componentes para:

  • Utilizar Guice como contenedor de inyección de dependencias.
  • Métricas de uso.
  • Thymleaf y Handlebars como motores de plantillas.
  • Consul
  • Spring Boot
  • Pruebas unitarias utilizando Spock

Bootique

Bootique nos invita a crear aplicaciones modulares utilizando Guice. A diferencia de Ratpack, su estilo de programación es mas de utilizar anotaciones aunque también hace uso de interfaces fluidas y clausuras. El uso de Guice le da también un sabor particular a la forma en que creamos aplicaciones o extendemos el framework. En fin, esta es la lista de características fuertes de Bootique

  • Soporte para migraciones con Flyway o LiquidBase.
  • Integración con otros frameworks vía Guice
  • Métricas.
  • Swagger
  • Componentes para Rabbitmq
  • Posibilidad de desarrollar utilizando Kotlin

Rapidoid

Como su nombre lo indica, Rapidoid se centra en la velocidad. Podemos crear no solo microservicios sino aplicaciones completas en muy poco tiempo. De los frameworks presentados acá es el único que incluye un componente para UI y su propio motor de plantillas a lo Mustache. Cosas que me impresionaron:

  • Interfaz de automática administración para las entidades a lo Django o JHipster.
  • Motor de plantillas integrado.
  • Soporte para Guice
  • Rapidez + Funcionalidad

Como es el que más me gusta voy a poner un ejemplo de como crear una Web API simple que nos permita adicionar, consultar y eliminar solicitudes de servicio (lo que toda la vida hemos llamado tickets)

Paso 1. Configurar Maven.

Como soy usuario de Maven y Eclipse me voy a crear un nuevo proyecto y adicionar la siguiente dependencia

<dependency>
    <groupId>org.rapidoid</groupId>
    <artifactId>rapidoid-quick</artifactId>
    <version>5.4.6</version>
</dependency>

Paso 2. Crear mis entidades.

Rapidoid Quick incluye Hibernate, JPA preconfigurados, así que no necesitamos mucho para crear entidades

package com.github.yorodm.rapidoid_example.models;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;

@Entity
public class Ticket {

    @Id
    @GeneratedValue
    public long id;

    @NotNull
    public String title;

    @NotNull
    public String description;
}

Paso 3. Creando mi aplicación y rutas

public class Main {

    public static void main(String[] args) {
        App.bootstrap(args).auth()
        .jpa()
        .adminCenter();

        On.get("/tickets").json(()
            -> JPA.of(Ticket.class).all());

        On.post("/tickets")
            .json((@Valid Ticket t)
                -> JPA.save(t));
        On.put("/tickets/{id}")
            .json((Long id, @Valid Ticket t)
                -> JPA.update(t));

        On.delete("/tickets/{id}")
            .json((Long id) -> {
                JPA.delete(Ticket.class, id);
                return true;
        });
    }

}

Paso 4. Configurando.

Para la configuracion utilizamos YAML en src/resources/config.yml.

users:
  root:
    roles:
      - administrator
      - owner
    password: root

Paso 5. Creando un jar para despliegue.

Vamos a configurar el plugin shade de Maven para crear un uberjar y hacernos la vida más fácil.


<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-shade-plugin</artifactId>
      <version>3.1.0</version>
      <configuration>
        <transformers>
          <transformer
              implementation=
              "org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
            <mainClass>
                com.github.yorodm.rapidoid_example.Main
            </mainClass>
          </transformer>
        </transformers>
      </configuration>
      <executions>
        <execution>
          <phase>package</phase>
          <goals>
            <goal>shade</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

Paso 6. Ejecutando la aplicación

Empaquetamos y ejecutamos:

$ mvn package
$ cd target
$ java -jar rapidoid-example-0.0.1-SNAPSHOT.jar profiles=dev,default

Después de unos cuantos logs tenemos el servicio disponible en nuestro host junto con el dashboard de administración.