Azure Functions 触发器和绑定概念

本文概要介绍有关函数触发器和绑定的概念。

触发器会导致函数运行。 触发器定义函数的调用方式,一个函数必须刚好有一个触发器。 触发器还可以将数据传入函数,就像使用方法调用一样。

绑定到函数是一种以声明方式将函数连接到其他资源的方法;绑定将数据传入函数(输入绑定),或者允许使用绑定参数从函数(输出绑定)中写出数据。 函数触发器本质上是一种特殊的输入绑定类型。

可以混合搭配不同的绑定,以满足函数的特定方案。 绑定是可选的,一个函数可以有一个或多个输入绑定和/或输出绑定。

使用触发器和绑定可以避免对其他服务进行硬编码访问。 函数接收函数参数中的数据(例如,队列消息内容)。 使用函数的返回值发送数据(例如,用于创建队列消息)。

以下示例演示如何实现不同的函数。

示例方案 触发器 输入绑定 输出绑定
新的队列消息抵达,此时会运行一个函数来写入到另一个队列。 队列* 队列*
计划的作业读取 Blob 存储内容,并创建新的 Azure Cosmos DB 文档。 Timer Blob 存储 Azure Cosmos DB
事件网格用于读取 Blob 存储中的映像以及 Azure Cosmos DB 中的文档以发送电子邮件。 事件网格 Blob 存储和 Azure Cosmos DB SendGrid

* 表示不同的队列

这些示例并不详尽,旨在演示如何同时使用触发器和绑定。 有关更全面的方案集,请参阅 Azure Functions 方案

提示

Functions 不需要使用输入和输出绑定连接到 Azure 服务。 始终可以在代码中创建 Azure SDK 客户端,并将其用于数据传输。 有关详细信息,请参阅连接到服务

触发器和绑定的定义

函数具有单个触发器和一个或多个绑定。 绑定的类型是输入或输出。 并非所有服务都支持输入和输出绑定。 请参阅特定绑定扩展,了解特定绑定代码示例

触发器和绑定的定义根据开发语言的不同而异。 确保在文章顶部选择语言。

此示例显示了一个 HTTP 触发的函数,其中包含将消息写入 Azure 存储队列的输出绑定。

对于 C# 类库函数,触发器和绑定是通过使用 C# 属性修饰方法和参数配置的,其中应用的特定属性可能取决于 C# 运行时模型:

HTTP 触发器 (HttpTrigger) 是在 Run 方法上为返回 MultiResponse 对象的名为 HttpExample 的函数定义的:

        [Function("HttpExample")]
        public static MultiResponse Run([HttpTrigger(AuthorizationLevel.Function, "get", "post")] HttpRequestData req,
            FunctionContext executionContext)
        {

此示例显示了 MultiResponse 对象定义,这两者都会向 HTTP 请求返回 HttpResponse,并使用 QueueOutput 绑定将消息写入存储队列:

    public class MultiResponse
    {
        [QueueOutput("outqueue",Connection = "AzureWebJobsStorage")]
        public string[] Messages { get; set; }
        public HttpResponseData HttpResponse { get; set; }
    }

有关详细信息,请参阅 C# 独立辅助角色模型指南

旧 C# 脚本函数会使用 function.json 定义文件。 有关详细信息,请参阅 Azure Functions C# 脚本 (.csx) 开发人员参考

对于 Java 函数,触发器和绑定是通过批注特定方法和参数配置的。 此 HTTP 触发器 (@HttpTrigger) 是在名为 HttpTriggerQueueOutput 的函数的 run 方法上定义的,该方法会写入 message 参数上由 @QueueOutput 注释定义的存储队列:

    @FunctionName("HttpExample")
    public HttpResponseMessage run(
            @HttpTrigger(name = "req", methods = {HttpMethod.GET, HttpMethod.POST}, authLevel = AuthorizationLevel.ANONYMOUS) 
            HttpRequestMessage<Optional<String>> request, 
            @QueueOutput(name = "msg", queueName = "outqueue", 
            connection = "AzureWebJobsStorage") OutputBinding<String> msg, 
            final ExecutionContext context) {
        context.getLogger().info("Java HTTP trigger processed a request.");

有关详细信息,请参阅 Java 开发人员指南

为 Node.js 函数定义触发器和绑定的方式取决于 Functions 的特定版本的 Node.js:

在 Functions 版本 4 的 Node.js中,可以使用从 @azure/functions 模块导出的对象配置触发器和绑定。 有关详细信息,请参阅 Node.js 开发人员指南

此示例是一个 HTTP 触发的函数,它为收到的每个 HTTP 请求创建队列项。

导出 app 对象上的 http 方法会定义 HTTP 触发器,output 上的 storageQueue 方法会定义此触发器的输出绑定。

const { app, output } = require('@azure/functions');

const queueOutput = output.storageQueue({
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
});

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    extraOutputs: [queueOutput],
    handler: async (request, context) => {
        const body = await request.text();
        context.extraOutputs.set(queueOutput, body);
        return { body: 'Created queue item.' };
    },
});

