BOM (Bill Of Materials) - nelsonortfan/MicroDockerSpringBoot GitHub Wiki

BOM

Esta opción se usa para administrar desde un archivo pom.xml centralizado todas las propiedades y versiones de las dependencias que son comunes entre todos los microservicios, así como los plugins y Tags usados para crear las imágenes Docker. Reduce el esfuerzo de actualizaciones y adicional evita conflictos de versiones entre microservicios.

Para su uso, creamos un proyecto desde la pagina de Spring Boot con las siguientes características pero sin ninguna dependencia a usar:

  • Name: eazy-bom
  • Language: Java
  • Group: com.eazybytes
  • Type: Maven
  • Artifact: eazy-bom
  • Package Name: com.eazybytes.eazybom
  • Java: 21
  • Packaging: jar

Una vez creado, eliminamos el folder src con todo su contenido ya que no vamos a tener ninguna codificación para este modulo.

Borramos la etiqueta y su contenido y la reemplazamos por lo siguiente:

imagen

Agregamos ahora en la propiedad los valores que serán comunes para los microservicios:

imagen

La primera propiedad es un modulo que crearemos mas tarde para tener código común centralizado.

Luego Agregamos la siguiente configuración de donde colocamos todas las dependencias que usan los microservicios:

imagen

En la opción de dejamos una dependencia que sea transversal a todos los microservicios, que es la de Spring test:

imagen

Abrimos ahora el archivo pom.xml de Accounts y modificamos la etiqueta para que quede de la siguiente manera, colocando como versión la misma que tiene el proyecto BOM:

imagen

En las de Accounts, lo que hacemos es cambiar la version explicita por la propiedad que nombramos en BOM:

imagen

Borramos del pom.xml de Accounts la configuración de ya que la heredara de BOM. Finalmente modificamos la versión del tag de la imagen usando las propiedades del BOM:

imagen

Repetir el mismo proceso que hicimos para Accounts para el resto de los microservicios.

Se recargan todos los proyectos con Maven. Procedemos a construir la imagen del servicio Config Server para ver que funciona todo correctamente y que no afecta el uso de BOM:

imagen 1

En Docker vemos la imagen creada exitosamente:

imagen 2

La ejecutamos:

imagen 3

Si se desea, en cada microservicio se puede colocar la versión explicita que queramos para que no herede de la definida en BOM.

Shared Libraries

Otro uso que se le da a BOM es tener código repetido centralizado como una librería común. En este caso tomaremos la clase ErrorResponseDto que se repite en los servicios Accounts, Cards y Loans. Para que esto sea posible, se usara un proyecto de Maven con varios módulos.

Creamos el siguiente proyecto en Spring Boot con las dependencias que necesita el código para trabajar:

modulo 5

Lo importamos a nuestro proyecto con los otros microservicios:

modulo 7

Lo movemos al proyecto Bom para que quede como un modulo:

modulo 8

En el archivo pom.xml de eazy-bom, lo agregamos como un modulo de esta manera:

imagen

En el archivo pom.xml de commons, modificamos el parent para que quede de la siguiente forma:

imagen

Eliminamos la clase principal de java y la clase principal de pruebas del proyecto de commons.

De ese mismo archivo pom.xml retiramos todo lo de plugins y adicional agregamos una nueva dependencia que nos ayudar con lo requerido para la clase que vamos a pasar:

imagen

Creamos un nuevo paquete dto y pegamos la clase ErrorResponseDto que queremos dejar centralizada:

imagen

Abrimos el archivo pom.xml de Accounts e importamos esta nueva librería en las dependencias:

modulo con Accounts 9

Borramos la clase ErrorResponseDto de Accounts y hacemos las importaciones desde la libreria common en los Controllers y GlobalException donde es requerido:

Construir la imagen de Accounts:

imagen docker cards ok 12

Repetir el proceso para Cards y Loans.

Creamos las imágenes y ejecutamos el docker compose:

docker compose 15

Todo funciona OK, salvo el servicio Accounts que arroja el siguiente error y por ende el servicio Gateway no puede iniciar:

error feign client section 20

Para arreglar este problema, en el servicio Accounts agregamos el parametro entre comillas para la anotacion @RequestParam de las interfaces de Feign:

imagen

Volvemos a ejecutar y esta vez funciona correctamente.

NOTA: La prueba debe hacerse con todos los microservicios funcionando con la sincronizacion de Docker Compose. Si se trata de crear una imagen de Accounts aislada sin conexión a ConfigServer por la red interna de Docker definida en Docker Compose, no encontrara las propiedades y fallara al ejecutarse. Incluso si solo trata de ejecutarse localmente:

final error
⚠️ **GitHub.com Fallback** ⚠️