Azure Functions

quarkus-azure-functions 扩展是一个 Azure Functions 和 Quarkus 之间的简单集成点。它与 Azure Functions 运行时交互,以引导 Quarkus 并将您编写的任何 Azure Functions 类转换为 CDI/Arc Bean。 这使您可以将由 Quarkus 初始化的任何服务或组件直接注入到您函数类中。如果要将函数类设为单例类,还可以将函数类的生命周期从请求作用域(默认)更改为应用程序作用域。

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 jakarta.inject.Inject;
import java.util.Optional;

public class Function {
    @Inject
    GreetingService service;

    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(
                name = "req",
                methods = {HttpMethod.GET, HttpMethod.POST},
                authLevel = AuthorizationLevel.ANONYMOUS)
                HttpRequestMessage<Optional<String>> request,
            final ExecutionContext context) {

        // 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(service.greeting(name)).build();
        }
    }
}

该技术被认为是 {extension-status}。 有关可能状态的完整列表,请查看我们的 FAQ entry.

Prerequisites

如要完成本指南,您需要:

  • Roughly 15 minutes

  • An IDE

  • 安装了 JDK 17+,已正确配置 JAVA_HOME

  • Apache Maven ${proposed-maven-version}

  • 如果你想使用 Quarkus CLI, 则可以选择使用

  • 如果你想构建一个本机可执行文件(或如果你使用本机容器构建,则使用 Docker),则可以选择安装 Mandrel 或 GraalVM 以及 configured appropriately

Solution

本指南引导您运行可部署 HTTP 触发器 Azure 函数类的 Maven 项目。此函数类注入 CDI Bean 服务,该服务生成传递给客户端的问候消息。

Creating the Maven/Gradle Project

您可以在 this link 上从 Quarkus 的在线应用程序生成器生成示例代码。

你还可以使用 Quarkus CLI 生成此示例:

quarkus create app --extension=quarkus-azure-functions

如果你想生成 gradle 项目,请添加 @“1” 开关。

Examining the project

如果你打开生成的项目中的 @“2” 或 @“3” 构建文件,你将看到该项目与任何其他 Quarkus 项目相似。@“4” 扩展是 Quarkus 和 Azure Functions 之间的集成点。它用 Azure Functions 运行时注册回调以引导 Quarkus 并将 Quarkus/Arc 设置为功能类的功能工厂。

@“5” 扩展的当前实现不再需要 @“6” 或 gradle 等效项。本地开发和 Azure Functions 打包和部署现在都由 Quarkus 完成。

构建配置现在都在 @“7” 内。唯一必需的配置开关是 @“8”。

Azure Deployment Descriptors

Azure Functions @“9” 部署描述符自动生成,但如果你需要覆盖它,请在项目的根目录中声明它并在准备就绪时重新运行构建。

Quarkus dev mode

Quarkus 开发模式当前不适用于 Azure Functions。

Run locally in Azure Functions local environment

如果你想使用本地 Azure Functions 环境试用你的应用,你可以使用此命令

./mvnw quarkus:run

./gradlew --info --no-daemon quarkusRun

Gradle 在进程管理方面有点怪异,所以你需要 @“10” 开关或 ctrl-c 不会干净地销毁进程,你将会有打开的端口。

请注意,你必须安装 @“11” 才能使此项工作!

访问该示例的 URL 为:

[role="bare"]@“12”

Quarkus Integration Testing

你可以使用 @“13” 功能实现集成测试。当这些集成测试运行时,本地 Azure Functions 环境将为集成测试期间启动。

对于 maven:

./mvnw -DskipITs=false verify

确保你使用 maven 执行的任何集成测试都使用 @“14” 文件模式,以便常规构建不执行测试。

对于 Gradle:

./gradlew --info quarkusIntTest

确保你使用 Gradle 执行的任何集成测试都位于 @“15” 中。存在于 @“16” 中的集成测试将随常规构建一起运行并失败。

Login to Azure

如果你不登录到 Azure,你将无法部署。

az login

Deploy to Azure

@“17” 扩展处理所有部署到 Azure 的工作。默认情况下,Quarkus 将在后台使用 Azure CLI 来验证和部署到 Azure。如果你有多个订阅与你的帐户相关联,你必须将 @“19” 文件中的 @“18” 属性设置为你要使用的订阅。有关其他身份验证机制和部署选项,请参阅我们的配置文件 @“20”。

在构建好项目后,执行以下命令可运行该部署:

./mvnw quarkus:deploy

./gradlew --info deploy

如果部署成功,Quarkus 会将示例函数的端点 URL 输出到控制台。对于 Gradle,您必须使用 --info 开关才能看到此输出!

[INFO] HTTP Trigger Urls:
[INFO] 	 HttpExample : https://{appName}.azurewebsites.net/api/httpexample

访问该服务的 URL 应为