Quarkus GraalVM. Supersonic Subatomic Java, Kotlin y Scala

Compartir esta publicación

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.
Screenshot 2021 05 28 at 13.40.51

Algunas métricas del sitio oficial:

Screenshot 2021 05 28 at 13.41.44

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.

  16 blogs que todo ingeniero DevOps debe leer

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:

Screenshot 2021 05 28 at 13.44.53

El sitio web de inicio de Quarkus te ayuda con alguna información sobre cómo proceder:

Screenshot 2021 05 28 at 13.45.54

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:

Screenshot 2021 05 28 at 13.48.29

Comprueba la Dev UI y el end-point de la aplicación.

Screenshot 2021 05 28 at 13.49.06

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.

  Entrevista con Ileana Diaz - Desarrolladora de Backend en Apiumhub

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:

Screenshot 2021 05 28 at 13.50.33

Y el uso de memoria (y cpu) es bastante grande:

Screenshot 2021 05 28 at 13.51.08

Como podemos ver, el runner generado en la carpeta de destino es bastante pequeño comparado con los jars generados por Spring:

Screenshot 2021 05 28 at 13.51.33

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

Screenshot 2021 05 28 at 13.52.24

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:

Más información:

  La deuda técnica en el desarrollo de software

Si necesitas ayuda con este tipo de proyectos, ¡háznoslo saber! ¡Somos expertos en desarrollo de software!

Author

  • David Garcia Folch

    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

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Suscríbete a nuestro boletín de noticias

Recibe actualizaciones de los últimos descubrimientos tecnológicos

¿Tienes un proyecto desafiante?

Podemos trabajar juntos

apiumhub software development projects barcelona
Secured By miniOrange