Versiones comparadas

Clave

  • Se ha añadido esta línea.
  • Se ha eliminado esta línea.
  • El formato se ha cambiado.

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):

Bloque de código
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

Una vez incluida, podremos 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:

Image RemovedImage Added

Una vez hecho esto, podremos ver que está corriendo en la consola:

Image Modified

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 el Tomcat embebido 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.

Rendimiento

Test carga de peticiones REST

Tomcat

Devuelve un String simple

Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/secAvg. Bytes
Startup30007154935.783743610293.858360355.9593557255.67238466195
Others300010451.3596616820287.880241854.8209444954.53981144195
Others300010241.1550322750292.112950355.6269778555.3417113195

Devuelve un objeto complejo con datos

...

(el puerto que queramos).

Se podría cambiar la configuración para que en vez de un Tomcat utilice Jetty o Undertow, pero no debemos cambiarlo, pues la configuración de logs está hecha para Tomcat, y cambiarlo traería problemas.

Uso de memoria

HeapUsedMaxThreads Live
697,827,328 B124,260,976 B2,147,483,648 B17

Jetty

Devuelve un String simple

Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/sec
Startup30007056140.137050650291.516859456.082833355.22878
Others300010211.0589250310293.599530256.4835033855.6233485
Others300010210.9260343170294.348508656.6275939555.7652448

Devuelve un objeto complejo con datos

Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/sec
Startup100011031397278.7961107098.13542689203.362671719.93375859
Others100032201.500210319098.48335631204.083673920.00443175
Others100032452.729377218098.29942003203.702509119.96706969

Uso de memoria

HeapUsedMaxThreads Live
628,621,312 B311,476,776 B2,147,483,648 B19

Undertow

Devuelve un String simple

Label# SamplesAverageMinMaxStd. Dev.Error %ThroughputReceived KB/secSent KB/sec
Startup30006045131.61887020295.683027863.8144034656.01807363
Others300010221.2554478620292.740046863.1792483955.46051669
Others300010181.5594779750294.377391863.5326206955.77071681

Devuelve un objeto complejo con datos

...

Uso de memoria

HeapUsedMaxThreads Live
630,718,464 B114,599,536 B2,147,483,648 B17

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

Bloque de código
languagexml
<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

Bloque de código
<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

Bloque de código
<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>

Fuente: https://examples.javacodegeeks.com/enterprise-java/spring/tomcat-vs-jetty-vs-undertow-comparison-of-spring-boot-embedded-servlet-containers/