在 Azure Functions 上使用 Quarkus 部署無伺服器 Java 應用程式
在本文中,您將使用 Quarkus 來開發和建置無伺服器 Java 應用程式,然後部署到 Azure Functions。 本文使用 Quarkus Funqy 及其適用於 Java 的 Azure Functions HTTP 觸發程序內建支援。 搭配 Azure Functions 使用 Quarkus 可讓您利用 Azure Functions 的規模和彈性,使用 Quarkus 程式設計模型的強大功能。 完成時,您會在 Azure Functions 上執行無伺服器 Quarkus 應用程式,並繼續在 Azure 上監視您的應用程式。
必要條件
- 安裝在自用電腦上的 Azure CLI。
- Azure 帳戶。 如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶。
- 已適當設定
JAVA_HOME
的 Java JDK 17。 本文是使用 Java 17 撰寫,但 Azure Functions 和 Quarkus 也支援舊版的 Java。 - Apache Maven 3.8.1+。
建立應用程式專案
使用下列命令複製本文的範例 Java 專案。 此範例位於 GitHub 上。
git clone https://github.com/Azure-Samples/quarkus-azure
cd quarkus-azure
git checkout 2023-01-10
cd functions-quarkus
如果您看到有關處於中斷連結的 HEAD 狀態的訊息,則可安全地略過此訊息。 由於本文不需要任何認可,因此中斷連結的 HEAD 狀態沒有問題。
探索範例函式。 開啟 functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java 檔案。
執行下列命令。 @Funq
註釋會讓您的方法 (在此案例中,為 funqyHello
) 成為無伺服器函式。
@Funq
public String funqyHello() {
return "hello funqy";
}
Azure Functions Java 有一組自己的 Azure 專用註釋,但您在 Azure Functions 上使用 Quarkus 時,若容量和我們在這裡使用的一樣簡單,則不需要用到這些註釋。 若要進一步了解 Azure Functions Java 註釋,請參閱 Azure Functions Java 開發人員指南。
除非您另有指定,否則函式的名稱會與方法名稱相同。 您也可以使用下列命令,搭配註釋的參數來定義函式名稱:
@Funq("alternateName")
public String funqyHello() {
return "hello funqy";
}
名稱很重要。 它會成為叫用該函式的 REST URI 中的一部分,如本文稍後所示。
在本機測試函式
使用 mvn
在本機終端上執行 Quarkus 開發模式。 以這種方式執行 Quarkus 可讓您在背景編譯時啟用即時重載。 當您修改 Java 檔案和/或資源檔並重新整理瀏覽器時,這些變更會自動生效。
瀏覽器重新整理會觸發掃描工作區。 如果掃描偵測到任何變更,則會重新編譯 Java 檔案並重新部署應用程式。 重新部署的應用程式會處理此要求。 如果編譯或部署發生任何問題,會顯示錯誤頁面告知您。
在下列程序中,將 yourResourceGroupName
取代為資源群組名稱。 函數應用程式名稱在整個 Azure 全域中必須是唯一的。 資源群組名稱在訂用帳戶全域中必須是唯一的。 本文會將資源群組名稱加到函式名稱前面,確保必要的唯一性。 請考慮凡是建立的名稱必須是唯一時,在前面加上唯一識別碼。 實用的技巧是使用您的首字母,後面接著使用 mmdd
格式的今天日期。
這部分的指示不需要資源群組,但稍後會需要。 為了簡單起見,Maven 專案需要您定義屬性。
叫用 Quarkus 開發模式:
cd functions-azure mvn -DskipTests -DresourceGroup=<yourResourceGroupName> quarkus:dev
輸出應該看起來像這樣:
... --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ INFO [io.quarkus] (Quarkus Main Thread) quarkus-azure-function 1.0-SNAPSHOT on JVM (powered by Quarkus xx.xx.xx.) started in 1.290s. Listening on: http://localhost:8080 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, funqy-http, smallrye-context-propagation, vertx] -- Tests paused Press [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>
在本機終端上使用
CURL
命令來存取函式:curl localhost:8080/api/funqyHello
輸出應該看起來像這樣:
"hello funqy"
將相依性插入新增至函式
開放標準技術 Jakarta EE 內容和相依性插入 (CDI) 會在 Quarkus 中提供相依性插入。 如需一般插入的高階概觀和 CDI 具體說明,請參閱 Jakarta EE 教學課程。
新增使用相依性插入的新函式。
在 functions-quarkus/src/main/java/io/quarkus 目錄中建立 GreetingService.java 檔案。 使用下列程式碼作為檔案的原始程式碼:
package io.quarkus; import javax.enterprise.context.ApplicationScoped; @ApplicationScoped public class GreetingService { public String greeting(String name) { return "Welcome to build Serverless Java with Quarkus on Azure Functions, " + name; } }
儲存檔案。
GreetingService
是實作greeting()
方法的可插入 Bean。 此方法會傳回含有name
參數的Welcome...
字串訊息。開啟現有的 functions-quarkus/src/main/java/io/quarkus/GreetingFunction.java 檔案。 將類別取代為下列程式代碼,以新增
gService
欄位和greeting
方法:package io.quarkus; import javax.inject.Inject; import io.quarkus.funqy.Funq; public class GreetingFunction { @Inject GreetingService gService; @Funq public String greeting(String name) { return gService.greeting(name); } @Funq public String funqyHello() { return "hello funqy"; } }
儲存檔案。
在本機終端上使用
greeting
命令來存取新的curl
函式:curl -d '"Dan"' -X POST localhost:8080/api/greeting
輸出應該看起來像這樣:
"Welcome to build Serverless Java with Quarkus on Azure Functions, Dan"
重要
即時編碼 (也稱為開發模式) 可讓您執行應用程式並即時進行變更。 Quarkus 會在進行變更時自動重新編譯並重新載入應用程式。 這是一種強大且有效率的開發方式,也是您將在本文中使用的方式。
在您繼續進行下一個步驟之前,請選取 Ctrl+C 以停止 Quarkus 開發模式。
將應用程式部署至 Azure
如果您尚未部署應用程式,請使用下列 az login 命令登入 Azure 訂用帳戶並遵循畫面上的說明:
az login
注意
如果多個 Azure 租用戶與您的 Azure 認證相關聯,您必須指定您要登入的租用戶。 您可以使用
--tenant
選項來執行此作業。 例如:az login --tenant contoso.onmicrosoft.com
。繼續網頁瀏覽器中的程序。 如果沒有可用的網頁瀏覽器或網頁瀏覽器無法開啟,請搭配
az login --use-device-code
使用裝置程式碼流程。成功登入之後,本機終端上的輸出看起來應該如下所示:
xxxxxxx-xxxxx-xxxx-xxxxx-xxxxxxxxx 'Microsoft' [ { "cloudName": "AzureCloud", "homeTenantId": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxx", "id": "xxxxxx-xxxx-xxxx-xxxx-xxxxxxxx", "isDefault": true, "managedByTenants": [], "name": "Contoso account services", "state": "Enabled", "tenantId": "xxxxxxx-xxxx-xxxx-xxxxx-xxxxxxxxxx", "user": { "name": "user@contoso.com", "type": "user" } } ]
建置函式並部署到 Azure。
您在上一步驟中產生的 pom.xml 檔案會使用
azure-functions-maven-plugin
。 執行mvn install
會產生設定檔和azure-functions-maven-plugin
需要的預備目錄。 針對yourResourceGroupName
,請使用您先前使用的值。mvn clean install -DskipTests -DtenantId=<your tenantId from shown previously> -DresourceGroup=<yourResourceGroupName> azure-functions:deploy
在部署期間,登入 Azure。
azure-functions-maven-plugin
外掛程式已設定為在每次部署專案時提示 Azure 登入。 在組建期間,您會看到類似以下的輸出:[INFO] Auth type: DEVICE_CODE To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code AXCWTLGMP to authenticate.
依照輸出指示執行,並使用瀏覽器和提供的裝置程式碼向 Azure 進行驗證。 還有許多其他驗證和設定選項都可供使用。 如需
azure-functions-maven-plugin
的完整參考文件,請前往 Azure Functions:設定詳細資料。驗證之後,組建應該會繼續並完成。 請確定輸出在靠近結尾的部分含有
BUILD SUCCESS
。Successfully deployed the artifact to https://quarkus-demo-123451234.azurewebsites.net
您也可以在輸出記錄中找到可以在 Azure 上觸發函式的 URL:
[INFO] HTTP Trigger Urls: [INFO] quarkus : https://quarkus-azure-functions-http-archetype-20220629204040017.azurewebsites.net/api/{*path}
部署需要一段時間才能完成。 同時,讓我們在 Azure 入口網站中探索 Azure Functions。
在 Azure 上存取和監視無伺服器函式
登入入口網站,並確定您已選取在 Azure CLI 中使用的相同租用戶和訂用帳戶。
在 Azure 入口網站頂端的搜尋列輸入函數應用程式,然後選取 Enter 鍵。 您應部署函數應用程式,並顯示名稱
<yourResourceGroupName>-function-quarkus
。選取函數應用程式以顯示詳細資訊,例如 [位置]、[訂用帳戶]、[URL]、[計量],以及 [App Service 方案]。 然後,選取 [URL] 值。
確認歡迎頁面指出您的函數應用程式「已啟動且正在執行」。
在本機終端上使用下列
curl
命令來叫用greeting
函式。重要
將
YOUR_HTTP_TRIGGER_URL
取代為您在 Azure 入口網站或輸出中找到的自有函式 URL。curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting
輸出應如下所示:
"Welcome to build Serverless Java with Quarkus on Azure Functions, Dan on Azure"
您也可以使用下列
curl
命令來存取另一個函式 (funqyHello
):curl https://YOUR_HTTP_TRIGGER_URL/api/funqyHello
輸出應該與您先前觀察到的內容相同:
"hello funqy"
如果您想要在 Azure 入口網站中執行基本計量功能,請嘗試在殼層
for
迴圈內叫用函式:for i in {1..100}; do curl -d '"Dan on Azure"' -X POST https://YOUR_HTTP_TRIGGER_URL/api/greeting; done
一段時間後,您會在入口網站中看到一些計量資料。
現在您已在入口網站開啟 Azure 函式,以下是您可以從入口網站存取的其他功能:
- 監視 Azure 函式的效能。 如需詳細資訊,請參閱 監視 Azure Functions。
- 探索遙測。 如需詳細資訊,請參閱分析 Application Insights 中的 Azure Functions 遙測。
- 設定記錄。 如需詳細資訊,請參閱在 Azure Functions 中啟用串流執行記錄。
清除資源
如果您不需要這些資源,您可以執行下列命令來刪除這些資源:
az group delete --name <yourResourceGroupName> --yes
下一步
在本文中,您已了解如何:
- 執行 Quarkus 開發模式。
- 使用
azure-functions-maven-plugin
將 Funqy 應用程式部署到 Azure Functions。 - 在入口網站檢查函式的效能。
若要深入瞭解 Azure Functions 和 Quarkus,請參閱下列文章和參考: