共用方式為


在 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 帳戶,請在開始之前建立 免費帳戶
  • 已適當設定 JAVA_HOME。 本文是使用 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 專案需要您定義屬性。

  1. 叫用 Quarkus 開發模式:

    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。 此方法會傳回含有 Welcome... 參數的 name 字串訊息。

  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

    顯示入口網站中函式應用程式的螢幕快照。

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

    顯示 URL 和其他函式應用程式詳細資料的螢幕快照。

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

    顯示函式應用程式歡迎頁面的螢幕快照。

  4. 在本機終端上使用下列 greeting 命令來叫用 curl 函式。

    重要

    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"
    

    您也可以使用下列 funqyHello 命令來存取另一個函式 (curl):

    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 函式,以下是您可以從入口網站存取的其他功能:

清除資源

如果您不需要這些資源,您可以執行下列命令來刪除這些資源:

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

下一步

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

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

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