Nota:

Introducción a GraalVM en Ampere A1 en Oracle Cloud Infrastructure

En este tutorial se describe cómo empezar a utilizar GraalVM en la plataforma de recursos informáticos de Ampere A1 en Oracle Cloud Infrastructure (OCI). Primero ejecutará una aplicación Spring Boot en el modo JVM y, a continuación, creará y ejecutará una aplicación Micronaut.io como binario nativo. Puede utilizar GraalVM para mejorar el rendimiento de las aplicaciones existentes y crear aplicaciones políglotas ligeras para la nube. Es un complemento ideal para las unidades de computación Ampere A1, que ofrecen escalabilidad lineal y una relación precio-rendimiento incomparable.

La plataforma de cálculo Ampere A1 basada en las CPU Ampere Altra representa un cambio generacional para empresas y desarrolladores de aplicaciones que crean cargas de trabajo que pueden escalar desde dispositivos de borde a centros de datos en la nube. El diseño exclusivo de esta plataforma proporciona un rendimiento consistente y predecible, ya que no hay ninguna contención de recursos dentro de un núcleo de recursos informáticos y ofrece más aislamiento y seguridad. Esta nueva clase de unidades de computación en Oracle Cloud Infrastructure proporciona una plataforma sin igual que combina la potencia de las CPU Altra con la seguridad, la escalabilidad y el ecosistema de servicios en OCI.

Introducción

¿Qué es GraalVM?

GraalVM es un tiempo de ejecución de alto rendimiento para aplicaciones escritas en Java, JavaScript, lenguajes basados en LLVM, como C y C++, y otros lenguajes dinámicos. Mejora considerablemente el rendimiento y la eficiencia de las aplicaciones, por lo que puede ayudarle a ejecutar sus aplicaciones existentes de forma más eficiente en plataformas en la nube.

GraalVM también crea binarios ejecutables nativos (imágenes nativas) para aplicaciones basadas en JVM existentes. La imagen nativa resultante contiene todo el programa en formato de código de máquina para la ejecución inmediata y evita el inicio y el espacio de memoria de la propia JVM. Esta capacidad hace que GraalVM sea ideal para crear aplicaciones en la nube y varios marcos de microservicios para lenguajes de JVM incluyen esta capacidad hoy en día.

Objetivos

En este tutorial:

Requisitos

  1. Cuenta gratuita de Oracle (Trial), pagada o LiveLabs Cloud
  2. Familiaridad con la consola de OCI
  3. Visión general de Networking
  4. Conocimientos de los compartimentos
  5. Conocimiento básico conceptual de contenedores y Podman

Configurar entorno en la nube

Empezará por iniciar el entorno en la nube de Oracle que se utilizará para crear y desplegar la aplicación Java EE. Este entorno se incluirá en un compartimento en la nube y la comunicación dentro del compartimento se realizará a través de una red virtual en la nube (VCN). El compartimento y la VCN aislarán y protegerán el entorno general. Creará una instancia informática Ampere A1 para instalar y ejecutar sus aplicaciones con GraalVM Enterprise Edition.

Configuración básica de la infraestructura de OCI

  1. Abra el menú de navegación. En Gobernanza y administración, vaya a Identidad y haga clic en Compartimentos. En esta pantalla, verá una lista de compartimentos, haga clic en Crear compartimento.

  2. Introduzca lo siguiente:

    • Nombre: introduzca "AppDev".
    • Descripción: introduzca una descripción (necesaria), como "AppDev compartimento para el tutorial de introducción". Evite introducir información confidencial.
    • Compartimento principal: seleccione el compartimento en el que desea que resida este compartimento. Se define por defecto en el compartimento raíz (o arrendamiento).
    • Haga clic en Crear compartimento.
    • El compartimento se muestra en la lista.

