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.
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.
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:
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.propertiespara 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:
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.
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
Apiumhub reúne a una comunidad de desarrolladores y arquitectos de software para ayudarte a transformar tu idea en un producto potente y escalable. Nuestro Tech Hub se especializa en Arquitectura de Software, Desarrollo Web & Desarrollo de Aplicaciones Móviles. Aquí compartimos con usted consejos de la industria & mejores prácticas, basadas en nuestra experiencia.