Spring Boot viene con un servidor embedido, un Tomcat por defecto (podremos cambiarlo, se explica cómo más abajo). Para ejecutar nuestro proyecto Spring Boot en Eclipse, primero tendremos que añadir la dependencia spring-boot-starter-web nuestro pom.xml (si no la hemos añadido en la creación del proyecto):
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
Una vez incluida, podremos ejecutar nuestro proyecto haciendo click derecho en el nombre de nuestro proyecto en el explorador, y yéndonos a Run As → Spring Boot App:
Una vez hecho esto, podremos ver que está corriendo en la consola:
En la consola podremos consultar también los eventos que se produzcan durante la ejecución, como errores, o escrituras al log. Por defecto se despliega en el puerto 8080, pero esto podemos modificarlo en el archivo src/main/resources/application.properties añadiendo:
server.port=8443
A continuación mostramos una comparativa entre Tomcat, Jetty y Undertow, seguido de las instrucciones para cada uno. Según la comparativa, la opción más eficiente es Undertow, y es la que se está utilizando con las primeras aplicaciones, pero se explican las tres opciones para que, a falta de un arquetipo definitivo, tengamos toda la información disponible.
Comparativa de servidores
Rendimiento
Test carga de peticiones REST
Tomcat
Devuelve un String simple
| Label | # Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec | Avg. Bytes |
| Startup | 3000 | 7 | 1 | 549 | 35.78374361 | 0 | 293.8583603 | 55.95935572 | 55.67238466 | 195 |
| Others | 3000 | 1 | 0 | 45 | 1.359661682 | 0 | 287.8802418 | 54.82094449 | 54.53981144 | 195 |
| Others | 3000 | 1 | 0 | 24 | 1.155032275 | 0 | 292.1129503 | 55.62697785 | 55.3417113 | 195 |
Devuelve un objeto complejo con datos
| Label | # Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec |
| Startup | 1000 | 114 | 3 | 1601 | 322.8671905 | 0 | 97.68486861 | 202.3335999 | 19.93763432 |
| Others | 1000 | 3 | 2 | 17 | 1.328216473 | 0 | 97.88566954 | 202.7495167 | 19.9786181 |
| Others | 1000 | 2 | 1 | 16 | 1.110529603 | 0 | 98.52216749 | 204.0678879 | 20.10852833 |
| Others | 1000 | 2 | 1 | 21 | 1.344498419 | 0 | 98.53187506 | 204.0879951 | 20.11050966 |
Uso de memoria
| Heap | Used | Max | Threads Live |
| 697,827,328 B | 124,260,976 B | 2,147,483,648 B | 17 |
Jetty
Devuelve un String simple
| Label | # Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec |
| Startup | 3000 | 7 | 0 | 561 | 40.13705065 | 0 | 291.5168594 | 56.0828333 | 55.22878 |
| Others | 3000 | 1 | 0 | 21 | 1.058925031 | 0 | 293.5995302 | 56.48350338 | 55.6233485 |
| Others | 3000 | 1 | 0 | 21 | 0.926034317 | 0 | 294.3485086 | 56.62759395 | 55.7652448 |
Devuelve un objeto complejo con datos
| Label | # Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec |
| Startup | 1000 | 110 | 3 | 1397 | 278.7961107 | 0 | 98.13542689 | 203.3626717 | 19.93375859 |
| Others | 1000 | 3 | 2 | 20 | 1.500210319 | 0 | 98.48335631 | 204.0836739 | 20.00443175 |
| Others | 1000 | 3 | 2 | 45 | 2.729377218 | 0 | 98.29942003 | 203.7025091 | 19.96706969 |
Uso de memoria
| Heap | Used | Max | Threads Live |
| 628,621,312 B | 311,476,776 B | 2,147,483,648 B | 19 |
Undertow
Devuelve un String simple
| Label | # Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec |
| Startup | 3000 | 6 | 0 | 451 | 31.6188702 | 0 | 295.6830278 | 63.81440346 | 56.01807363 |
| Others | 3000 | 1 | 0 | 22 | 1.255447862 | 0 | 292.7400468 | 63.17924839 | 55.46051669 |
| Others | 3000 | 1 | 0 | 18 | 1.559477975 | 0 | 294.3773918 | 63.53262069 | 55.77071681 |
Devuelve un objeto complejo con datos
| Label | # Samples | Average | Min | Max | Std. Dev. | Error % | Throughput | Received KB/sec | Sent KB/sec |
| Startup | 1000 | 42 | 3 | 852 | 132.6443576 | 0 | 98.02960494 | 205.6324135 | 20.00799554 |
| Others | 1000 | 3 | 2 | 19 | 1.293570253 | 0 | 98.55129595 | 206.6305004 | 20.01823199 |
| Others | 1000 | 2 | 2 | 27 | 1.659250132 | 0 | 98.74592673 | 207.0385788 | 20.05776637 |
| Others | 1000 | 2 | 1 | 17 | 1.260904041 | 0 | 98.28975821 | 206.0821395 | 19.96510714 |
Uso de memoria
| Heap | Used | Max | Threads Live |
| 630,718,464 B | 114,599,536 B | 2,147,483,648 B | 17 |
Conclusiones
Tras la comparativa parece que las mejores opciones son Undertow y Tomcat puesto que hacen una buena gestión de la memoria sin tener grandes retardos. Undertow parece la mejor opción neta debido al menor uso de memoria y tiempos de respuesta.
Configración de despliegue por servidor
Para cambiar entre cada uno de los servidores es tan simple como cambiar las dependencias en el pom.xml. Para configurar que funcione por HTTPS nos vale la misma configuración en los tres servidores.
Tomcat
<properties><tomcat.version>8.5.6</tomcat.version></properties> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-core</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-el</artifactId> <version>${tomcat.version}</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-websocket</artifactId> <version>${tomcat.version}</version> </dependency>
Jetty
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency>
Undertow
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <exclusions> <exclusion> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-tomcat</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-undertow</artifactId> </dependency> <groupId>io.undertow</groupId> <artifactId>undertow-servlet</artifactId> <version>1.3.24.Final</version> </dependency> -->