Crear instancia informática A1 de Ampere

  1. Para crear una instancia informática de Ampere A1, utilice el menú de navegación situado en la esquina superior izquierda de la consola y vaya a Recursos informáticos > Instancias.

  2. Abra el flujo de creación de instancias.

    1. Verifique que está en el compartimento AppDev
    2. Haga clic en Crear instancia.
  3. En la página de creación de instancia, creará la nueva instancia junto con los nuevos recursos de red, como la red virtual en la nube (VCN), el gateway de Internet (IG) y mucho más.

    1. Asigne a la instancia el nombre GraalVMApp
    2. Actualice la selección de imagen para utilizar Oracle Linux 7.9.
    3. Haga clic en el botón Cambiar unidad para ver las unidades de computación disponibles.

    Crear InstanciaDescripción de la ilustración Crear instancia

  4. Configure la imagen para la instancia.

    1. Haga clic en el botón Cambiar imagen para ver las imágenes de sistema operativo disponibles.
    2. Seleccione Oracle Linux 7.9.

    Elija Oracle Linux 7.9Descripción de la ilustración Seleccione Oracle Linux 7.9

  5. Configure los recursos para la instancia.

    1. Elija el procesador basado en Ampere Arm en la elección para series de formas.
    2. Seleccione la unidad VM.Standard.A1.Flex de la lista de unidades con procesadores basados en Ampere Arm. Las unidades Ampere A1 son flexibles y puede modificar el número de núcleos y la cantidad de memoria. Seleccione 1 núcleo y 6 GB de memoria para la VM.

    Elegir unidadDescripción de la ilustración Choose Shape

  6. Seleccione las opciones de red. Cree una nueva VCN y subred para su próximo despliegue en la nube. Asegúrese de asignar una dirección IP pública para su instancia.

  7. Genere y descargue el par de claves SSH. Este paso es opcional, pero se recomienda realizar tareas de mantenimiento y actualizaciones posteriores. También puede traer su clave pública si ya tiene un par de claves que desea utilizar. Si desea saber cómo generar claves SSH, siga las instrucciones del tutorial Generar claves SSH.

    Opciones de RedDescripción de la ilustración Opciones de red

  8. Haga clic en Crear para crear los recursos de red e iniciar la instancia informática. iniciar instanciaDescripción de la instancia de inicio de ilustración

Exponer puertos de aplicación a usuarios

Para que se pueda acceder a las aplicaciones desde Internet, debe abrir los puertos que utilizará nuestra aplicación. En esta sección, configurará listas de seguridad en la red en la nube y reglas de firewall en la instancia informática para que las aplicaciones puedan enviar y recibir tráfico.

Configuración de la red virtual en la nube (VCN)

Una lista de seguridad actúa como un firewall virtual para una instancia, con reglas de entrada y salida que especifican los tipos de tráfico permitidos que entran en la instancia y salen de esta. Listas de seguridad configuradas en el nivel de subred, que aplican las reglas de seguridad a todos los elementos de red de esa subred. La red incluye una lista de seguridad predeterminada, que contiene un conjunto inicial de reglas. La lista de seguridad por defecto permite conectarse a su instancia mediante SSH y, para que su instancia realice llamadas de red salientes a cualquier destino.

Configuración de la lista de seguridad para exponer puertos de aplicación

  1. Navegue a la página de detalles de la instancia que ha creado. Recursos informáticos > Instancias > Haga clic en la instancia que ha creado

  2. Navegue a la subred a la que está asociada la instancia haciendo clic en la subred seleccionar subred Descripción de la ilustración Seleccionar subred.

  3. En la página de subred, haga clic en la lista de seguridad por defecto para ver los detalles y configurarlo.

  4. Haga clic en "Agregar regla de entrada" para agregar una nueva regla que permita el tráfico entrante que coincida con las reglas.

  5. Agregar una regla de entrada para permitir el tráfico entrante en el puerto 8080

    1. Defina el CIDR de origen en 0.0.0.0/0. Esto permite el tráfico entrante de todos los orígenes.
    2. Establezca Destination Port Range (Rango de puertos de destino) en 8080. De esta forma, el destino solo se define en el puerto 8080. La regla ahora permite que el tráfico de todos los orígenes utilice el puerto 8080. Esto es lo que necesitamos, para que se pueda acceder a nuestra aplicación desde cualquier lugar.
    3. Proporcione una descripción Agregar regla de entrada Descripción de la ilustración Agregar regla de entrada

Configure la instancia

Las reglas del firewall controlan el tráfico de nivel de paquetes de entrada y salida de una instancia. Las reglas de firewall se configuran directamente en la propia instancia y proporcionan un nivel adicional de seguridad.

  1. Navegue a la página de detalles de la instancia que ha creado. Recursos informáticos > Instancias > Haga clic en la instancia que ha creado
  2. Copie la dirección IP pública de la instancia.
  3. Conéctese a la instancia mediante SSH. Utilice la clave generada por usted o proporcionada durante el paso de creación de la instancia. El nombre de usuario por defecto para las instancias que utilizan el sistema operativo Oracle Linux es opc.
  4. Ejecute los comandos de configuración del firewall. Esto modifica el firewall en la propia instancia para exponer el puerto 8080 y aceptar el tráfico entrante.

    sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp
    sudo firewall-cmd --reload
    

