Hinweis:

TASK 5: Natives Image einer Micronaut-Anwendung erstellen und in Oracle Cloud bereitstellen

In dieser Übung lernen Sie, wie Sie Ihre Java-Anwendung mit GraalVM Native Image in eine native ausführbare Linux-Datei umwandeln. Anschließend stellen Sie sie auf einer virtuellen Maschine in Oracle Cloud bereit.

Voraussichtliche Zeit: 20 Minuten

Aufgabeninhalt

In dieser Aufgabe führen Sie folgende Schritte aus:

Schritt 1: Micronaut-Anwendung auf der JVM in Oracle Cloud ausführen

In diesem Schritt stellen Sie traditionell eine Micronaut-Anwendung auf der JVM (aus einer JAR-Datei) in Oracle Cloud bereit. Sie verwenden weiterhin VS-Code, wobei GraalVM Enterprise 22.0.0 als Standard-JDK festgelegt ist.

  1. Gehen Sie zu Terminal und dann zu New Terminal, und führen Sie diesen Befehl aus, um die Java-Version zu prüfen:

    java -version
    

    Bei jedem Aufruf des Befehls java wird der optimierte Graal JIT-Compiler angewendet, der standardmäßig in GraalVM Enterprise aktiviert ist.

  2. Sie können ein Java-Projekt in einer ausführbaren JAR-Datei verpacken und die Anwendung entweder über das VS-Code-Terminal starten oder die Aktion Haupt ausführen aufrufen.

    • Gehen Sie zu Terminal, Neues Terminal, und führen Sie das Ziel mn:run aus:

      ./mvnw mn:run
      

      Wenn Sie Gradle verwenden, führen Sie die Aufgabe run aus:

      ./gradlew run
      
    • Suchen Sie alternativ die Klassendatei Application.java im VS-Code, und klicken Sie über der Hauptmethode auf Haupt ausführen:

      Schnellaktion für Hauptmethode ausführen

      Die Anwendung wird auf Port 8080 gestartet. Beachten Sie die Zeit, die zum Starten benötigt wird (sie wird voraussichtlich in ~6500ms beginnen).

  3. Beenden Sie die Bewerbung:

    CTLR +C
    

Schritt 2: Erstellen Sie ein natives, ausführbares Linux-Programm einer Micronaut-Anwendung

Sie können jede Java-Anwendung mit GraalVM Native Image in eine native ausführbare Datei umwandeln. Es handelt sich um eine Kompilierungstechnologie im Voraus, mit der Sie Ihren Java-Bytecode in eine eigenständige native Binärdatei umwandeln können, die kein JDK zur Ausführung benötigt und für die Ausführung in einer bestimmten Zielumgebung konzipiert ist.

Wie bereits erwähnt, ist GraalVM Enterprise 22 auf Ihrer virtuellen Maschine vorinstalliert. Dasselbe ist ein natives Image, das mit allen abhängigen Librarys hinzugefügt wird (z.B. libstdc++-static, glibc, zlib usw.). Das Dienstprogramm native-image wird im GraalVM-Installationsverzeichnis ($JAVA_HOME/bin) abgelegt.

  1. Prüfen Sie im Fenster "VS Code Terminal" die Version des nativen Images:

    native-image --version
    
  2. Führen Sie diesen einzelnen Befehl aus, um eine native, ausführbare Linux-Datei zu erstellen:

    • Wenn Sie Maven verwenden, geben Sie das Packageformat native-image an:

    ./mvnw clean package -Dpackaging=native-image
    
    • Wenn Sie Gradle verwenden, führen Sie die Aufgabe nativeImage aus:

    ./gradlew nativeCompile
    

    Nach einiger Zeit wird eine native ausführbare Datei namens ocidemo in das Verzeichnis /target/native-image/ integriert. Wenn Sie Gradle verwenden, wird die ausführbare Datei ocidemo in den Ordner /build/native/nativeCompile/ geschrieben.

    Hinweis: Die Zeit zum Erstellen einer ausführbaren Datei hängt von der Anwendungsgröße und -komplexität ab und kann bei VMs mit niedriger Performance etwas länger dauern. Mit den für diese Übung zugewiesenen Kapazitäten der VM-Instanz beträgt die erwartete Zeit ca. 5 Minuten.

GraalVM Native Image erstellt eine ausführbare Datei mit allen Anwendungsklassen, abhängigen Bibliotheksklassen, abhängigen JDK-Klassen und einem Snapshot des Anwendungsheaps. Während der Aufbau eines nativen Images einige Zeit in Anspruch nehmen kann, bieten die Vorteile eine drastische Reduzierung der Startzeit und eine Verringerung des gesamten Speicherverbrauchs.

