{"id":9084,"date":"2021-10-08T10:25:26","date_gmt":"2021-10-08T10:25:26","guid":{"rendered":"https:\/\/www.soltel.es\/?p=4311"},"modified":"2021-10-08T10:25:26","modified_gmt":"2021-10-08T10:25:26","slug":"probando-spring-native-3","status":"publish","type":"post","link":"https:\/\/www.soltel.es\/en\/probando-spring-native-3\/","title":{"rendered":"Testing Spring Native"},"content":{"rendered":"<p>Spring.io tiene publicado desde marzo la versi\u00f3n experimental de Spring Native, toolsuite para dar soporte a la construcci\u00f3n de proyectos springboot compilables y ejecutables sobre GraalVM.<\/p>\n<p>Pero primero: <strong><em>\u00bfQu\u00e9 es GraalVM y qu\u00e9 problema se supone que nos soluciona?<\/em><\/strong><\/p>\n<h2><strong><em>Antecedentes: Cuando mezclas contenedores y JREs.<\/em><\/strong><\/h2>\n<p>Desde que se popularizaron los primeros despliegues basados en contenedores, ha surgido el debate sobre si Java como tal podr\u00eda llegar a tener los d\u00edas contados.<\/p>\n<p>En mi opini\u00f3n, Java como tal es un lenguaje demasiado extendido y utilizado en demasiados \u00e1mbitos para llegar a suponer tal cosa. Hay demasiado buen c\u00f3digo escrito bajo este lenguaje.<\/p>\n<p>Por otro lado, el lenguaje de programaci\u00f3n Java y sobre todo la m\u00e1quina virtual Java, es una soluci\u00f3n de mediados de los 90 que ven\u00eda a dar respuesta al problema del desarrollo y ejecuci\u00f3n de software sobre diferentes plataformas.<\/p>\n<p>B\u00e1sicamente, JDK te permite eso: Es un programa sobre el cual se ejecuta tu software <strong>de forma virtual<\/strong>. Gracias a este avance t\u00fa pod\u00edas desentenderte del tipo de hardware o sistema operativo donde se ejecutar\u00eda tu software. \u00danicamente deb\u00edas tener instalada una versi\u00f3n de JRE compatible en su servidor.<\/p>\n<p>Esta ganancia, como todos bien sabemos no es gratis. La maquina virtual java, al ser una capa m\u00e1s entre su software y tu hardware, tiene un coste en memoria y rendimiento. Pero como no hab\u00eda una soluci\u00f3n mejor, y porque adem\u00e1s, funciona extremadamente bien, estos costes se aceptaron sin reservas.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4312 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_1.png\" alt=\"spring_native_beta_1\" width=\"600\" height=\"332\" \/><\/p>\n<p>Pero ahora, bien entrados en el siglo XXI, el paradigma cambia. El modelo de despliegue de contenedores, aparte de muchas otras m\u00e1s cosas, nos aporta el poder definir mediante un modelo de capas <strong>un entorno de ejecuci\u00f3n completamente virtualizado, otra forma de dar respuesta al mismo problema.<\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4313 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_2.png\" alt=\"spring_native_beta_2\" width=\"600\" height=\"448\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_2.png 990w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_2-300x224.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Pero, <strong>\u00bfQu\u00e9 ocurre si mezclamos estos dos conceptos?<\/strong> Pues nos encontramos con lo siguiente:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4314 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_3.png\" alt=\"spring_native_beta_3\" width=\"600\" height=\"502\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_3.png 990w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_3-300x251.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Como veis, por cada servicio, se a\u00f1ade dentro de los contenedores una capa pesada de virtualizaci\u00f3n (JRE) sobre la propia capa de virtualizaci\u00f3n de Docker, incrementando significativa e innecesariamente el consumo de recursos.<\/p>\n<p>Por todas estas razones a d\u00eda de hoy en entornos de muy alta escalabilidad, no es recomendable el desarrollo de microservicios sobre una JDK \u201ctradicional\u201d, en detrimento de otras plataformas de ejecuci\u00f3n relativamente m\u00e1s directas como node.js, python, GoLang, etc.<\/p>\n<h2><strong><em>GraalVM: \u00bfUna soluci\u00f3n al problema?<\/em><\/strong><\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4315\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/logoGraalVM-300x89.png\" alt=\"logoGraalVM\" width=\"300\" height=\"89\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/logoGraalVM-300x89.png 300w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/logoGraalVM.png 622w\" sizes=\"auto, (max-width: 300px) 100vw, 300px\" \/><\/p>\n<p><strong>GraalVM<\/strong> es un entorno de ejecuci\u00f3n de alto rendimiento para Java, JavaScript, y lenguajes basados en LLVM como C y C ++, entre otros.<\/p>\n<p>Principalmente GraalVM hace de \u201ccapa traductora\u201d entre los lenguajes de programaci\u00f3n o el c\u00f3digo objeto de Java y tu S.O. (o en el caso de contenedores, la siguiente capa de virtualizaci\u00f3n). Adem\u00e1s, permite la anticipaci\u00f3n en ejecutables nativos para acelerar el tiempo de inicio y reducir la sobrecarga de memoria.<\/p>\n<p>O, dicho de otro modo, es una forma de ejecutar aplicaciones Java sin necesidad de levantar una JRE y que permite acelerara su arranque si defines una precarga de clases configurable.<\/p>\n<p>Al no seguir la estructura est\u00e1ndar de JDK, GrallVM no ejecuta de forma directa cualquier empaquetado jar. En general, <strong>GraalVM<\/strong> parece tener sus propias reglas de empaquetado y configuraci\u00f3n que dar\u00eda para otra entrada.<\/p>\n<p>Por suerte para nosotros, ya existen frameworks como Micronaut (<a href=\"https:\/\/micronaut.io\/\">https:\/\/micronaut.io\/<\/a>) o Quarkus (<a href=\"https:\/\/quarkus.io\/\">https:\/\/quarkus.io\/<\/a>) y experimentalmente Spring Native que nos abstraen de todo ello.<\/p>\n<h3><strong><em>Ok, GraalVM est\u00e1 muy bien, \u00bfPero porque SpringBoot Native?<\/em><\/strong><\/h3>\n<p><strong>Respuesta corta<\/strong>: Por su historia, su comunidad y todo lo que lo rodea.<\/p>\n<p>SpringBoot, y por asociaci\u00f3n Spring, es uno de los frameworks de desarrollo Java m\u00e1s exitosos de todos los tiempos que cuenta con una de las comunidades m\u00e1s longevas y activas dentro del mundo Java. Hay mucho expertise acumulado sobre Springboot que ser\u00eda una pena perder.<\/p>\n<p>&nbsp;<\/p>\n<p>Por otro lado, Micronaut es un framework relativamente nuevo (2018) que est\u00e1 ganando mucha fuerza en estos \u00faltimos a\u00f1os y ya cuenta con una buena comunidad que lo apoya. Su framework si se considera m\u00e1s estable y en el caso de despliegues sobre GraalVM si se puede considerar la soluci\u00f3n de referencia.<\/p>\n<p>Tambi\u00e9n en la competici\u00f3n est\u00e1 Quarkus, a\u00fan m\u00e1s reciente (Marzo 2019). Quarkus est\u00e1 pensado para ejecuci\u00f3n de java nativo en entornos Kubernetes, siguiendo la filosof\u00eda <strong><em>container-first <\/em><\/strong>y, como no, tambi\u00e9n apoyado en GraalVM para ello.<\/p>\n<p>&nbsp;<\/p>\n<p>Y aunque no descarto futuros post hablando de Quarkus y Micronaut, por los a\u00f1os que personalmente llevo trabajando con Spring y los buenos resultados que me ha aportado, Spring Boot Native deb\u00eda ser el primero en ser examinado.<\/p>\n<p>&nbsp;<\/p>\n<h2><strong><em><u>Construcci\u00f3n de piloto<\/u><\/em><\/strong><\/h2>\n<p>Como piloto vamos a montar un servicio CRUD t\u00edpico contra una base de datos PostgreSQL, aunque valdr\u00eda cualquier otra con soporte r2dbc.<\/p>\n<p>&nbsp;<\/p>\n<p>No nos complicamos y nos vamos a <a href=\"https:\/\/start.spring.io\/\">https:\/\/start.spring.io\/<\/a>:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4316 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png\" alt=\"spring_native_beta_4\" width=\"600\" height=\"350\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png 1074w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4-1024x599.png 1024w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4-300x175.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Con esta configuraci\u00f3n pulsamos sobre <em><strong>GENERATE<\/strong><\/em>, y ya tenemos un zip con el proyecto punto de partida.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong>A\u00f1adiendo drivers y persistencia<\/strong><\/h3>\n<p>Abrimos pom.xml y a\u00f1adimos a las dependencias los drivers reactivos para PostgreSQL:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4317 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_5.png\" alt=\"spring_native_beta_5\" width=\"600\" height=\"368\" \/><\/p>\n<p>Dado que el proyecto spring native est\u00e1 en estado experimental y que spring-data ya nos ofrece una buena base para construir CRUDS, vamos a evitar en esta demo incluir librer\u00edas no imprescindibles como Apache Lombok o Hibernate JPA que nos puedan generar conflictos innecesarios.<\/p>\n<p>Ahora hay que a\u00f1adir la persistencia.<\/p>\n<p>Para ello, nos apoyamos en spring-data y creamos una entidad Libro, y su respectivo <em>R2dbcRepository<\/em>:<\/p>\n<p><strong><em>Libro.java<\/em><\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4319 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_6.png\" width=\"380\" height=\"600\" \/><\/p>\n<p><strong><em>LibroRepository.java<\/em><\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4320 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_7.png\" width=\"600\" height=\"120\" \/><\/p>\n<p>Ya tenemos la persistencia, ahora a montar los servicios.<\/p>\n<h3><strong>Servicios<\/strong><\/h3>\n<p>Crearemos dos clases java: LibroServiceImpl.java (y su correspondiente interfaz con las operaciones de negocio) y LibroController.java, encargado de dar forma a la fachada REST\u00a0 del CRUD.<\/p>\n<p><strong><em>LibroService.java<\/em><\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4326 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_8.png\" alt=\"spring_native_beta_8\" width=\"600\" height=\"278\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_8.png 1238w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_8-1024x473.png 1024w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_8-300x139.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p><strong><em>LibroServiceImpl.java<\/em><\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4327 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_9.png\" alt=\"spring_native_beta_9\" width=\"480\" height=\"600\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_9.png 2020w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_9-1024x1279.png 1024w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_9-240x300.png 240w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_9-820x1024.png 820w\" sizes=\"auto, (max-width: 480px) 100vw, 480px\" \/><\/p>\n<p><strong><em>LibroController.java<\/em><\/strong><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4328 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_10.png\" alt=\"spring_native_beta_10\" width=\"600\" height=\"572\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_10.png 1760w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_10-1024x975.png 1024w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_10-300x286.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/p>\n<p>Ya tenemos en esencia todo el c\u00f3digo picado. S\u00f3lo faltar\u00edan un par de retoques:<\/p>\n<ol>\n<li>En la clase DemoSpringNativeApplication.java, a\u00f1adimos la anotaci\u00f3n <em>@EnableR2dbcRepositories<\/em>.<\/li>\n<li>Creamos una base de datos postgreSQL y le a\u00f1adimos la tabla para libros:<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4329\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_11.png\" alt=\"spring_native_beta_11\" width=\"600\" height=\"192\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_11.png 1780w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_11-1024x329.png 1024w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_11-300x96.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/li>\n<li>En el archivo <em>application.properties<\/em>, incluimos las propiedades de conexi\u00f3n a dicha base de datos.<br \/>\n<img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4330\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_12.png\" alt=\"spring_native_beta_12\" width=\"600\" height=\"130\" srcset=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_12.png 1780w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_12-1024x223.png 1024w, https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_12-300x65.png 300w\" sizes=\"auto, (max-width: 600px) 100vw, 600px\" \/><\/li>\n<\/ol>\n<p>Y ya tenemos el c\u00f3digo fuente listo para empaquetar.<\/p>\n<h3><strong><em>Empaquetando para GraalVM<\/em><\/strong><\/h3>\n<p>La mejor forma de construir la imagen Docker con GraalVM, es utilizar el plugin spring-boot:build-image<\/p>\n<table style=\"height: 63px;\" width=\"718\">\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><code style=\"background-color: black; color: white;\">$\u00a0 mvn clean package spring-boot:build-image<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>Nota<\/strong>: El empaquetado consume tanto una gran cantidad de memoria (oficialmente recomiendan 16GB disponibles) como una gran cantidad de tiempo (no baja de m\u00e1s de 5 minutos).<\/p>\n<p>Una vez completado el proceso, nos debe aparecer por consola un mensaje como el siguiente:<\/p>\n<table style=\"height: 53px;\" width=\"901\">\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><em>[INFO] Successfully built image &#8216;docker.io\/library\/demo-spring-native-graalvm:1.0.0&#8217;<\/em><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Esto significa que, en nuestro Docker local, existe una nueva imagen con este tag que puede ser desplegada.<\/p>\n<table style=\"height: 56px;\" width=\"734\">\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><code style=\"background-color: black; color: white;\">$\u00a0 docker run -p 8080:8080 -e R2DBC_URL=\u2026 -e R2DBC_USER=\u2026 -e R2DBC_PASS=\u2026 docker.io\/library\/demo-spring-native-graalvm:1.0.0<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Lo primero que os va a sorprender es el tiempo de arranque, alrededor de 0,12 segundos (Si parpadeas, te lo pierdes).<\/p>\n<table style=\"height: 62px;\" width=\"743\">\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><span style=\"font-size: 14px;\">e.s.r.d.DemoSpringNativeApplication\u00a0\u00a0\u00a0\u00a0\u00a0 : Started DemoSpringNativeApplication in <strong>0.116<\/strong> seconds (JVM running for <strong>0.119<\/strong>)<\/span><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Para probarlo se puede hacer uso de Postman o ejecutar peticiones curl manualmente:<\/p>\n<p><strong><em>GET<\/em><\/strong><\/p>\n<table style=\"height: 34px;\" width=\"746\">\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><code style=\"background-color: black; color: white;\">$ curl\u00a0--location\u00a0--request\u00a0GET\u00a0'http:\/\/localhost:8080\/libros\/'<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong><em>PUT <\/em><\/strong>(Insertar nuevo elemento)<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><code style=\"background-color: black; color: white;\">$ curl\u00a0--location\u00a0--request\u00a0PUT\u00a0'http:\/\/ localhost:8080\/libros'\u00a0\\<br \/>\n--header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\<br \/>\n--data-raw\u00a0'{<br \/>\n\"codigo\":\u00a0\"9780007141326\",<br \/>\n\"titulo\":\u00a0\"El\u00a0se\u00f1or\u00a0de\u00a0los\u00a0anillos:\u00a0Libro Uno, Dos y Tres\",<br \/>\n\"autor\":\u00a0\"J.\u00a0R\u00a0R.\u00a0Tolkien\",<br \/>\n\"sinopsis\":\u00a0\"Este\u00a0libro\u00a0narra\u00a0las\u00a0aventuras\u00a0de\u00a0Frodo\u00a0bolson\u00a0y\u00a0sus\u00a0alegres\u00a0compinches\u00a0\"<br \/>\n}<br \/>\n'<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong><em>POST\u00a0 <\/em><\/strong>(Modificar un elemento)<\/p>\n<table>\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><code style=\"background-color: black; color: white;\">$ curl\u00a0--location\u00a0--request\u00a0POST\u00a0'http:\/\/localhost:8080\/libros'\u00a0\\<br \/>\n--header\u00a0'Content-Type:\u00a0application\/json'\u00a0\\<br \/>\n--data-raw\u00a0'{<br \/>\n\"codigo\":\u00a0\"9780007141326\",<br \/>\n\"titulo\":\u00a0\"El\u00a0se\u00f1or\u00a0de\u00a0los\u00a0anillos:\u00a0La\u00a0trilog\u00eda completa\",<br \/>\n\"autor\":\u00a0\"J.\u00a0R\u00a0R.\u00a0Tolkien\",<br \/>\n\"sinopsis\":\u00a0\"Este\u00a0libro\u00a0narra\u00a0las\u00a0desventuras\u00a0de\u00a0Frodo\u00a0Bolson, y de como un recado simple como llevar un anillo a Bree se te puede ir de las manos\"<br \/>\n}<br \/>\n'<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><strong>DELETE<\/strong><\/p>\n<table style=\"height: 34px;\" width=\"694\">\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\"><code style=\"background-color: black; color: white;\">$ curl\u00a0--location\u00a0--request\u00a0DELETE\u00a0'http:\/\/localhost:8080\/libros\/9780007141326'<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<h2><strong><u>Comparando Consumos<\/u><\/strong><\/h2>\n<p>Ahora para poder estar seguros, vamos en primer lugar a utilizar el mismo c\u00f3digo fuente para montar un contendor con el empaquetado JRE \u201ccl\u00e1sico\u201d y as\u00ed comparar que m\u00e9tricas arrojan cada uno.<\/p>\n<p>Adem\u00e1s, para que las reglas sean lo m\u00e1s justas posibles, vamos simplemente a montarlo y lanzarlo sobre contenedor basado en una imagen muy eficiente en recursos: <strong><em>registry.access.redhat.com\/ubi8\/openjdk-11-runtime<\/em><\/strong>.<\/p>\n<p>De entrada, el tiempo de arranque ha pasado de milisegundos a segundos completos: 4 ~ 5s aprox:<\/p>\n<table style=\"height: 55px;\" width=\"798\">\n<tbody>\n<tr>\n<td style=\"background-color: black; color: white;\" width=\"566\">e.s.r.d.DemoSpringNativeApplication: Started DemoSpringNativeApplication in <strong>4.057<\/strong> seconds (JVM running for <strong>4.826<\/strong>)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Para un vistazo a m\u00e9tricas m\u00e1s orientadas al consumo de recursos, en mi caso, ya que tengo portainer montado en local para otros menesteres, me voy a limitar a comparar gr\u00e1ficas.<\/p>\n<p>&nbsp;<\/p>\n<h3><strong><em>Contenedor con openjdk-runtime:<\/em><\/strong><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4332 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_14.png\" alt=\"spring_native_beta_14\" width=\"800\" height=\"144\" \/><\/p>\n<h3><strong><em>Contenedor con GraalVM:<\/em><\/strong><\/h3>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-medium wp-image-4333 aligncenter\" src=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_15.png\" alt=\"spring_native_beta_15\" width=\"800\" height=\"140\" \/><br \/>\nComo veis, el consumo de RAM es <strong>bastante menos de la mitad. <\/strong>No he apreciado diferencias de rendimiento entre ellos, aunque es cierto que al ser proyectos peque\u00f1os y adem\u00e1s con servicios reactivos, es dif\u00edcil medir diferencias sin hacer aut\u00e9nticas pruebas de carga.<\/p>\n<p>Adem\u00e1s, las im\u00e1genes con GraalVM pesan casi 4 veces menos (112MB vs 400MB aprox).<\/p>\n<h2><strong><em>CONCLUSIONES<\/em><\/strong><\/h2>\n<p>&nbsp;<\/p>\n<p>Spring Native es un inicio prometedor al que a\u00fan le faltan muchas aristas por pulir.<\/p>\n<p>El proceso de construcci\u00f3n es delicado. En mi caso, para el ejemplo, tuve que volver a montar el proyecto base un par de veces.<\/p>\n<p>No todo es compatible hasta la fecha. Por ejemplo, la propia configuraci\u00f3n para swagger, <strong>@OpenAPIDefinition<\/strong>, di\u00f3 problemas de arranque, aunque es posible que fuera por falta de alg\u00fan detalle de la configuraci\u00f3n del proceso de construcci\u00f3n.<\/p>\n<p>Adem\u00e1s, como ya he mencionado, la ejecuci\u00f3n build-image consume mucha memoria (su documentaci\u00f3n oficial recomienda 16GB), y tarda demasiado en completarse (~6 minutos en el caso del ejemplo). Si entramos en el contexto del desarrollo local y la integraci\u00f3n continua, son tiempos de espera excesivos.<\/p>\n<p>En resumen, Spring native es un proyecto muy en fase beta al que no debemos perderle la pista, aunque por las dificultades encontradas no lo considero lo suficientemente maduro como para utilizarlo a d\u00eda de hoy profesionalmente.<br \/>\nPuedes descargar el fuente de este articulo accediendo a su <strong><a href=\"https:\/\/github.com\/rturv\/demo-spring-native\">p\u00e1gina de GitHub<\/a><\/strong><\/p>\n<p dir=\"ltr\">En SOLTEL tenemos una actitud innovadora hacia la tecnolog\u00eda porque nos apasiona. Nuestra trayectoria trabajando con distintas tecnolog\u00edas a lo largo de tantos a\u00f1os, nos ayuda a afrontar los proyectos con much\u00edsima perspectiva y a convertirnos en aut\u00e9nticos partners tecnol\u00f3gicos de nuestros clientes.<\/p>\n<p>&nbsp;<\/p>\n<p style=\"font-size: 14px; margin-left: 24px;\"><em>Articulo elaborado por Ram\u00f3n Tur V\u00e1zquez, Solutions Architect en SOLTEL Group<\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Spring.io has released the experimental version of Spring Native in March, a toolsuite designed to support the construction of compileable and executable Spring Boot projects on GraalVM. But first: What is GraalVM and what problem is it supposed to solve? Background: When you mix containers and JREs. Since the first container-based deployments became popular\u2026<\/p>","protected":false},"author":8,"featured_media":4316,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[39,161],"tags":[],"class_list":["post-9084","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-nuevas-tecnologias","category-programacion"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.6 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Probando Spring Native - Soltel Group<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.soltel.es\/en\/probando-spring-native-3\/\" \/>\n<meta property=\"og:locale\" content=\"en_GB\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Probando Spring Native - Soltel Group\" \/>\n<meta property=\"og:description\" content=\"Spring.io tiene publicado desde marzo la versi\u00f3n experimental de Spring Native, toolsuite para dar soporte a la construcci\u00f3n de proyectos springboot compilables y ejecutables sobre GraalVM. Pero primero: \u00bfQu\u00e9 es GraalVM y qu\u00e9 problema se supone que nos soluciona? Antecedentes: Cuando mezclas contenedores y JREs. Desde que se popularizaron los primeros despliegues basados en contenedores,...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.soltel.es\/en\/probando-spring-native-3\/\" \/>\n<meta property=\"og:site_name\" content=\"Soltel Group\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/pages\/Soltel-IT-Solutions\/158795267511286\" \/>\n<meta property=\"article:published_time\" content=\"2021-10-08T10:25:26+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1074\" \/>\n\t<meta property=\"og:image:height\" content=\"628\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Comunicacion-Soltel\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@soltel_it\" \/>\n<meta name=\"twitter:site\" content=\"@soltel_it\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Comunicacion-Soltel\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimated reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/\"},\"author\":{\"name\":\"Comunicacion-Soltel\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#\\\/schema\\\/person\\\/23bfee8c77d68affbdefb2efd436f329\"},\"headline\":\"Probando Spring Native\",\"datePublished\":\"2021-10-08T10:25:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/\"},\"wordCount\":1653,\"publisher\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/uploads\\\/2021\\\/10\\\/spring_native_beta_4.png\",\"articleSection\":[\"Nuevas tecnolog\u00edas\",\"Programaci\u00f3n\"],\"inLanguage\":\"en-GB\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/\",\"url\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/\",\"name\":\"Probando Spring Native - Soltel Group\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/uploads\\\/2021\\\/10\\\/spring_native_beta_4.png\",\"datePublished\":\"2021-10-08T10:25:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/#breadcrumb\"},\"inLanguage\":\"en-GB\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/uploads\\\/2021\\\/10\\\/spring_native_beta_4.png\",\"contentUrl\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/uploads\\\/2021\\\/10\\\/spring_native_beta_4.png\",\"width\":1074,\"height\":628},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/probando-spring-native-3\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/www.soltel.es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Probando Spring Native\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#website\",\"url\":\"https:\\\/\\\/www.soltel.es\\\/\",\"name\":\"Soltel Group\",\"description\":\"Soltel IT Solutions, empresa especializada en servicios IT\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.soltel.es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-GB\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#organization\",\"name\":\"Soltel Group\",\"url\":\"https:\\\/\\\/www.soltel.es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/uploads\\\/2023\\\/03\\\/logotipo-soltel.png\",\"contentUrl\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/uploads\\\/2023\\\/03\\\/logotipo-soltel.png\",\"width\":276,\"height\":212,\"caption\":\"Soltel Group\"},\"image\":{\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/pages\\\/Soltel-IT-Solutions\\\/158795267511286\",\"https:\\\/\\\/x.com\\\/soltel_it\",\"https:\\\/\\\/www.youtube.com\\\/@soltel\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/soltel\",\"https:\\\/\\\/www.instagram.com\\\/soltelgroup\\\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/#\\\/schema\\\/person\\\/23bfee8c77d68affbdefb2efd436f329\",\"name\":\"Comunicacion-Soltel\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-GB\",\"@id\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/litespeed\\\/avatar\\\/7a3ea0e05aba60509babe26523c075d4.jpg?ver=1778241045\",\"url\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/litespeed\\\/avatar\\\/7a3ea0e05aba60509babe26523c075d4.jpg?ver=1778241045\",\"contentUrl\":\"https:\\\/\\\/www.soltel.es\\\/wp-content\\\/litespeed\\\/avatar\\\/7a3ea0e05aba60509babe26523c075d4.jpg?ver=1778241045\",\"caption\":\"Comunicacion-Soltel\"},\"url\":\"https:\\\/\\\/www.soltel.es\\\/en\\\/author\\\/comunicacion-soltel\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Testing Spring Native - Soltel Group","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.soltel.es\/en\/probando-spring-native-3\/","og_locale":"en_GB","og_type":"article","og_title":"Probando Spring Native - Soltel Group","og_description":"Spring.io tiene publicado desde marzo la versi\u00f3n experimental de Spring Native, toolsuite para dar soporte a la construcci\u00f3n de proyectos springboot compilables y ejecutables sobre GraalVM. Pero primero: \u00bfQu\u00e9 es GraalVM y qu\u00e9 problema se supone que nos soluciona? Antecedentes: Cuando mezclas contenedores y JREs. Desde que se popularizaron los primeros despliegues basados en contenedores,...","og_url":"https:\/\/www.soltel.es\/en\/probando-spring-native-3\/","og_site_name":"Soltel Group","article_publisher":"https:\/\/www.facebook.com\/pages\/Soltel-IT-Solutions\/158795267511286","article_published_time":"2021-10-08T10:25:26+00:00","og_image":[{"width":1074,"height":628,"url":"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png","type":"image\/png"}],"author":"Comunicacion-Soltel","twitter_card":"summary_large_image","twitter_creator":"@soltel_it","twitter_site":"@soltel_it","twitter_misc":{"Written by":"Comunicacion-Soltel","Estimated reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/#article","isPartOf":{"@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/"},"author":{"name":"Comunicacion-Soltel","@id":"https:\/\/www.soltel.es\/#\/schema\/person\/23bfee8c77d68affbdefb2efd436f329"},"headline":"Probando Spring Native","datePublished":"2021-10-08T10:25:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/"},"wordCount":1653,"publisher":{"@id":"https:\/\/www.soltel.es\/#organization"},"image":{"@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png","articleSection":["Nuevas tecnolog\u00edas","Programaci\u00f3n"],"inLanguage":"en-GB"},{"@type":"WebPage","@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/","url":"https:\/\/www.soltel.es\/probando-spring-native-3\/","name":"Testing Spring Native - Soltel Group","isPartOf":{"@id":"https:\/\/www.soltel.es\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/#primaryimage"},"image":{"@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/#primaryimage"},"thumbnailUrl":"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png","datePublished":"2021-10-08T10:25:26+00:00","breadcrumb":{"@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/#breadcrumb"},"inLanguage":"en-GB","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.soltel.es\/probando-spring-native-3\/"]}]},{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/#primaryimage","url":"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png","contentUrl":"https:\/\/www.soltel.es\/wp-content\/uploads\/2021\/10\/spring_native_beta_4.png","width":1074,"height":628},{"@type":"BreadcrumbList","@id":"https:\/\/www.soltel.es\/probando-spring-native-3\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/www.soltel.es\/"},{"@type":"ListItem","position":2,"name":"Probando Spring Native"}]},{"@type":"WebSite","@id":"https:\/\/www.soltel.es\/#website","url":"https:\/\/www.soltel.es\/","name":"Soltel Group","description":"Soltel IT Solutions, a company specializing in IT services","publisher":{"@id":"https:\/\/www.soltel.es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.soltel.es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-GB"},{"@type":"Organization","@id":"https:\/\/www.soltel.es\/#organization","name":"Soltel Group","url":"https:\/\/www.soltel.es\/","logo":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.soltel.es\/#\/schema\/logo\/image\/","url":"https:\/\/www.soltel.es\/wp-content\/uploads\/2023\/03\/logotipo-soltel.png","contentUrl":"https:\/\/www.soltel.es\/wp-content\/uploads\/2023\/03\/logotipo-soltel.png","width":276,"height":212,"caption":"Soltel Group"},"image":{"@id":"https:\/\/www.soltel.es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/pages\/Soltel-IT-Solutions\/158795267511286","https:\/\/x.com\/soltel_it","https:\/\/www.youtube.com\/@soltel","https:\/\/www.linkedin.com\/company\/soltel","https:\/\/www.instagram.com\/soltelgroup\/"]},{"@type":"Person","@id":"https:\/\/www.soltel.es\/#\/schema\/person\/23bfee8c77d68affbdefb2efd436f329","name":"Comunicacion-Soltel","image":{"@type":"ImageObject","inLanguage":"en-GB","@id":"https:\/\/www.soltel.es\/wp-content\/litespeed\/avatar\/7a3ea0e05aba60509babe26523c075d4.jpg?ver=1778241045","url":"https:\/\/www.soltel.es\/wp-content\/litespeed\/avatar\/7a3ea0e05aba60509babe26523c075d4.jpg?ver=1778241045","contentUrl":"https:\/\/www.soltel.es\/wp-content\/litespeed\/avatar\/7a3ea0e05aba60509babe26523c075d4.jpg?ver=1778241045","caption":"Comunicacion-Soltel"},"url":"https:\/\/www.soltel.es\/en\/author\/comunicacion-soltel\/"}]}},"_links":{"self":[{"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/posts\/9084","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/comments?post=9084"}],"version-history":[{"count":0,"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/posts\/9084\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/media\/4316"}],"wp:attachment":[{"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/media?parent=9084"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/categories?post=9084"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.soltel.es\/en\/wp-json\/wp\/v2\/tags?post=9084"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}