jueves, 18 de julio de 2019

Spark: Como construir un microservicio con lambda rapidamente

Esta claro que los micro servicios estan al alza y aqui traemos otro framework que nos ayude a crear microservicios de forma sencilla y rápida. En este post veremos que lo podemos hacer, haciendo el tipo ejemplo de 'Books' que he hecho otras veces. 

Para empezar debemos indicar que Spark viene con un servidor jetty includo, por lo que para el ejemplo simplemente incluiremos el código deseado dentro de un método static void y al utilizarse cualquier método de Spark se iniciará el servidor. O podemos arrancarlo con init y pararlo con stop. Además también podremos indicar el puerto por el que arranca a través del método port, siendo el  puerto por defecto, 4567.

Un método normal se crea de forma facilmente. Por un lado se utiliza un método de Spark para la operación REST que deseemos: get, post, put, delete o options. Estos métodos tienen principalmente las siguientes 3 caracteristicas:
  • El primer parámetro indicará cual es el path necesario para acceder al método.
  • El segundo parámetro puede variar segun la implementación que elijamos, pero la habitual será una interfaz funcional compuesta por dos objetos: request y response.
  • Al usar una interfaz funcional devolveremos un objeto, que habitualmente será un JSON string.
get("", (req, res) -> new Gson().toJson(
bookMap.values().stream().collect(Collectors.toList())));

Hasta aquí es todo más o menos lo habitual, y si tenemos algo de practica será sencillo dominar esta librería. A continuación indicaremos algunos métodos básicos que nos ayudarán a tener un poco más de control sobre nuestro microservicio.

Para evitar escribir partes del path que se repiten en varios métodos REST, podemos agruparlos dentro del método path que indicaremos la parte que es repetida en ellos.

path("/book", () -> {
    get("", (req, res) -> new Gson().toJson(
        bookMap.values().stream().collect(Collectors.toList())));
});

También podemos indicar parámetros en el path y recogerlos a través del objeto request.

post("/:id", (req, res) -> {
    Integer id = Integer.valueOf(req.params(":id"));
    Book book = new Gson().fromJson(req.body(), Book.class);
    bookMap.put(id, book);
    return new Gson().toJson(book);
});

Podemos mejorar la conversión a JSON mediante dos formas, o creando un objeto del tipo ResponseTransformer o con Lambda.

get("/:id", (req, res) -> 
    bookMap.get(Integer.valueOf(req.params(":id"))), new JsonTransformer());
delete("/:id", (req, res) -> 
    bookMap.remove(Integer.valueOf(req.params(":id"))), new Gson()::toJson);

También existen los métodos after y before que nos permite realizar operaciones comunes a diversos métodos.

before("/*", (q, a) -> log.info("Received api call"));

Todo el código lo podemos ver aquí. 

No hay comentarios:

Publicar un comentario