備註:

開始在 Oracle Cloud Infrastructure 上的 Ampere A1 使用 GraalVM

本教學課程描述如何開始使用 Oracle Cloud Infrastructure (OCI) 中的 Ampere A1 運算平台上的 GraalVM。您首先會在 JVM 模式執行 Spring Boot 應用程式,然後建立並執行 Micronaut.io 應用程式作為原生二進位檔。您可以使用 GraalVM 改善現有應用系統的效能,並為雲端建立輕量型多語言應用系統。這是 Ampere A1 運算資源配置理想的隨附,提供線性擴展性和絕佳的性價比。

以 Ampere Altra CPU 為基礎的 Ampere A1 運算平台就是建置能夠從邊緣裝置擴展到雲端資料中心的企業和應用程式開發人員世代的班別。此平台的獨特設計提供一致且可預測的效能,因為運算核心內沒有資源競爭優勢,並提供更隔離和安全性。Oracle Cloud Infrastructure 上的這個新類別運算資源配置提供一個無可比擬的平台,結合 Altra CPU 的強大功能和 OCI 上服務的安全、擴展性及生態系統。

簡介

什麼是 GraalVM?

GraalVM 是一個高效能的程式實際執行,適用於以 Java、JavaScript、LVM 型語言 (例如 C 和 C++) 撰寫的應用系統,以及其他動態語言。這個平台可大幅提升應用程式效能和效率,讓您能夠以更有效率的方式,在雲端平台上執行現有的應用系統。

GraalVM 也為現有的 JVM 型應用系統建置原生的可執行檔原生影像。產生的原生映像檔會以機器程式碼形式包含整個程式,以立即執行及避免 JVM 本身的啟動與記憶體佈局。此功能可讓 GraalVM 適合建置雲端原生應用系統,以及具備數種 JVM 語言微服務架構的功能,為您提供此功能。

目標

本教學課程將會:

必要條件

  1. Oracle Free Tier (Trial)、Payables 或 LiveLabs 雲端帳戶
  2. 熟悉 OCI 主控台
  3. 網路總覽
  4. 熟悉區間
  5. 容器與 Podman 的基本概念知識

設定雲端環境

首先,您可以從起始將用於建立及部署 Java EE 應用程式的 Oracle 雲端環境。此環境將包含在雲端區間中,而區間內的通訊將會透過虛擬雲端網路 (VCN)。區間和 VCN 會隔離並保護整體環境。您將會建立一個 Ampere A1 運算執行處理,使用 GraalVM Enterprise Edition 來安裝和執行您的應用程式。

基本 OCI 基礎架構設定

  1. 開啟導覽功能表。在「治理和管理」底下,前往識別,然後按一下區間。您可以在此畫面中看到區間清單,然後按一下建立區間

  2. 請輸入下列資訊:

    • 名稱:輸入 "AppDev「。
    • 描述:輸入描述 (必要),例如:「AppDev 區間的入門教學課程」。請避免輸入機密資訊。
    • 父項區間:選取此區間的區間。預設為根區間 (或租用戶)。
    • 按一下建立區間
    • 您的區間會顯示在清單中。

