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 (el puerto que queramos).
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.
Test carga de peticiones REST
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 |
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 |
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 |
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.
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.
<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> |
<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> |
<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> |