Instalar y utilizar GraalVM Enterprise Edition en Ampere A1

OCI ofrece Oracle GraalVM Enterprise Edition gratis a sus clientes. El soporte de GraalVM Enterprise se incluye en la suscripción a Oracle Cloud. La combinación de unidades de recursos informáticos de alto rendimiento y GraalVM Enterprise en OCI proporciona una plataforma atractiva para aplicaciones empresariales tanto nuevas como existentes.

  1. Navegue a la página de detalles de la instancia que ha creado. Recursos informáticos > Instancias > Haga clic en la instancia que ha creado.
  2. Copie la dirección IP pública de la instancia.
  3. Inicie sesión en la instancia con SSH. Utilice la clave que ha generado o proporcionado durante el paso de creación de la instancia. El nombre de usuario por defecto para las instancias que utilizan el sistema operativo Oracle Linux es opc.

Para instalar GraalVM y Git en OCI, ejecute el siguiente comando:

sudo yum install graalvm21-ee-11 git

Una vez instalado, GraalVM está disponible en el directorio /usr/lib64/graalvm.

Ejecución de aplicaciones Java existentes en GraalVM

GraalVM incluye un JDK y, por defecto, sustituye el compilador de Java JIT de nivel superior por el compilador de GraalVM. El nuevo e innovador compilador de GraalVM puede mejorar el rendimiento de las aplicaciones de lenguaje JVM existentes. Después de instalar GraalVM, el tiempo de ejecución java está disponible en el sistema y puede comprobar la versión con el siguiente comando.

java -version

java version "11.0.10" 2021-01-19 LTS
Java(TM) SE Runtime Environment GraalVM EE 21.0.0.2 (build 11.0.10+8-LTS-jvmci-21.0-b06)
Java HotSpot(TM) 64-Bit Server VM GraalVM EE 21.0.0.2 (build 11.0.10+8-LTS-jvmci-21.0-b06, mixed mode, sharing)

Como ejemplo de una aplicación Java existente, podemos ejecutar la aplicación de ejemplo Spring PetClinic, creada con Spring Boot.

  1. Clone el repositorio para comenzar.

    git clone https://github.com/spring-projects/spring-petclinic.git
    
  2. Cree y ejecute la aplicación.

    cd spring-petclinic
    ./mvnw spring-boot:run 
    

    La primera vez que ejecuta la aplicación, Maven descarga las dependencias. Puede tardar varios minutos antes de que finalicen las descargas. Aparece una salida similar a la siguiente:

    2021-03-05 18:11:28.447  INFO 3704 --- [           main] o.s.s.petclinic.PetClinicApplication     : No active profile set, falling back to default profiles: default
    2021-03-05 18:11:31.531  INFO 3704 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
    2021-03-05 18:11:31.697  INFO 3704 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 144 ms. Found 4 JPA repository interfaces.
    2021-03-05 18:11:33.436  INFO 3704 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
    2021-03-05 18:11:33.720  INFO 3704 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
    2021-03-05 18:11:33.721  INFO 3704 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5133 ms
    2021-03-05 18:11:34.797  INFO 3704 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
    2021-03-05 18:11:34.902  INFO 3704 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.28.Final
    2021-03-05 18:11:34.983  INFO 3704 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
    2021-03-05 18:11:35.266  INFO 3704 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect
    2021-03-05 18:11:36.838  INFO 3704 --- [           main] o.h.tuple.entity.EntityMetamodel         : HHH000157: Lazy property fetching available for: org.springframework.samples.petclinic.owner.Owner
    2021-03-05 18:11:37.094  INFO 3704 --- [           main] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
    2021-03-05 18:11:37.112  INFO 3704 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'
    2021-03-05 18:11:38.696  INFO 3704 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
    2021-03-05 18:11:40.604  INFO 3704 --- [           main] o.s.b.a.e.web.EndpointLinksResolver      : Exposing 13 endpoint(s) beneath base path '/actuator'
    2021-03-05 18:11:40.758  INFO 3704 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
    2021-03-05 18:11:40.783  INFO 3704 --- [           main] o.s.s.petclinic.PetClinicApplication     : Started PetClinicApplication in 13.846 seconds (JVM running for 14.906)
    

    La aplicación se inicia en unos 14 segundos. Como puede ver, GraalVM contiene un JDK completo y puede ser un sustituto inmediato de su JVM existente.

    Para obtener más información sobre los indicadores de optimización disponibles para GraalVM, consulte la documentación aquí.

