Share via


在 Azure Functions 上使用 Quarkus 部署無伺服器 Java 應用程式

在本文中,您將使用 Quarkus 來開發和建置無伺服器 Java 應用程式,然後部署到 Azure Functions。 本文使用 Quarkus Funqy 及其適用於 Java 的 Azure Functions HTTP 觸發程序內建支援。 搭配 Azure Functions 使用 Quarkus 可讓您利用 Azure Functions 的規模和彈性,使用 Quarkus 程式設計模型的強大功能。 完成時,您會在 Azure Functions 上執行無伺服器 Quarkus 應用程式,並繼續在 Azure 上監視您的應用程式。

必要條件

建立應用程式專案

使用下列命令複製本文的範例 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 專案需要您定義屬性。

  1. 叫用 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>
    
  2. 在本機終端上使用 CURL 命令來存取函式:

    curl localhost:8080/api/funqyHello
    

    輸出應該看起來像這樣:

    "hello funqy"
    

將相依性插入新增至函式

開放標準技術 Jakarta EE 內容和相依性插入 (CDI) 會在 Quarkus 中提供相依性插入。 如需一般插入的高階概觀和 CDI 具體說明,請參閱 Jakarta EE 教學課程

  1. 新增使用相依性插入的新函式。

    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... 字串訊息。

  2. 開啟現有的 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";
        }
    
    }
    

    儲存檔案。

  3. 在本機終端上使用 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

  1. 如果您尚未部署應用程式,請使用下列 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"
            }
        }
    ]
    
  2. 建置函式並部署到 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
    
  3. 在部署期間,登入 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:設定詳細資料

  4. 驗證之後,組建應該會繼續並完成。 請確定輸出在靠近結尾的部分含有 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 中使用的相同租用戶和訂用帳戶。

  1. 在 Azure 入口網站頂端的搜尋列輸入函數應用程式,然後選取 Enter 鍵。 您應部署函數應用程式,並顯示名稱 <yourResourceGroupName>-function-quarkus

    Screenshot that shows the function app in the portal.

  2. 選取函數應用程式以顯示詳細資訊,例如 [位置]、[訂用帳戶]、[URL]、[計量],以及 [App Service 方案]。 然後,選取 [URL] 值。

    Screenshot that shows a URL and other function app details.

  3. 確認歡迎頁面指出您的函數應用程式「已啟動且正在執行」。

    Screenshot that shows the welcome page for a function app.

  4. 在本機終端上使用下列 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
    

    一段時間後,您會在入口網站中看到一些計量資料。

    Screenshot that shows function metrics in the portal.

現在您已在入口網站開啟 Azure 函式,以下是您可以從入口網站存取的其他功能:

清除資源

如果您不需要這些資源,可以在 Azure Cloud Shell 或本地終端上執行下列命令以刪除這些資源:

az group delete --name <yourResourceGroupName> --yes

下一步

在本文中,您已了解如何:

  • 執行 Quarkus 開發模式。
  • 使用 azure-functions-maven-plugin 將 Funqy 應用程式部署到 Azure Functions。
  • 在入口網站檢查函式的效能。

若要深入瞭解 Azure Functions 和 Quarkus,請參閱下列文章和參考: