Skip to content

Libro Learn Microservices: Guía de Actualización a Spring Boot 2.7

El capítulo extra para la actualización del código fuente del libro desde Spring Boot 2.6 a 2.7 con correcciones de la base de datos H2 y mejoras de configuración

¡Un nuevo capítulo de actualización! Este cubre los cambios requeridos en el código fuente del libro Learn Microservices with Spring Boot para actualizarlo a Spring Boot 2.7.1 y algunos extras.

Una sorpresa de actualización mayor de H2 y algunos extras

Las actualizaciones fluidas no podían durar demasiado tiempo. Esta actualización rompe las fuentes de código del libro nuevamente, pero nada que no se pueda arreglar con algunos cambios menores.

Este lanzamiento de las fuentes del libro también prepara el camino para la próxima actualización mayor de Spring Boot 3.x.

En resumen, estos son los cambios cubiertos en este capítulo:

  • (Obligatorio) Corregir el error causado por usar características incompatibles de H2
  • (Obligatorio) Corregir el error causado por usar una palabra clave reservada de H2
  • (Opcional) Migrar al nuevo sistema de configuración introducido en Spring Boot 2.4
  • (Opcional) Usar un servidor de base de datos H2 para evitar el aislamiento de datos al escalar el sistema
  • (Opcional) Usar el resolvedor DNS Netty de macOS para evitar advertencias feas en los logs

Acerca de esta guía: Este es un enfoque práctico para migrar un proyecto de Spring Boot desde la versión 2.6 a la versión 2.7. Utiliza la base de código del ejemplo práctico del libro Learn Microservices with Spring Boot, pero se aplica a otros proyectos también. Si quieres profundizar en cómo funciona Spring Boot y configurar una arquitectura de microservicios completa, consigue una copia ahora.

Tomaremos como línea base los últimos cambios para actualizar los proyectos a Spring Boot 2.6. El nuevo código fuente está disponible en GitHub (mientras estás ahí, ¡dale una estrella!).

Actualización mayor de H2

Spring Boot 2.7 trae una actualización mayor de la base de datos que usamos en el código del libro desde 1.x a 2.x. Muchos cambios en esta versión mayor son incompatibles hacia atrás y dos de ellos impactan nuestro código (rompiéndolo). Ver esta sección en las notas de lanzamiento de Spring Boot 2.7 para más detalles.

Característica no soportada: “AUTO_SERVER=TRUE && DB_CLOSE_ON_EXIT=FALSE”

En el libro, usamos la característica “Auto Server” de H2 para crear automáticamente un servidor de base de datos al iniciar una instancia de microservicio. El objetivo principal era mantener la base de datos simple usando solo archivos que puedan compartirse entre instancias de microservicios. Con esta característica, múltiples réplicas de microservicios pueden conectarse al mismo archivo de base de datos en lugar de tener almacenes de datos independientes, lo que no encajaría en una arquitectura de microservicios.

Combinado con esa característica, establecimos el flag DB_CLOSE_ON_EXIT=FALSE. Tenía la intención de evitar que detener un microservicio causara que el servidor de base de datos se cayera. Pero malinterpreté los documentos porque no es así como funciona. Este flag solo es útil cuando la aplicación necesita hacer algo con la base de datos en su propio hook de apagado.

El nuevo lanzamiento mayor no permite el uso de estos dos flags juntos porque eso puede causar problemas de incompatibilidad. Ver este comentario para más detalles.

Podemos resolver esto muy rápidamente: simplemente eliminando el parámetro DB_CLOSE_ON_EXIT de la URL de conexión.

spring.datasource.url=jdbc:h2:file:~/gamification;AUTO_SERVER=TRUE;

Error ejecutando DDL “create table user …”

Si intentas iniciar el microservicio multiplication después de la actualización en un nuevo espacio de trabajo, obtendrás un error como el siguiente:

Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "create table [*]user (id bigint not null, alias varchar(255), primary key (id))"; expected "identifier"; SQL statement: [...]

La descripción del error puede no ayudar mucho, pero la causa raíz es que el nombre de nuestra tabla es user y esto ahora es una palabra clave de sintaxis. Debemos escaparla, cambiar el nombre de la tabla o configurar H2 para evitar considerar esto una palabra clave. Para mantenerlo simple, optaremos por esta última opción que requiere solo un cambio en la URL de la base de datos en application.properties. Usamos el parámetro NON_KEYWORDS en H2 para lograr esto.

spring.datasource.url=jdbc:h2:file:~/multiplication;AUTO_SERVER=TRUE;NON_KEYWORDS=USER;

Bonus: Migrando bootstrap a las propiedades de application

Además de las actualizaciones obligatorias para hacer que el código funcione con 2.7, también cambié al nuevo enfoque de configuración introducido por Spring Boot 2.4.x. Es bueno hacer esto en preparación para el lanzamiento de Spring Boot 3.x, que dejará de funcionar con el enfoque antiguo.

Los cambios requeridos para pasar al nuevo enfoque de configuración incluyen eliminar el starter de bootstrap heredado y migrar propiedades desde archivos bootstrap a archivos de propiedades de aplicación.

Resumen

¡Eso es todo! Un par de correcciones obligatorias con esta actualización, ambas causadas por la actualización mayor de H2, y algo de contenido bonus que puedes usar para mantenerte actualizado con los cambios de Spring Boot. Además de eso, ahora tenemos la opción de usar un servidor de base de datos H2, lo que hace que toda la configuración sea aún más similar a una arquitectura de microservicios lista para producción real.

Si aún no tienes el libro, te recomiendo encarecidamente que consigas tu copia ahora. Sigo actualizando el código fuente del libro y compartiré más contenido alrededor del mismo caso de uso.

Código Fuente: El código fuente del libro con todas las actualizaciones está disponible en GitHub: U.2.7. Mientras estás ahí, ¡por favor dale una estrella!

Master Microservices with Spring Boot

A hands-on guide to building production-ready microservices

Get the Book

Get More Architecture Insights

Join hundreds of software architects and engineers getting practical insights delivered to their inbox.

Volver al Blog