Microservicios con Spring Boot (2/4)

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 1Se 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.paradigmadigital.com/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:

  • page=X&size=Y para indicar mediante X e Y el número de página y el tamaño de la misma
  • sort=-name,id ordena mediante este comando primero por ‘name’ de forma descendente y después por ‘id’ de forma ascendente
  • fields=id,name indica que queremos recuperar solamente ‘id’ y ‘name’, los demás parámetros vendrán a null o no vendrán si se configura con JsonIgnore(Ignore.NULL)
  • filter=id:1:4,userId>5,name~product,userId!7 para en este caso poder incluir múltiples filtros mediante el uso de ‘coma’

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

  • : este operador nos permite incluir un ‘igual’ pero también nos permite tener un ‘in’ si se incluyen varios valores separados por ‘dos puntos’
  • > ó < estos operadores nos permiten comparar tanto valores numéricos como alfanuméricos
  • ! este operador nos permite incluir el operador ‘not’
  • ~ este operador indica el operador ‘like’

Hasta aquí esta segunda parte en la que hemos intentado mostrar una estructura de microservicios en un servidor Eureka, con especial atención a la seguridad. En la próxima entrega haremos la integración de los diversos servicios web en la nube.

 

Analizamos a fondo Microservicios con Spring Boot en 4 entregas:

Su rol es el de arquitecto software, especializado en tecnologías J2EE. Se trata de seleccionar tecnologías para desarrollos de proyectos desde cero, implementando patrones de software y buenas prácticas de desarrollo . Esto facilita la codificación de las reglas de negocio de forma que los programadores no tengan que preocuparse por la arquitectura que subyace y que ésta les facilite la programación.

Ver toda la actividad de Javier Ledo

Recibe más artículos como este

Recibirás un email por cada nuevo artículo.. Acepto los términos legales

Comentarios

  1. […] vez iniciado tanto Eureka como los demás microservicios con los comandos indicados en el post anterior podemos acceder a la URL http://localhost:8081 y deberíamos ver los distintos microservicios […]

Escribe un comentario