Creación de imágenes nativas rápidas

GraalVM puede crear binarios ejecutables independientes a partir de sus aplicaciones Java, que pueden ejecutarse de forma increíble. La compilación anticipada de GraalVM del código Java procesa todas las clases de aplicación, dependencias y bibliotecas de tiempo de ejecución, y elimina la sobrecarga y el espacio de una JVM en sí. Sin embargo, algunas funciones de lenguaje avanzadas, como los proxies de tiempo de ejecución y la reflexión, requieren una configuración adicional. Muchos marcos Java de microservicios, como Micronaut, Helidon y Quarkus, soportan la creación inmediata de imágenes nativas.

  1. Para iniciar, instale las herramientas de imágenes nativas. Estos paquetes están disponibles en los repositorios de yum para OCI, pero no están instalados por defecto.

    cd ~
    sudo yum install  graalvm21-ee-11-native-image
    

    Para este tutorial, estamos utilizando Micronaut para crear la aplicación porque Micronaut utiliza una inyección de dependencia y un tiempo de ejecución orientado a aspectos que no utiliza la reflexión.

  2. Genere un nuevo proyecto sobre el uso de micronaut.io/launch mediante los siguientes comandos para comenzar:

    curl --location --request GET 'https://launch.micronaut.io/create/default/com.example.graal-on-arm?lang=JAVA&build=MAVEN&test=JUNIT&javaVersion=JDK_11&features=graalvm' --output graal-on-arm.zip
    unzip graal-on-arm.zip -d graal-on-arm
    cd graal-on-arm
    
  3. Ejecute la aplicación para ver cuánto tiempo tarda en iniciarse en JVM:

    ./mvnw mn:run
    

    Aparece una salida similar a la siguiente:

    __  __ _                                  _
    |  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_
    | |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
    | |  | | | (__| | | (_) | | | | (_| | |_| | |_
    |_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
      Micronaut (v2.5.3)
    
    09:59:34.504 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 755ms. Server Running: http://localhost:8080
    

    La aplicación comienza en 755 milisegundos, lo que es impresionante.

  4. Ahora, cree una imagen nativa para la aplicación y compare el tiempo de inicio:

    ./mvnw package -Dpackaging=native-image
    

    Se tarda aproximadamente 5 minutos en crear la imagen nativa. Una vez creada, la imagen nativa se coloca en el directorio target y se le asigna un nombre con el nombre del proyecto.

  5. Ejecute la imagen nativa.

    ./target/graal-on-arm
    

    Aparece una salida similar a la siguiente:

    __  __ _                                  _
    | |  \/  (_) ___ _ __ ___  _ __   __ _ _   _| |_
    | |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __|
    | |  | | | (__| | | (_) | | | | (_| | |_| | |_
    |_|  |_|_|\___|_|  \___/|_| |_|\__,_|\__,_|\__|
      Micronaut (v2.5.3)
    
    09:59:18.558 [main] INFO  io.micronaut.runtime.Micronaut - Startup completed in 18ms. Server Running: http://localhost:8080
    

La imagen naive es más de 40 veces más rápida, comenzando en solo 18 milisegundos.

La conclusión clave aquí es que, independientemente de lo sencillo o complejo que sea su aplicación, las imágenes nativas de GraalVM pueden ofrecerle un aumento inmediato del rendimiento. GraalVM Enterprise, Oracle Cloud Infrastructure, junto con las últimas unidades de computación basadas en el brazo, proporciona una plataforma incomparable para crear y desarrollar las cargas de trabajo empresariales.

Agradecimientos

Author: Jeevan Joseph

Más recursos de aprendizaje

Explore otras prácticas en docs.oracle.com/learn o acceda a contenido de aprendizaje más gratuito en el canal YouTube de Oracle Learning. Además, visite education.oracle.com/learning-explorer para convertirse en un explorador de formación de Oracle.

Para obtener documentación sobre los productos, visite Oracle Help Center.