Iniciar una aplicación de Spring Boot en un puerto aleatorio

Escrito por el .
java planeta-codigo programacion
Comentarios

En una arquitectura basada en microservicios es normal iniciar varias instancias de un mismo servicio, si están en la misma máquina ha de asignarse a cada instancia un puerto diferente. Asignar los puertos manualmente no es recomendable cuando se quieren varias instancias, Spring Boot ofrece la funcionalidad de iniciar la aplicación en un puerto aleatorio.

Spring
Java

Mediante configuración se puede especificar el puerto en el que se desea iniciar una aplicación de Spring Boot que ofrece un servicio de red. El puerto por convención suele ser el 8080 y la propiedad de configuración de Spring Boot para modificarlo es server.port.

1
2
server:
    port: ${port:8080}
1
2
3
4
$ ./gradlew service:run
...
2019-08-09 17:02:40,417  INFO  org.springframework.boot.web.embedded.tomcat.TomcatWebServer Tomcat started on port(s): 8080 (http) with context path ''
...

Cuando se tiene únicamente una aplicación este puerto por defecto es suficiente pero si se desean iniciar varias instancias de una aplicación o microservicio en una misma máquina es necesario asignar a cada una de ellas un puerto diferente para que no haya conflictos a usar el mismo puerto de red. Se puede hacer manualmente aunque con muchas instancias también se puede dejar a Spring Boot elegir un puerto aleatorio.

Para dejar a Spring Boot elegir el puerto de forma aleatoria basta con especificar el puerto con valor 0 en la propiedad de configuración server.port.

1
2
server:
    port: ${port:0}
1
2
3
4
$ ./gradlew service:run --args="--port=0"
...
2019-08-09 17:02:40,417  INFO  org.springframework.boot.web.embedded.tomcat.TomcatWebServer Tomcat started on port(s): 45871 (http) with context path ''
...

Usando un servicio de registro y descubrimiento como Eureka el servicio registra su ubicación y los servicios que quieran acceder a él obtendrán del mismo servicio de registro y descubrimiento su ubicación, de forma que para los clientes es transparente en qué puerto se inicie.

Sin embargo, por algún motivo con Eureka los servicios no se registran en el puerto aleatorio en el que realmente se inician sino que se registran incorrectamente en el puerto 0, quizá utilizando Consul el servicio de Spring Boot si se inicie en un puerto aleatorio.

El código fuente completo del ejemplo puedes descargarlo del repositorio de ejemplos de Blog Bitix alojado en GitHub y probarlo en tu equipo ejecutando el comando ./gradle-run.sh.