Table of Contents
Debido al actual paradigma de servidor de microservicios & los costes del servidor correspondientes al consumo de recursos, Quarkus es un framework que me llamó la atención hace algunos años, ya que resuelve los problemas del lenguaje JVM en estas preocupaciones. En este artículo encontrarás ejemplos y explicaciones de Quarkus GraalVM. Vamos a crear una aplicación básica Quarkus REST-API & crear una imagen nativa con GraalVM. También mencionaremos algunas alternativas existentes a Quarkus.
Quarkus GraalVM
El proyecto Quarkus generado para este artículo se puede encontrar en nuestro repositorio GitHub.
GraalVM
GraalVM es una máquina virtual universal para ejecutar aplicaciones escritas en JavaScript, Python, Ruby, R, lenguajes basados en JVM como Java, Scala, Groovy, Kotlin, Clojure, y lenguajes basados en LLVM como C y C++.
Proyecto Quarkus
Este marco está diseñado para:
- minimizar el tamaño de los archivos jar generados.
- menor uso de la memoria.
- inicio más rápido de la aplicación.
Algunas métricas del sitio oficial:
Todas estas mejoras se pueden conseguir gracias a lo siguiente:
- Uso de GraalVM: construcción de imágenes nativas
- Procesamiento de metadatos en tiempo de construcción: elimina las clases no utilizadas
- Reducción del uso de la programación reflexiva
- Native Image Pre Boot: preinicia la imagen tanto como sea posible en tiempo de construcción serializando el estado en el ejecutable.
Ten en cuenta que para los proyectos java se soporta jdk8 pero jdk11 es el por defecto desde la versión 1.13. También Quarkus adopta la https://12factor.net/ que es básica en el desarrollo de software moderno.
LICENCIA: bajo laLicencia de Software Apache 2.0 o licencia compatible.
Documentación y Guías
La documentación en la página oficial de Quarkus es bastante completa y con muchas guías para implementaciones e integraciones específicas. También puedes consultar el repositorio github de Quarkus y la wiki.
Cómo poner en marcha un proyecto
Tenemos varias opciones para iniciar un nuevo proyecto:
- Usando https://code.quarkus.io/ (similar al inicializador de Spring) para arrancar las dependencias de tu proyecto & arquetipo. Algunas extensiones están en estado de vista previa o experimental, así que ten cuidado.
- Con los arquetipos oficiales de quarkus maven en github.
- A través de la línea de comandos con el maven (o gradle) plugin.
- Con los plugins de IDE Quarkus (por ejemplo, para Intellij ya está incluido).
Ejemplo sencillo
Vamos a empezar con un ejemplo sencillo sobre cómo crear, construir & ejecutar un proyecto con el sitio web de inicio. Primero seleccionamos algunos paquetes y descargamos el proyecto como un zip:
El sitio web de inicio de Quarkus te ayuda con alguna información sobre cómo proceder:
Ahora vamos a moverlo a una carpeta adecuada:
mkdir ~/projects/articles
mv ~/Downloads/quarkus-basic ~/projects/articles/quarkus-basic
cd ~/projects/articles/quarkus-basic
Ahora puedes importar el proyecto en tu IDE. Revisa el README.md y algunos ejemplos de código generado por la página del inicializador.
Construir y ejecutar el proyecto
Asegúrate de usar jdk11:
# With sdk-man (use or install):
sdk use java 11.0.10.hs-adpt
# Build & run with maven
./mvnw compile quarkus:dev
Esto debería mostrar algunos registros en la terminal:
Comprueba la Dev UI y el end-point de la aplicación.
Construir la imagen nativa con la imagen docker de GraalVM
Podemos usar maven-quarkus-plugin para usar una GraalVM dockerizada para crear una imagen nativa de nuestra aplicación.
NOTA: En MacOS11.3 con la versión de docker (20.10.5) no funcionaba, me daba un error de falta de memoria al empaquetar en nativo. Intenté poner quarkus.native.native-image-xmx=6g en el application.properties para poner algo de memoria extra para el heap de Java (ver docs), pero tampoco funcionó. Funciona out-of-the-box en un Ubuntu 20.04.2 LTS.
Y ahora ejecuta lo siguiente en la terminal para generar la imagen nativa:
./mvnw package -Pnative -Dquarkus.native.container-build=true
El quarkus-maven-plugin tardará unos 3 minutos en empaquetar nuestro pequeño proyecto:
Y el uso de memoria (y cpu) es bastante grande:
Como podemos ver, el runner generado en la carpeta de destino es bastante pequeño comparado con los jars generados por Spring:
Puedes ejecutar la aplicación nativa desde tu terminal:
./target/quarkus-basic-1.0.0-SNAPSHOT-runner
Como se puede ver en la imagen de abajo se inicia muy rápidamente (menos de 1 segundo la primera vez y 0,030s segunda vez):
Conclusión
Quarkus + GraalVM es genial para proyectos de microservicios pequeños por todas las mejoras de rendimiento que aporta en la escena, pero estas mejoras disminuyen tanto como aumenta el tamaño del proyecto.
También hay que tener en cuenta que el rendimiento en las aplicaciones de Quarkus podría verse afectado por el uso de algunas bibliotecas de Quarkus que necesitan algunas mejoras de rendimiento/recursos.
Las alternativas actuales son:
Links
Oficial de Quarkus:
- Proyecto Quarkus github.
- Sitio web del inicializador de aplicaciones Quarkus.
- ¡Consulta las guías de Quarkus!
- Repositorio de artefactos maven de las semillas de la aplicación Quarkus.
Más información:
- InfoQ: Starting Fast: Investigating Java’s Static Compilation Landscape.
- DZone: AOT compilation.
- DZone: Quarkus vs Spring Boot.
- BetterProgramming: Java Microservice Frameworks.
- Medium: SpringBoot vs Quarkus: a Real-Life Experiment.
- Medium: Faster, Lower, Better with Quarkus in k8s
Si necesitas ayuda con este tipo de proyectos, ¡háznoslo saber! ¡Somos expertos en desarrollo de software!
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