快速入門:從命令列在 Azure 中建立 JAVA 函式

在本文中,您會使用命令列工具建立可回應 HTTP 要求的 Java 函式。 在本機測試程式碼之後,您可以將其部署到 Azure Functions 的無伺服器環境。

如果 Maven 不是您慣用的開發工具,請參閱供 Java 開發人員參考的類似教學課程:

完成本快速入門後,您的 Azure 帳戶中會產生幾美分或更少的少許費用。

設定您的本機環境

開始之前,您必須具備下列條件:

安裝 Azure Functions Core Tools

安裝 Core Tools 的建議方式取決於本機開發電腦的作業系統。

下列步驟使用 Windows 安裝程式 (MSI) 來安裝 Core Tools v4.x。 如需其他套件型安裝程式的詳細資訊,請參閱 Core Tools 讀我檔案

根據您的 Windows 版本,下載並執行 Core Tools 安裝程式:

如果您之前使用 Windows 安裝程式 (MSI) 在 Windows 上安裝 Core Tools,則應該先從 [新增移除程式] 解除安裝舊版本,再安裝最新版本。

建立本機函式專案

在 Azure Functions 中,函式專案是包含一或多個個別函式的容器,而每個函式分別會回應特定的觸發程序。 專案中的所有函式會共用相同的本機和裝載設定。 在本節中,您將建立包含單一函式的函式專案。

  1. 在空的資料夾中,執行下列命令以從 Maven 原型 \(英文\) 產生 Functions 專案。

    mvn archetype:generate -DarchetypeGroupId=com.microsoft.azure -DarchetypeArtifactId=azure-functions-archetype -DjavaVersion=8
    

    重要

    • 若您想讓函式在 Java 11 上執行,請使用 -DjavaVersion=11。 若要深入了解,請參閱 Java 版本
    • JAVA_HOME 環境變數必須設定為正確 JDK 版本的安裝位置,才能完成本文。
  2. Maven 會要求您提供在部署時完成產生專案所需的值。
    當系統提示時,提供下列值:

    提示 Description
    groupId com.fabrikam 此值可在所有專案中唯一識別您的專案,並遵循適用於 Java 的套件命名規則
    artifactId fabrikam-functions 此值是 jar 的名稱 (不含版本號碼)。
    version 1.0-SNAPSHOT 選擇預設值。
    套件 com.fabrikam 此值是所產生函式程式碼的 Java 套件。 使用預設值。
  3. 輸入 Y 或按 Enter 進行確認。

    Maven 會以 artifactId 名稱在新資料夾中建立專案檔案,在此例中為 fabrikam-functions

  4. 瀏覽至專案資料夾:

    cd fabrikam-functions
    

    此資料夾會包含專案的各種檔案,包括名為 local.settings.jsonhost.json 的組態檔。 由於 local.settings.json 可能會包含從 Azure 下載的秘密,因此 .gitignore 檔案依預設會將該檔案排除在原始檔控制以外。

(選擇性) 檢查檔案內容

如有需要,您可以跳到在本機執行函式,並於稍後再檢查檔案內容。

Function.java

Function.java 包含 run 方法,會接收 request 變數中的要求資料,而該變數是一個以 HttpTrigger 註釋裝飾的 HttpRequestMessage,可定義觸發程序行為。

package com.fabrikam;

import com.microsoft.azure.functions.ExecutionContext;
import com.microsoft.azure.functions.HttpMethod;
import com.microsoft.azure.functions.HttpRequestMessage;
import com.microsoft.azure.functions.HttpResponseMessage;
import com.microsoft.azure.functions.HttpStatus;
import com.microsoft.azure.functions.annotation.AuthorizationLevel;
import com.microsoft.azure.functions.annotation.FunctionName;
import com.microsoft.azure.functions.annotation.HttpTrigger;

import java.util.Optional;

/**
 * Azure Functions with HTTP Trigger.
 */
public class Function {
    /**
     * This function listens at endpoint "/api/HttpExample". Two ways to invoke it using "curl" command in bash:
     * 1. curl -d "HTTP Body" {your host}/api/HttpExample
     * 2. curl "{your host}/api/HttpExample?name=HTTP%20Query"
     */
    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET, HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

        // Parse query parameter
        final String query = request.getQueryParameters().get("name");
        final String name = request.getBody().orElse(query);

        if (name == null) {
            return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
        } else {
            return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
        }
    }
}

回應訊息是由 HttpResponseMessage.Builder API 所產生。

pom.xml

為裝載應用程式所建立的 Azure 資源設定,會定義於外掛程式的 configuration 元素中,並在產生的 pom.xml 檔案中使用 com.microsoft.azuregroupId。 例如,下方的 configuration 元素會指示以 Maven 為基礎的部署,以在 westus 區域的 java-functions-group 資源群組中建立函式應用程式。 函式應用程式本身會在 java-functions-app-service-plan 方案所裝載的 Windows 上執行,預設為無伺服器取用方案。