导出 app 对象上的 http 方法会定义 HTTP 触发器,output 上的 storageQueue 方法会定义此触发器的输出绑定。

import { app, HttpRequest, HttpResponseInit, InvocationContext, output } from '@azure/functions';

const queueOutput = output.storageQueue({
    queueName: 'outqueue',
    connection: 'MyStorageConnectionAppSetting',
});

export async function httpTrigger1(request: HttpRequest, context: InvocationContext): Promise<HttpResponseInit> {
    const body = await request.text();
    context.extraOutputs.set(queueOutput, body);
    return { body: 'Created queue item.' };
}

app.http('httpTrigger1', {
    methods: ['GET', 'POST'],
    authLevel: 'anonymous',
    extraOutputs: [queueOutput],
    handler: httpTrigger1,
});

此示例 function.json 文件会定义函数:

    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "Request",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "Response"
    },
    {
      "type": "queue",
      "direction": "out",
      "name": "msg",
      "queueName": "outqueue",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

有关详细信息,请参阅 PowerShell 开发人员指南

定义函数的方式取决于适用于 Functions 的 Python 版本:

在 Python for Functions 版本 2 中,使用修饰器直接在代码中定义函数。

app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)

@app.route(route="HttpExample")
@app.queue_output(arg_name="msg", queue_name="outqueue", connection="AzureWebJobsStorage")
def HttpExample(req: func.HttpRequest, msg: func.Out [func.QueueMessage]) -> func.HttpResponse:
    logging.info('Python HTTP trigger function processed a request.')

向函数添加绑定

可以使用输入或输出绑定将函数连接到其他服务。 通过向函数添加绑定的具体定义来添加绑定。 若要了解如何操作,请参阅向 Azure Functions 中的现有函数添加绑定

Azure Functions 支持多个绑定,这些绑定必须正确配置。 例如,函数可以从队列(输入绑定)读取数据,并将数据同时写入数据库(输出绑定)。

支持的绑定

下表显示了 Azure Functions 运行时的主版本支持的绑定:

类型 1.x 2.x 及更高版本1 触发器 输入 输出
Blob 存储
Azure Cosmos DB
Azure SQL
Dapr3
事件网格
事件中心
HTTP 和 Webhook
IoT 中心
Kafka2
移动应用
通知中心
队列存储
RabbitMQ2
SendGrid
服务总线
SignalR
表存储
计时器

1 从版本 2.x 运行时开始,除了 HTTP 和 Timer 以外,所有绑定都必须注册。 请参阅注册绑定扩展

2 消耗计划中不支持触发器。 需要运行时驱动的触发器

3 仅支持 Kubernetes、IoT Edge 和其他自托管模式。

有关哪些绑定处于预览状态或已批准在生产环境中使用的信息,请参阅支持的语言

仅在支持基础服务 SDK 时,才支持特定绑定扩展版本。 基础服务 SDK 版本中对支持的更改会影响对使用扩展的支持。

绑定代码示例

使用下表查找特定绑定类型的更多示例,这些示例演示如何在函数中使用绑定。 首先,选择与你的项目相对应的语言选项卡。

服务 示例 示例
Blob 存储 触发器
输入
输出
链接
Azure Cosmos DB 触发器
输入
输出
链接
Azure SQL 触发器(预览)
输入
输出
链接
事件网格 触发器
输出
链接
事件中心 触发器
输出
IoT 中心 触发器
输出
HTTP 触发器 链接
队列存储 触发器
输出
链接
RabbitMQ 触发器
输出
SendGrid 输出
服务总线 触发器
输出
链接
SignalR 触发器
输入
输出
表存储 输入
输出
计时器 触发器 链接

自定义绑定

可以创建自定义输入和输出绑定。 绑定必须以 .NET 编写,但可以在任何支持的语言中使用。 有关创建自定义绑定的详细信息,请参阅创建自定义输入和输出绑定