搜尋
首頁Javajava教程帶有 GraalVM Native Image 的 Lambda 函數 - 使用自訂運行時開發和部署 Lambda 函數的部分內容

介紹

在本系列的第 1 部分中,我們介紹了 GraalVM,特別是它的 Native Image 功能。我們還解釋了它對無伺服器應用程式的好處。在本系列的這一部分中,我們將說明如何使用包含 GraalVM Native Image 的自訂執行階段來開發和部署 AWS Lambda 函數。

申請樣本

為了解釋起見,我們將使用我們的範例應用程式。在此應用程式中,我們將建立和檢索產品並使用 DynamoDB 作為 NoSQL 資料庫。我們將重複使用測量 Java 21 Lambda 冷啟動一文中介紹的應用程序,並將其調整為部署為包含 GraalVM 本機映像的 Lambda 自訂執行時間。

Lambda function with GraalVM Native Image - Part ow to develop and deploy Lambda function with custom runtime

常規設定

為了建構 GraalVM Native Image,我們需要執行以下操作:

  • 設定 m5.large AWS Cloud9 EC2 執行個體。您當然可以使用自己的(本地)Linux 環境。
  • 安裝SDKMAN
curl -s "https://get.sdkman.io" | bash  

source "/home/ec2-user/.sdkman/bin/sdkman-init.sh"
  • 安裝最新的 GraalVM 版本。我在範例中使用了版本 22(但您可以使用最新的版本):
sdk install java 22.0.1-graal  (or use the newest GraalVM version)
  • 安裝原生鏡像
sudo yum install gcc glibc-devel zlib-devel 
sudo dnf install gcc glibc-devel zlib-devel libstdc++-static
  • 安裝能夠使用已安裝的 GraalVM 版本進行建置的 Maven。我們需要能夠處理 Java 21 及更高版本原始程式碼的 Maven 版本。例如 :
wget https://mirrors.estointernet.in/apache/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz tar -xvf apache-maven-3.8.5-bin.tar.gz sudo mv apache-maven-3.8.5 /opt/

M2_HOME='/opt/apache-maven-3.8.5' 

PATH="$M2_HOME/bin:$PATH" 

export PATH

如果此鏡像不可用,請使用另一個適用於您的作業系統的鏡像。

使範例應用程式具有 GraalVM Native Image 功能

為了讓我們的範例應用程式作為 GraalVM Native Image 運行,我們需要聲明每次反射將實例化物件的所有類別。 AOT 編譯器在編譯時需要知道這些類別。這發生在reflect.json 中。 正如我們所看到的,我們需要在那裡聲明

  • 我們所有的 Lambda 函數,例如 GetProductByIdHandler 和 CreateProductHandler
  • 實體,例如產品和將從 JSON 負載轉換回來的產品
  • APIGatewayProxyRequestEvent 及其所有內部類,因為我們在 GetProductByIdHandler 和 CreateProductHandler 等 Lambda 函數中將此事件類型宣告為請求事件
  • org.joda.time.DateTime 將用於將時間戳與字串相互轉換,這是 APIGateway 代理請求和回應事件的一部分

為了避免在本機映像中的類別初始化一文中所述的初始化期間記錄器出現錯誤,我們需要在 native-image.properties 中新增 GraalVM Native Image 建置參數。

curl -s "https://get.sdkman.io" | bash  

source "/home/ec2-user/.sdkman/bin/sdkman-init.sh"

native-image.properties 應放置在 META-INF/native-image/${MavenGroupIid}/${MavenArtifactId}

當我們在 pom.xml 中使用 slf4j-simple Logger 時,我們需要將 native-image.properties 放在路徑 META-INF/native-image/org.slf4j/slf4j-simple 中。

Lambda 自訂運行時

為了將 Lambda 函數部署為自訂運行時,我們需要將所有內容打包到副檔名為 .zip 的檔案中,其中包含名為 bootstrap 的檔案。在我們的範例中,該檔案可以是 GraalVM 本機映像,也可以包含如何呼叫放置在另一個檔案中的 GraalVM 本機映像的說明。 讓我們來探索一下。

建構 GraalVM 本機鏡像

我們將在 pom.xml 中定義的套件階段自動建構 GraalVM Native 鏡像。 相關部分在以下插件中定義:

sdk install java 22.0.1-graal  (or use the newest GraalVM version)

我們使用org.graalvm.nativeimage工具中的native-image-maven-plugin,並在打包階段執行native-image。該插件需要主類別的定義,而 Lambda 函數沒有。這就是我們使用 Lambda Runtime GraalVM 並定義其主類別 com.formkiq.lambda.runtime.graalvm.LambdaRuntime 的原因。 Lambda 執行時期 GraalVM 是一個 Java 函式庫,可輕鬆地將用 Java 程式語言編寫的 AWS Lambda 轉換為 GraalVM。我們之前在 pom.xml 中將其定義為依賴

sudo yum install gcc glibc-devel zlib-devel 
sudo dnf install gcc glibc-devel zlib-devel libstdc++-static

然後,我們給出本機映像名稱aws-pure-lambda-java21-graalvm-native-image 並包含一些GraalVM 本機映像參數和先前定義的reflect.json