建立 Ampere A1 Compute 執行處理

  1. 若要建立 Ampere A1 運算執行處理,請使用主控台左上角的導覽功能表,然後前往運算 > 執行處理

  2. 開啟執行處理建立流程。

    1. 確認您在 AppDev 區間
    2. 按一下建立執行處理
  3. 在「建立執行處理」頁面中,您將建立新的執行處理,以及新的網路資源 (例如虛擬雲端網路 (VCN)、網際網路閘道 (IG) 及其他資源。

    1. 將執行處理命名為 GraalVMApp
    2. 更新映像檔選擇以使用 Oracle Linux 7。9。
    3. 按一下變更資源配置按鈕,即可查看可用的運算資源配置。

     建立執行處理建立執行處理圖解的描述

  4. 設定執行處理的映像檔。

    1. 按一下變更映像檔按鈕,即可查看可用的作業系統映像檔。
    2. 選擇 Oracle Linux 7。9

    選擇 Oracle Linux 7。9選擇 Oracle Linux 7。9 圖例的描述

  5. 設定執行處理的資源。

    1. 選擇資源配置系列選擇的 Ampere Arm 式處理器。
    2. 從配備 Ampere Arm 型處理器的資源配置清單中選擇 VM.Standard.A1.Flex 資源配置。Ampere A1 資源配置是具有彈性的,您可以修改核心數目和記憶體大小。為 VM 選擇 1 個核心和 6 GB 的記憶體。

    選擇資源配置選擇資源配置的描述

  6. 選擇您的網路選項。為您的下一個雲端部署建立新的 VCN 和子網路。確定已為您的執行處理指定公用 IP 位址。

  7. 產生並下載 SSH 金鑰組。此步驟是選擇性的,但強烈建議您使用稍後的維護與升級。如果您已經有要使用的鍵盤,也可以使用公用金鑰。如果要瞭解如何產生 SSH 金鑰,請遵循Generate SSH Keys tutorial 中的指示。

    網路選項網路選項圖的描述

  8. 按一下建立 (Create) ,建立網路資源並啟動運算執行處理。啟動實例啟動執行處理圖解描述

對使用者顯示應用程式連接埠

如果要從網際網路存取應用程式,您需要開啟應用程式將使用的連接埠。在本節中,您將在運算執行處理上的雲端網路和防火牆規則上設定安全清單,讓您的應用系統可傳送並接收流量。

設定您的虛擬雲端網路 (VCN)

安全清單扮演執行處理的虛擬防火牆,包括輸入和輸出規則,指定允許輸入和輸出的流量類型。安全清單會在子網路層次設定,套用安全規則至該子網路中的所有網路元素。您的網路隨附預設安全清單,其中包含一組初始規則。預設安全清單可讓您使用 SSH 連線至執行處理,以及讓執行處理對任何目的地進行外送網路呼叫。

設定安全清單以顯示應用程式連接埠

  1. 瀏覽您已建立之執行處理的執行處理詳細資訊頁面。運算 (Compute) > 執行處理 > 按一下您所建立的執行處理

  2. 按一下子網路 選取子網路 Select 子網路的描述,瀏覽至您執行處理所連附的子網路

  3. 在子網路頁面上,按一下預設安全清單即可檢視詳細資訊並加以設定。

  4. 按一下「新增傳入規則」即可新增規則,以允許符合規則的內送流量。

  5. 新增輸入規則,以允許連接埠 8080 上的內送流量

    1. 來源 CIDR 設為 0.0.0.0/0。這可讓來自所有來源的內送流量。
    2. 目的地連接埠範圍設為 8080。這會將目的地設為僅連接埠 8080。此規則現在允許來自所有來源的流量使用連接埠 8080。這是我們所需要的,因此我們的應用系統可以從任何地方取得。
    3. 提供描述 新增傳入規則 新增輸入規則圖解描述

設定您的執行環境

防火牆規則會控制進出執行處理的封包層次流量。您可以直接在執行處理上配置防火牆規則,並提供其他安全等級。

  1. 瀏覽您已建立之執行處理的執行處理詳細資訊頁面。運算 (Compute) > 執行處理 > 按一下您所建立的執行處理
  2. 複製執行處理的公用 IP 位址。
  3. 使用 SSH 連線至執行處理。請使用由您產生,或在執行處理建立步驟期間提供的金鑰。使用 Oracle Linux 作業系統之執行處理的預設使用者名稱為 opc
  4. 執行防火牆組態指令。這可修改執行處理本身中的防火牆,顯示連接埠 8080 並接受內送流量。

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

在 Ampere A1 上安裝及使用 GraalVM Enterprise Edition

OCI 可免費提供給客戶使用 Oracle GraalVM Enterprise Edition。Oracle Cloud 訂閱包含 GraalVM Enterprise 支援。OCI 上的高效能 Arm 式運算資源配置和 GraalVM Enterprise 結合,為現有和新企業應用系統提供令人注目的平台。

  1. 瀏覽您已建立之執行處理的執行處理詳細資訊頁面。運算 (Compute) > 執行處理 > 按一下您所建立的執行處理
  2. 複製執行處理的公用 IP 位址。
  3. 使用 SSH 登入執行處理。請使用您在執行處理建立步驟期間產生或提供的金鑰。使用 Oracle Linux 作業系統之執行處理的預設使用者名稱為 opc

若要在 OCI 上安裝 GraalVM 和 Git,請執行下列命令:

sudo yum install graalvm21-ee-11 git

在安裝之後,/usr/lib64/graalvm 目錄中提供 GraalVM。

在 GraalVM 上執行現有的 Java 應用程式

GraalVM 包含 JDK,它預設會使用 GraalVM 編譯器取代了最上層的 Java JIT 編譯器。新的創新 GraalVM 編譯器可提升您現有的 JVM 語言應用程式效能。安裝 GraalVM 之後,系統上有 java 程式實際執行,您可以使用下列命令檢查版本。

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)