<plugin>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-functions-maven-plugin</artifactId>
    <version>${azure.functions.maven.plugin.version}</version>
    <configuration>
        <!-- function app name -->
        <appName>${functionAppName}</appName>
        <!-- function app resource group -->
        <resourceGroup>java-functions-group</resourceGroup>
        <!-- function app service plan name -->
        <appServicePlanName>java-functions-app-service-plan</appServicePlanName>
        <!-- function app region-->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-regions for all valid values -->
        <region>westus</region>
        <!-- function pricingTier, default to be consumption if not specified -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details#supported-pricing-tiers for all valid values -->
        <!-- <pricingTier></pricingTier> -->
        <!-- Whether to disable application insights, default is false -->
        <!-- refers https://github.com/microsoft/azure-maven-plugins/wiki/Azure-Functions:-Configuration-Details for all valid configurations for application insights-->
        <!-- <disableAppInsights></disableAppInsights> -->
        <runtime>
            <!-- runtime os, could be windows, linux or docker-->
            <os>windows</os>
            <javaVersion>8</javaVersion>
        </runtime>
        <appSettings>
            <property>
                <name>FUNCTIONS_EXTENSION_VERSION</name>
                <value>~4</value>
            </property>
        </appSettings>
    </configuration>
    <executions>
        <execution>
            <id>package-functions</id>
            <goals>
                <goal>package</goal>
            </goals>
        </execution>
    </executions>
</plugin>

您可以變更這些設定,以控制在 Azure 中建立資源的方式,例如,在初始部署之前將 runtime.oswindows 變更為 linux。 如需 Maven 外掛程式支援的設定完整清單,請參閱組態詳細資料

FunctionTest.java

原型也會產生函式的單元測試。 變更函式以新增繫結或將新函式新增至專案時,也需要修改 FunctionTest.java 檔案中的測試。

在本機執行函式

  1. 啟動 LocalFunctionProj 資料夾中的本機 Azure Functions 執行階段主機,以執行您的函式:

    mvn clean package
    mvn azure-functions:run
    

    在輸出的結尾處,應該會出現下列幾行:

     ...
    
     Now listening on: http://0.0.0.0:7071
     Application started. Press Ctrl+C to shut down.
    
     Http Functions:
    
             HttpExample: [GET,POST] http://localhost:7071/api/HttpExample
     ...
    
     

    注意

    如果 HttpExample 未如上顯示,表示您可能不是從專案的根資料夾啟動主機。 在此情況下,請使用 Ctrl+C 停止主機,瀏覽至專案的根資料夾,然後再次執行先前的命令。

  2. 從這個輸出中將 HttpExample 函式的 URL 複製到瀏覽器,並附加查詢字串 ?name=<YOUR_NAME>,使其成為完整的 URL (如 http://localhost:7071/api/HttpExample?name=Functions)。 瀏覽器應該會顯示訊息,回應您的查詢字串值。 您在其中啟動專案的終端機,也會在您提出要求時顯示記錄輸出。

  3. 完成作業後,請使用 Ctrl+C 並選擇 y 以停止函式主機。

將函式專案部署至 Azure

第一次部署函式應用程式時,會在 Azure 中建立函式專案和相關資源。 為裝載應用程式所建立的 Azure 資源設定會在 pom.xml 檔案中定義。 在本文中,您將接受預設值。

提示

若要建立在 Linux 上執行而不是在 Windows 上執行的函式應用程式,請將 pom.xml 檔案中的 runtime.os 元素從 windows 變更為 linux這些區域支援以耗用量方案執行 Linux。 您的應用程式不能在相同的資源群組中在 Linux 和 Windows 上執行。

  1. 您必須先使用 Azure CLI 或 Azure PowerShell 登入 Azure 訂用帳戶,才能進行部署。

    az login
    

    az login 命令會將您登入您的 Azure 帳戶。

  2. 使用下列命令,將您的專案部署至新的函式應用程式。

    mvn azure-functions:deploy
    

    這會在 Azure 中建立下列資源:

    • 資源群組。 命名為 java-functions-group
    • 。 Functions 所需。 此名稱會根據儲存體帳戶名稱需求隨機產生。
    • 主控方案。 在 westus 中以無伺服器方式主控您的函式應用程式。 名稱為 java-functions-app-service-plan
    • 函式應用程式。 函式應用程式是您函式的部署和執行單位。 系統會根據您的 artifactId 隨機產生名稱,此名稱會附加隨機產生的號碼。

    部署會封裝專案檔案,並使用 zip deployment 將其部署至新的函式應用程式, 且程式碼會從 Azure 中的部署套件執行。

重要

儲存體帳戶可用來儲存重要的應用程式資料,有時還包含應用程式的程式碼本身。 您應該限制其他應用程式和使用者存取儲存體帳戶。

在 Azure 上叫用函式

由於您的函式會使用 HTTP 觸發程序,因此您在叫用函式時,可以在瀏覽器中對其 URL 提出 HTTP 要求,或使用 curl 之類的工具。

將發佈命令的輸出中顯示的完整叫用 URL 複製到瀏覽器網址列中 (請附加查詢參數 ?name=Functions)。 瀏覽器應該會顯示與您在本機執行函式時類似的輸出。

The output of the function run on Azure in a browser

執行下列命令,以檢視近即時的串流記錄:

func azure functionapp logstream <APP_NAME> 

在個別終端機視窗或瀏覽器中,再次呼叫遠端函式。 Azure 中的函式執行會有詳細資訊記錄顯示在終端機中。

清除資源

如果您要繼續進行下一個步驟並新增 Azure 儲存體佇列輸出繫結,請保留您所有的資源,因為在後續的工作還會用到。

否則,請使用下列命令刪除資源群組及其包含的所有資源,以避免產生額外的成本。

az group delete --name java-functions-group

下一步