介紹
在本系列的第 1 部分中,我們介紹了 GraalVM,特別是它的 Native Image 功能。我們還解釋了它對無伺服器應用程式的好處。在本系列的這一部分中,我們將說明如何使用包含 GraalVM Native Image 的自訂執行階段來開發和部署 AWS Lambda 函數。
申請樣本
為了解釋起見,我們將使用我們的範例應用程式。在此應用程式中,我們將建立和檢索產品並使用 DynamoDB 作為 NoSQL 資料庫。我們將重複使用測量 Java 21 Lambda 冷啟動一文中介紹的應用程序,並將其調整為部署為包含 GraalVM 本機映像的 Lambda 自訂執行時間。
常規設定
為了建構 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中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境