wget https://mirrors.estointernet.in/apache/maven/maven-3/3.8.5/binaries/apache-maven-3.8.5-bin.tar.gz tar -xvf apache-maven-3.8.5-bin.tar.gz sudo mv apache-maven-3.8.5 /opt/

M2_HOME='/opt/apache-maven-3.8.5' 

PATH="$M2_HOME/bin:$PATH" 

export PATH

為了將建置的 GraalVM Native Image 壓縮為 Lambda Custom Runtime 所需的 function.zip,我們使用 maven-assemble 外掛程式:

Args=--allow-incomplete-classpath \
    --initialize-at-build-time=org.slf4j.simple.SimpleLogger,\
      org.slf4j.LoggerFactory
    -- --trace-class-initialization=org.slf4j.simple.SimpleLogger,\
      org.slf4j.LoggerFactory

我們定義的finalName為function,id為native-zip我們也包含native.xml組件。此組件將檔案格式定義為zip(完整的檔案名稱將為${finalName}-${id}.zip,在我們的範例中為function-native-zip.zip),新增先前建構的GraalVM Native Image,其名稱為aws-pure-lambda-java21-graalvm-native-image 並添加已定義的引導程序,該引導程序基本上調用了GraalVM 本機映像:

<plugin>
      <groupid>org.graalvm.nativeimage</groupid>
      <artifactid>native-image-maven-plugin</artifactid>
      <version>21.2.0</version>
      <executions>
            <execution>
                  <goals>
                        <goal>native-image</goal>
                  </goals>
                  <phase>package</phase>
            </execution>
      </executions>
      <configuration>
            <skip>false</skip>
            <mainclass>com.formkiq.lambda.runtime.graalvm.LambdaRuntime</mainclass>
            <imagename>aws-pure-lambda-java21-graalvm-native-image</imagename>
            <buildargs>
                  --no-fallback
                  --enable-http
                  -H:ReflectionConfigurationFiles=../src/main/reflect.json
                </buildargs>
      </configuration>
</plugin>

最後,我們必須建立打包為 zip 檔案的 GraalVM 本機映像,該映像可以使用以下命令部署為 Lambda 自訂運行時:

<dependency>
   <groupid>com.formkiq</groupid>
   <artifactid>lambda-runtime-graalvm</artifactid>
   <version>2.3.1</version>
</dependency>

將 GraalVM 本機映像部署為 Lambda 自訂執行時間

在AWS SAM 範本中,我們將Lambda 運行時設定為provided.al2023(這是自訂運行時的最新版本),並提供先前建置的GraalVM Native Image function-native-zip的路徑。郵編。

  <buildargs>
    --no-fallback
    --enable-http
    -H:ReflectionConfigurationFiles=../src/main/reflect.json
 </buildargs>

現在我們準備好使用
部署我們的應用程式

curl -s "https://get.sdkman.io" | bash  

source "/home/ec2-user/.sdkman/bin/sdkman-init.sh"

結論

在本系列的這一部分中,我們解釋瞭如何使用包含 GraalVM Native Image 的自訂執行時間來開發和部署 AWS Lambda 函數。在本系列的下一部分中,我們將針對 Lambda 函數的不同記憶體設置,測量此類場景下 Lambda 函數的冷啟動和熱啟動時間。

以上是帶有 GraalVM Native Image 的 Lambda 函數 - 使用自訂運行時開發和部署 Lambda 函數的部分內容的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?如何使用咖啡因或Guava Cache等庫在Java應用程序中實現多層緩存?Mar 17, 2025 pm 05:44 PM

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Java的類負載機制如何起作用,包括不同的類載荷及其委託模型?Mar 17, 2025 pm 05:35 PM

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA

如何在Java中實施功能編程技術?如何在Java中實施功能編程技術?Mar 11, 2025 pm 05:51 PM

本文使用lambda表達式,流API,方法參考和可選探索將功能編程集成到Java中。 它突出顯示了通過簡潔性和不變性改善代碼可讀性和可維護性等好處

如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?如何將JPA(Java持久性API)用於具有高級功能(例如緩存和懶惰加載)的對象相關映射?Mar 17, 2025 pm 05:43 PM

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?如何將Maven或Gradle用於高級Java項目管理,構建自動化和依賴性解決方案?Mar 17, 2025 pm 05:46 PM

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

如何將Java的Nio(新輸入/輸出)API用於非阻滯I/O?如何將Java的Nio(新輸入/輸出)API用於非阻滯I/O?Mar 11, 2025 pm 05:51 PM

本文使用選擇器和頻道使用單個線程有效地處理多個連接的Java的NIO API,用於非阻滯I/O。 它詳細介紹了過程,好處(可伸縮性,性能)和潛在的陷阱(複雜性,

如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?如何使用適當的版本控制和依賴項管理創建和使用自定義Java庫(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

如何使用Java的插座API進行網絡通信?如何使用Java的插座API進行網絡通信?Mar 11, 2025 pm 05:53 PM

本文詳細介紹了用於網絡通信的Java的套接字API,涵蓋了客戶服務器設置,數據處理和關鍵考慮因素,例如資源管理,錯誤處理和安全性。 它還探索了性能優化技術,我

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 英文版

SublimeText3 英文版

推薦:為Win版本,支援程式碼提示!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境