作為現有 Java 應用程式的範例,我們可以執行 Spring PetClinic 範例應用程式,此範例應用程式以 Spring Boot 所建立。

  1. 複製儲存區域以開始作業。

    git clone https://github.com/spring-projects/spring-petclinic.git
    
  2. 建置及執行應用程式。

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

    您第一次執行應用程式時,Maven 會下載相依性。完成下載作業可能需要幾分鐘的時間。您應該會看到類似以下範例的輸出:

    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)
    

    應用程式約 14 秒後開始。如您所見,GraalVM 的完整 JDK 可以是一個替代您現有的 JVM。

    若要深入瞭解 GraalVM 提供的最佳化旗標,請參閱此處的說明文件。

建立刀鋒快速原生映像檔

GraalVM 可以從您的 Java 應用程式建立獨立的可執行二進位檔,極快可執行。Java 程式碼會事先編譯 GraalVM,會處理所有應用程式類別、相依性以及程式實際執行程式庫,並移除 JVM 本身的超載與佔用空間。不過,某些進階語言功能 (例如程式實際執行代理主機和反映) 需要其他組態。許多微服務 Java 架構,例如 MicronautHelidonQuarkus 都支援立即建置原生映像檔。

  1. 若要啟動,請安裝原生影像工具。這些套裝軟體位於 OCI 的 yum 儲存區域中,但預設為未安裝。

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

    在此自學課程中,由於 Micronaut 使用並不使用反射的相依性注射與外觀導向程式實際執行,因此我們使用 Micronaut 建置應用程式。

  2. 使用下面的命令使用 micronaut.io/launch 來產生新專案以開始:

    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. 執行應用程式以查看 JVM 上啟動應用程式所需的時間:

    ./mvnw mn:run
    

    您應該會看到類似以下範例的輸出:

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

    應用系統從 755 毫秒開始,難以置信。

  4. 現在,為應用程式建立原生影像並比較啟動時間:

    ./mvnw package -Dpackaging=native-image
    

    建立原生映像檔需要大約 5 分鐘。建立之後,原生影像會放置在 target 目錄中,並以專案名稱命名。

  5. 執行原生影像。

    ./target/graal-on-arm
    

    您應該會看到類似以下範例的輸出:

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

精簡影像從 18 毫秒開始超過 40 倍

不論您應用程式的簡單或複雜程度為何,GraalVM 原生映像檔均可大幅提升效能。Oracle Cloud Infrastructure 與最新的 Arm 式運算資源配置和 GraalVM 企業版結合,提供無與倫比的平台,用於建置和發展企業工作負載。

致謝

作者 - Jeevan Joseph

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或是存取更多免費學習內容至 Oracle Learning YouTube 通道。此外,瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請瀏覽 Oracle Help Center