注:

TASK 5:构建 Micronaut 应用的本地映像并部署到 Oracle Cloud

在此实验室中,您将了解如何使用 GraalVM Native Image 将 Java 应用转换为原生 Linux 可执行文件。之后,将其部署到 Oracle Cloud 中的虚拟机。

估计时间:20 分钟

任务内容

在本任务中,您将执行以下操作:

步骤 1:在 Oracle Cloud 中的 JVM 上运行 Micronaut 应用程序

在此步骤中,您将传统上在 Oracle Cloud 中的 JVM(从 JAR 文件)上部署 Micronaut 应用程序。您将继续使用 VS 代码,其中 GraalVM Enterprise 22.0.0 设置为默认 JDK。

  1. 依次转到 TerminalNew Terminal(新建终端),然后运行以下命令来验证 Java 版本:

    java -version
    

    每次调用 java 命令时,将应用在 GraalVM Enterprise 中默认启用的优化 Graal JIT 编译器。

  2. 您可以将 Java 项目打包到可运行的 JAR 文件中,然后从 VS 代码终端或调用 Run Main 操作启动应用程序。

    • 依次转到终端新建终端并运行 mn:run 目标:

      ./mvnw mn:run
      

      如果使用 Gradle,请执行 run 任务:

      ./gradlew run
      
    • 或者,在 VS Code 中找到 Application.java 类文件,单击 main 方法上方的 Run Main

      运行 Main 方法快速操作

      应用程序在端口 8080 上启动。请注意启动它所花费的时间(预计以 ~6500 毫秒开始)。

  3. 终止应用程序:

    CTLR +C
    

步骤 2:构建 Micronaut 应用程序的本地 Linux 可执行文件

您可以使用 GraalVM Native Image 将任何 Java 应用转换为原生可执行文件。它是一种提前期的编译技术,允许您将 Java 字节码转变为不需要 JDK 运行且设计为在特定目标环境中执行且自包含的本机二进制文件。

如前所述,为了方便用户使用,您的虚拟机上预安装了 GraalVM Enterprise 22。本机映像与所有从属库(例如 libstdc++-staticglibczlib 等)一起添加。native-image 实用程序放置在 GraalVM 安装目录 ($JAVA_HOME/bin) 中。

  1. 在 VS Code Terminal(VS 代码终端)窗口中,验证 Native Image 版本:

    native-image --version
    
  2. 运行以下单个命令以构建本机 Linux 可执行文件:

    • 如果使用的是 Maven,请指定 native-image 打包格式:

    ./mvnw clean package -Dpackaging=native-image
    
    • 如果使用 Gradle,请执行 nativeImage 任务:

    ./gradlew nativeCompile
    

    经过一段时间后,称为 ocidemo 的本机可执行文件将内置到 /target/native-image/ 目录中。如果使用 Gradle,则名为 ocidemo 的可执行文件将写入 /build/native/nativeCompile/ 文件夹。

    注意:生成可执行文件所需的时间取决于应用程序大小和复杂性,可能需要花费一些时间来运行低功率的 VM。使用为此实验分配的 VM 实例的容量,预计时间约为 5 分钟。

GraalVM Native Image 将创建一个可执行文件,其中包含所有应用程序类、从属库类、从属 JDK 类和应用程序堆的快照。虽然构建原生映像可能需要一些时间,但其优势包括启动时间大幅缩短和整体内存使用量降低。

第 3 步:在 OCI 中部署 Micronaut 应用

在上一步中,您创建了 Micronaut 应用程序的本机 Linux 可执行文件。现在,您将在 Oracle Cloud 中部署此原生可执行文件,并在从 JAR 文件和本地映像运行同一应用程序时比较启动时间。

要将应用程序部署为本地可执行文件,请调用在上一步中生成的二进制文件:

./target/ocidemo

./build/native/nativeCompile/ocidemo

请注意,从步骤 1 中的 JAR 文件启动此 Micronaut 微服务作为本机映像需要比从 ~6500 毫秒跳至 2500 倍快得多。它的启动速度更快,因为可执行文件是自包含的二进制文件,不需要 JDK 运行,因此可以轻松地分发应用。文件大小也相当小。

将 Java 微服务部署为原生可执行文件有助于实现即时启动、降低 CPU 和内存使用量,使 GraalVM 企业版成为构建云原生 Java 应用和云部署的理想人选。

此时应用程序运行成功,但是要访问它(例如,从浏览器访问),您需要允许传入到虚拟机的流量。终止应用程序 CTRL+C,然后继续执行下一步。

步骤 4:配置防火墙以允许流量流入云实例(可选)

要验证此服务器端应用程序是否在 Oracle Cloud 中运行并在浏览器中打开,您需要确保主机防火墙允许流量流入虚拟机。

  1. 返回到云控制台,依次导航到计算实例

  2. 登录到 OCI 控制台后,导航到计算并单击实例。确保您处于必要的区间(请参见任务 1、步骤 3)。

    查找计算实例

  3. 在主视图中查找 VM 实例(以 graal-workshop-... 开头的名称),然后将其打开。

  4. 主要 VNIC 部分中,单击实例所附加到的子网 (subnet-01)。

  5. 在子网页上,单击内部安全列表

  6. 添加入站规则并填写以下数据。

    添加入站规则以允许传入到端口的流量

    该规则允许来自所有源的通信使用端口 8080,以便可以从任何位置访问应用程序。

  7. 返回终端窗口,然后运行以下命令重新启动正在运行的 VM 实例中的防火墙。

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

    sudo systemctl reload firewalld
    
  8. 将应用程序作为本机可执行文件重新启动。

    使用 Maven 构建:

    ./target/ocidemo
    

    使用 Gradle 构建:

    ./build/native/nativeCompile/ocidemo
    
  9. 在浏览器中使用 http://<SERVER_IP>:8080/pets(适用于 /pet 端点)和 http://<SERVER_IP>:8080/owners(适用于 /owners 端点)打开应用程序。或者,拆分 VS 代码中的终端窗口并使用 curl 发送 GET 请求:

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

祝贺您!您已成功完成此实验。

了解更多

要结束此会话,请单击工具栏中的“结束会话”按钮。