En esta segunda entrega de nuestra serie sobre Spring boot nos centraremos en la implementación específica de los distintos microservicios, para ello nos basaremos en el siguiente código:

$ git clone https://github.com/jledo/PostMicroservices MicroServices

Una vez importado en Eclipse tendremos la siguiente imagen:

MicroS5 spring boot 2.4 1

Se dispondrá de dos microservicios básicos los cuales no comparten código entre ellos, la razón es que se desea evitar que haya una dependencia directa entre ambos, queremos que estén completamente desacoplados.

Se ha creado una estructura común para compartir código que es importado por sendos proyectos. La idea es usarlo para compartir interfaces de comunicación o clases de utilidad si fuera necesario, pero siempre evitando el acoplamiento de la implementación de cada servicio.

También se ha añadido un nuevo servicio web que permita agrupar los distintos microservicios para proporcionar una interfaz unificada usando el patrón aggregator. Más adelante se entrará en detalle de las ventajas de este servicio.

Por último se dispondrá de un módulo para el servidor Eureka que se encargará de registrar los demás servicios.

Comandos y uso de los microservicios

Para seguir este ejemplo se necesita tener instalada la última versión del proyecto de arquitectura que se comentó en el post anterior:

$ git clone https://git.paradigma.local/git/ArquitecturaMicroServiciosSprinBoot.git arquitecture***$ cd arquitecture***

$ gradle install

Una vez descargados se necesita iniciar el proyecto Eureka server para registrar los demás servicios web, para ello se ejecuta el comando:

$ gradle build $ gradle eureka:bootRun &

$ gradle product:bootRun &

$ gradle user:bootRun &

$ gradle agregation:bootRun

Cuando se inicia uno de estos microservicios se registra un fichero application.pid con el PID de proceso para poder parar el servicio con el comando kill.

También se pueden iniciar varias instancias de un mismo servicio en distintos puertos:

$ java -jar product/build/libs/product.jar --server.port=8087

Seguridad implementada

Para implementar las reglas de seguridad se hace uso de JWT (JSON Web Token), ya que es un estándar abierto (RFC 7519) además de ser muy flexible y extensible.

Una de las ventajas que aporta es que puede contener un conjunto muy variado de datos como por ejemplo fecha de expiración, autor del token, fecha de creación, ID para revocación y todos los datos que consideremos útiles para nuestro servicio.

Al poder incluir datos aleatorios podemos crear un token con los permisos del usuario incluidos dentro del propio token. Esto nos permite crear una llave de acceso con un subconjunto reducido de permisos para compartir el acceso a determinadas partes del API por aplicaciones externas de forma segura.

También permite establecer la vigencia de este token y todo ello sin necesidad de tener estructuras de datos propias para almacenar dicha información.

Otra ventaja adicional es que se puede tener centralizado en un solo servicio la creación de los token de acceso mientras que los demás servicios son capaces de evaluar por sí mismos si tiene permisos de acceso, sin necesidad de tener visibilidad del servicio de creación de tokens ni de la base de datos usada para crear esos tokens.

La única consideración de seguridad a tener en cuenta es que estos servicios comparten una clave secreta que debe ser protegida para que nadie ajeno a la organización pueda usarla para crear tokens válidos falsos.

API para búsquedas avanzadas

Se ha usado un componente común para ayudar a realizar las búsquedas dentro de cada microservicio, para ello se usa la clase AdvancedSearchRepositoryHelper que contiene un método genérico para ayudar en la implementación de filtrado y búsqueda de entidades.

Se puede acceder a esta interfaz en http://localhost:8083/api/v1/product/search?... (donde los puntos suspensivos se sustituyen por los parámetros que se indican después).

Para ello, se pueden concatenar una serie de parámetros variables con & de la siguiente manera:

Finalmente, conozcamos algunos de los operadores más comunes:

Cuéntanos qué te parece.

Enviar.

Los comentarios serán moderados. Serán visibles si aportan un argumento constructivo. Si no estás de acuerdo con algún punto, por favor, muestra tus opiniones de manera educada.