¿Cómo desplegar una aplicación Spring Boot utilizando Docker?

31 agosto
Gastón Iriarte – Sr. Java Developer DataArt
¿Cómo desplegar una aplicación Spring Boot utilizando Docker?
Parte 1 de 3: Creando aplicacion Web con Spring Boot.

El objetivo de esta serie de artículos se basa en detallar cómo se implementa y se despliega una aplicación Java utilizando el framework Spring Boot dentro de un entorno de desarrollo configurado con docker.

He decidido dividir este tutorial en 3 artículos. A continuación, veremos una introducción a Spring Boot, su objetivo y algunas ventajas y desventajas.

¿Qué es Spring Boot?

Spring boot es una herramienta proveída por el conocido framework de desarrollo spring. Nos permite crear aplicaciones de manera muy rápida sólo configurando algunas dependencias y los parámetros requeridos en los archivos de configuración (properties).

La principal idea detrás de spring boot es la posibilidad de simplificar la declaración de dependencias de un proyecto y el despliegue del mismo en un particular server, permitiendo de esta forma que el desarrollador se enfoque en la lógica de negocio.

Ventajas:

  • Rápido setup de aplicación y servidor.
  • Buen soporte en el sitio de spring.io y en su comunidad (gran cantidad de recursos para consultar en Internet).
  • Se puede obtener una aplicación funcionando en verdaderamente poco tiempo.
  • Los archivos donde se declaran las dependencias tienden a ser más cortos, ya que sólo es necesario declarar unas pocas dependencias de spring boot y luego estas mismas se encargarán de descargar todos los jars necesarios.

Desventajas:

  • El código resultante termina siendo muy dependiente de las clases propias de spring. Llegado el caso en que se opte por salirse de los beans propios de spring para crear algo “custom” puede resultar un poco confuso y requerir una lectura más detallada del funcionamiento del framework.
  • En el caso de que no se agregan las dependencias de Spring Boot con cuidado, y se terminen agregando dependencias que quizás no se necesiten, es posible que obtengamos excepciones no deseadas durante el startup de la aplicación.

Creando la aplicación

Vamos a crear una aplicación web con Spring Boot (ABM de Items) que contenga las siguientes características:

  • Debe permitir realizar alta, baja y modificación de Items en la base de datos.
  • Deberá proveer de un listado de todos los Items en la base.
  • Utilizar base de datos Mongo DB.
  • Se declara un Controller (ItemController) que posee todos los endpoints necesarios.

Spring Boot provee un asistente en donde uno puede seleccionar qué módulos va a utilizar en una aplicación determinada y tras ello tendremos disponible el “esqueleto” de dicha aplicación para descargar. Se trata de Spring Initializr. Para nuestro ejemplo vamos a indicar el grupo, artefacto y dependencias (Web, MongoDB) que utilizaremos como sigue:

Una vez generado este proyecto vamos a obtener un archivo .zip que podemos descargar y descomprimir en cualquier ubicación. Al abrir la carpeta descomprimida con un IDE de desarrollo (utilizo para este caso IntelliJ) podemos ver la estructura de directorios creada por Spring Boot.

Contenido de pom.xml

Hemos seleccionado Maven como manejador de dependencias al generar nuestro proyecto en Spring Initializr, no obstante, todas las dependencias elegidas de Spring Boot podremos verlas en el archivo pom.xml dentro del nodo <dependencies> como muestro a continuación:

Algunos archivos importantes

En nuestra aplicación generada por defecto podemos encontrar algunos archivos que serán de importancia en un futuro:

  • src/main/BootdockerApplication.java: Contiene el script de arranque (main) de la aplicación spring boot.
  • src/main/resources/application.properties: En este archivo podremos configurar cualquier tipo de parámetros (conexión con la base de datos, variables utilizadas en el código, etc).
  • src/test/BootdockerApplicationTests.java: Podemos utilizar esta clase (o incluso crear nuevas clases debajo de este directorio) para agregar tests unitarios o de integración.

Configurando el acceso a datos

Con respecto a la configuración del acceso a datos tenemos que tener en cuenta los siguientes componentes a crear:

  • Configuración de los parámetros de conexión con la base de datos:
      Particularmente, en el archivo application.properties debemos indicar dichos parámetros para conectarnos al mongoDB:
  • Creación de clase en el dominio: Necesitamos crear una entidad bajo el nombre de “Item” la cual será mapeada con la respectiva colección en la base de datos:
  •  
  • Creación de la clase Repository: Necesitamos crear una interfaz que extienda de MongoRepository (la cual extiende a su vez de CrudRepository) para realizar las operaciones contra el objeto Item:
     

Declaración del controlador

Necesitamos ahora crear la clase ItemController, la cual tendrá los endpoints necesarios para realizar el ABM de Items, así como también la consulta para extraer todos los Items de la base de datos. Este archivo tendrá como dependencia el ItemRepository creado anteriormente:

Arranque de aplicación y prueba de funcionamiento

Para arrancar la aplicación es necesario correr el siguiente comando desde la raíz del proyecto:

mvn spring-boot:run

Esto iniciara el servidor Tomcat en el puerto 8080 con acceso a todos los endpoints creados en el controller del punto anterior.

En caso de que, por algún motivo, se desee cambiar el servidor en el cual se levanta el Tomcat, será necesario agregar la entrada “server.port” al application.properties y colocar el puerto que se crea conveniente.

Una vez iniciada la aplicación ya estamos en condiciones de realizar las pruebas de nuestro servicio REST. En mi caso estoy utilizando Postman para realizar estas pruebas, pero puede utilizarse cualquier otra herramienta (incluso crear una aplicación frontend que consuma estos servicios, obviamente).

  • Insertando Item:
  • Obteniendo lista de todos los ítems:

En la próxima edición, profundizaremos en el concepto de Docker, cómo se arman estos contenedores y el uso de docker compose.

Finalmente, en el último artículo de la serie armaremos el Docker Compose correspondiente a nuestra aplicación Spring Boot y la desplegaremos en una máquina de desarrollo Linux Debian.