Schritt 3: Mikronaut-Anwendung in OCI bereitstellen

Im vorherigen Schritt haben Sie eine native Linux-Programmdatei der Micronaut-Anwendung erstellt. Jetzt stellen Sie diese native ausführbare Datei in Oracle Cloud bereit und vergleichen die Startzeiten, wenn Sie dieselbe Anwendung wie eine JAR-Datei und ein natives Image ausführen.

Um die Anwendung als native ausführbare Datei bereitzustellen, rufen Sie eine im vorherigen Schritt generierte Binärdatei auf:

./target/ocidemo

./build/native/nativeCompile/ocidemo

Beachten Sie, wie viel schneller es dauert, diesen Micronaut-Microservice als natives Image aus einer JAR-Datei in Schritt 1 zu starten (er sollte von ~6500 Millisekunden auf 2500 springen). Sie wird schneller gestartet, da die ausführbare Datei eine eigenständige Binärdatei ist und kein JDK zur Ausführung benötigt. Auf diese Weise können Anwendungen einfach verteilt werden. Die Dateigröße ist auch ziemlich klein.

Das Deployment eines Java-Microservice als native ausführbare Datei hilft bei der sofortigen Inbetriebnahme, niedrigeren CPU- und Speicherverbrauch. GraalVM Enterprise ist daher ein guter Kandidat für die Entwicklung cloud-nativer Java-Anwendungen und für Cloud-Deployments.

Die Anwendung wird zu diesem Zeitpunkt erfolgreich ausgeführt. Um beispielsweise über einen Browser auf die Anwendung zuzugreifen, müssen Sie eingehenden Traffic auf Ihre virtuelle Maschine zulassen. Beenden Sie die Anwendung, CTRL+C, und fahren Sie mit dem nächsten Schritt fort.

Schritt 4: Firewall für Traffic zu Ihrer Cloud-Instanz konfigurieren (optional)

Um diese serverseitige Anwendung in Oracle Cloud zu prüfen und in einem Browser zu öffnen, müssen Sie sicherstellen, dass die Hostfirewall den Datenverkehr in Ihre virtuelle Maschine zulässt.

  1. Kehren Sie zur Cloud-Konsole zurück, navigieren Sie zu Compute, Instanzen.

  2. Wenn Sie bei der OCI-Konsole angemeldet sind, navigieren Sie zu Compute, und klicken Sie auf Instanzen. Stellen Sie sicher, dass Sie sich im erforderlichen Compartment befinden (siehe Aufgabe 1, Schritt 3).

    Compute-Instanzen suchen

  3. Suchen Sie die VM-Instanz (Name, der mit graal-workshop-... beginnt) in der Hauptansicht, und öffnen Sie sie.

  4. Klicken Sie im Abschnitt Primäre VNIC auf Subnetz, an das Ihre Instanz angehängt ist (subnet-01).

  5. Klicken Sie auf der Seite "Subnetz" auf Interne Sicherheitsliste.

  6. Klicken Sie auf Ingress-Regel hinzufügen, und geben Sie die folgenden Daten ein.

    Ingress-Regel hinzufügen, um eingehenden Traffic an den Port zuzulassen

    Die Regel ermöglicht es Traffic von allen Quellen, Port 8080 zu verwenden, sodass die Anwendung von überall aus erreicht werden kann.

  7. Kehren Sie zum Terminalfenster zurück, und führen Sie die folgenden Befehle aus, um die Firewall in der ausgeführten VM-Instanz neu zu starten.

    sudo firewall-cmd --permanent --add-port=8080/tcp
    

    sudo systemctl reload firewalld
    
  8. Starten Sie die Anwendung als native ausführbare Datei neu.

    Mit Maven erstellt:

    ./target/ocidemo
    

    Mit Gradle erstellt:

    ./build/native/nativeCompile/ocidemo
    
  9. Öffnen Sie die Anwendung in einem Browser mit http://<SERVER_IP>:8080/pets für den /pet-Endpunkt und http://<SERVER_IP>:8080/owners für den /owners-Endpunkt. Alternativ können Sie das Terminalfenster im VS-Code teilen und eine GET-Anforderung mit curl senden:

    curl -i http://<SERVER_IP>:8080/pets
    

Vielen Dank! Sie haben diese Übung erfolgreich abgeschlossen.

Weitere Informationen

Um diese Session zu beenden, klicken Sie in der Symbolleiste auf die Schaltfläche "Session beenden".