Table of Contents
Visión general
Este artículo se basa en la documentación de Spring Native 0.10.6 BETA .
? pero la versión 0.11 acaba de salir y es muy recomendable usar la v0.11 por las muchas mejoras con un nuevo motor AheadOfTime (AOT). Consulte la sección Versión 0.11 de este artículo.
Así que echemos un vistazo a las ventajas y limitaciones de esta primera versión. Te recomiendo que consultes la sección completa versión en la documentación oficial.
Ten siempre en cuenta que estamos trabajando con una versión BETA que tiene algunas limitaciones & incompatibilidades. En la documentación oficial podemos encontrar una guía de resolución de problemas para los problemas más comunes. También hay que echar un vistazo a los ejemplos & cuestiones en el proyecto github.
Requisitos previos
- 16GB RAM (en el pc compilando a nativo)
- Spring Boot 2.5.6
- Java 8, Java 11, y Kotlin 1.5+
- GraalVM versión 21.2.0
Compatibilidad con Spring-boot
- Spring-boot starters: Comprueba todos los soportados, algunos necesitan una gestión especial de dependencias.
- Spring Cloud 2020.0.3 starters
- Spring data y otros (Lombok, drivers jdbc, gprc, spring-kafka, …)
Limitaciones
https://www.graalvm.org/reference-manual/native-image/Limitations/
Spring Native con BuildPacks o Native Build Tools
En este artículo seguiremos ambas guías de inicio con Buildpacks, y con Native Build Tools en la Documentación de Spring Native.
Puedes clonar el proyecto de este artículo para construirlo si quieres.
git clone https://github.com/davidgfolchApium/spring-native-beta.git
cd spring-native-beta
Es el mismo ejemplo de rest-api utilizado en la documentación de Spring Native pero con todas las modificaciones necesarias para ambas construcciones.
Con Buildpacks
Nos permite construir y ejecutar con una sola línea de comandos
mvn spring-boot:build-image
Funcionó de forma inmediata, como es habitual en el ecosistema de Spring.
La primera vez tardó 30 minutos en terminar el proceso.
Puedes ir a descansar…
Tened en cuenta que las próximas construcciones deberían ir a patadas porque ya tenemos algunas cosas de buildpacks/docker hechas.
Después de eso, ejecútalo:
docker run --rm -p 8080:8080 rest-service-complete:0.0.1-SNAPSHOT
Y comprueba que funciona: http://localhost:8080/greeting debería devolver
{"id":1,"content":"Hello, World!"}
Con herramientas Native Build
Usaremos el mismo proyecto pero instalando graalvm directamente. Necesitarás sdkman (opción recomendada) para instalar graalvm, y las extensiones nativas del jdk.
sdk install java 21.2.0.r8-grl
sdk use java 21.2.0.r8-grl
gu install native-image
Paquete de aplicación nativa:
mvn -Pnative -DskipTests package
Ejecútalo:
./target/spring-native-beta
Y comprueba que funciona: http://localhost:8080/greeting debería devolver
{"id":1,"content":"Hello, World!"}
Spring se adelanta
Podemos configurar algunas opciones de Spring AOT para reducir la huella, algunas ya están desactivadas/activadas por defecto.
Native hints
Debemos utilizar los native hints para solucionar algunos problemas:
- Bibliotecas no compatibles con Spring Native
- Define cualquier reflejo que necesite tu aplicación o cualquier biblioteca (como Jackson)
El plugin AOT nativo de Spring generará todos los *.properties & *.json archivos de configuración necesarios en META-INF/native-image.
Esta configuración específica para nuestra aplicación podría establecerse como archivos de propiedades o con anotaciones (ver proyecto spring-native-configuration).
Repositorio de muestras
En este ejemplos de repositorios de fuentes podemos comprobar «el estado del arte», de varios aspectos, que cualquier aplicación nativa de Spring podría necesitar (herramientas de construcción, agentes, librerías, módulos de Spring, etc).
La aplicación web Pet Clinic integra algunos de ellos.
Opciones de imágenes nativas
Algunas opciones de GraalVM vienen por defecto en Spring, y otras se llaman «Opciones útiles«. Y entre ellas destacaré la –enable-https que debemos especificar si tenemos que servir a través de este protocolo.
Agente de rastreo
Parece ser una «gran» herramienta que ayudará a generar todos los Native Hints necesarios para nuestras nuevas aplicaciones o librerías que podríamos utilizar.
Versión 0.11
En esta nueva versión, se ha cambiado el motor AOT, consiguiendo:
- mejor arranque & mejoras de memoria, mejoras de compatibilidad, pero menos flexibilidad en tiempo de ejecución.
- un nuevo plugin de arquitectura llamado «Puntos de extensión» que permite configurar programáticamente las sugerencias de AOT.
- Nuevo “soporte de testeo AOT” con Junit5 y graalvm native-build-tools (mockito aún no es compatible).
- Otros…
Spring ya está planeando «Soporte nativo de Spring Boot 3» que integrará esta nueva versión en los estándares.
Author
-
15 years as a technical/functional analyst and java backend engineer. 8 years: backend/full-stack SOLID architecture designs and POC's implementations… leading & mentoring dev teams in best practices
Ver todas las entradas