domingo, 14 de mayo de 2023

Quarkus & Microprofile: Como hacer un Microservicio con persistencia

 Hoy vamos a ver una nueva forma de hacer un microservicio. Esta vez utilizando Quarkus y Microprofile. Además le añadiremos una pequeña capa de persistencia. 

Quarkus ya lo hemos visto anteriormente integrado con Apache Camel, aquí, pero hoy lo veremos de forma individual. Quarkus es un framework Java pero Kubernetes-native, es decir optimizado para su uso en Graalvm y su despliegue a través de contenedores. Y como es el primero que hacemos de Quarkus en solitario, empezaremos indicando como podemos crear un proyecto, para ello usaremos el comando:

mvn com.redhat.quarkus.platform:quarkus-maven-plugin:2.13.5.Final-redhat-00002:create \
    -DprojectGroupId=com.home.example -DprojectArtifactId=ms-with-panache

Y las librerías principales a utilizar serán:

  • REST: quarkus-resteasy-reactive
  • Hibernate & Panache: quarkus-hibernate-orm-panache
  • JSON: quarkus-resteasy-reactive-jackson
Si tenéis experiencia en microservicios con Spring o JAX-RS, la parte de la generación del microservicio será sencilla. Pero aún así daremos una pequeña explicación de cómo poder generar cualquier método.
  • @Path("/book"): Nos permite indicar cual es la raiz del microservicio, en que contexto atiende a llamadas. También se usa en cada uno de los recursos, si tiene un contexto posterior diferente.
  • @GET, @DELETE... : Indica el verbo HTTP con el cual realizaremos la invocación.
  • @QueryParam : Nos permite indicar parámetros que viajan en la URL
  • @PathParam: Nos permite indicar parámetros que forman parte del contexto. Han debido indicarse en la anotación @Path. 
  •  @Produces y @Consumes: Nos permite indicar el formato de la salida y de lo que espera de entrada. 
Para la parte de la persistencia utilizaremos Panache, que pondrá a nuestra disposición dos patrones distintos para llevarla a cabo. Por un lado tendremos el patrón Repository, donde crearemos una clase intermedia que será la encargada de realizar las operaciones contra la base de datos similar a Spring Data.

@ApplicationScoped
@Transactional
public class BookRepository implements PanacheRepository<Book>{ }

Y por otro lado contaremos con el patrón Active Record, donde será la propia entidad la que pondrá a disposición del programador, los distintos métodos de persistencia. 

@Entity
@Table(name = "BOARDGAME")
public class BoardGame extends PanacheEntity {
    //warning with PanacheEntity we dont need getter/setter or Id 
    public String designer;
    public String name;    
}

A continuación un ejemplo de todo junto. En el repositorio Git podéis ver todo el código. 

@Path("/boardgame")
public class BoardGameResource {
    @GET
    @Path("/{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public BoardGame getBoardGameById(@PathParam("id") final Long id) {
        return BoardGame.findById(id);
    }
    //warning: if we don put @Transactional generates an error
    @POST
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    @Transactional
    public BoardGame persist(final BoardGame newBoardGame) {
        BoardGame.persist(newBoardGame);
        return newBoardGame;
    }
}

Para poder configurar las distintas características, lo podremos hacer a través del fichero application.properties podremos. Aquí indicamos algunas:
  • quarkus.http.port: Podemos indicar en que puerto admite las llamadas
  • quarkus.datasource.username/password/jdbc.url: Podemos indicar la conexión a la BBDD. 
  • quarkus.hibernate-orm: Tiene múltiples opciones para indicar si queremos o no que se genere el esquema de la BBDD al iniciar la aplicación y los ficheros para ello. 
Una vez que hemos desarrollado y configurado el proyecto, vamos a proceder a arrancarlo. Como estamos en desarrollo, utilizaremos el comando

mvn quarkus:dev

Otro punto a favor del uso de Quarkus, es que podemos recargar fácilmente la aplicación y comprobar los cambios, simplemente pulsando la tecla 's' en la consola donde lo tengamos ejecutando. 

Espero que os haya sido útil, como siempre. Y si queréis ver todo el código, está aquí

No hay comentarios:

Publicar un comentario