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 编写,但可以在任何支持的语言中使用。 有关创建自定义绑定的详细信息,请参阅创建自定义输入和输出绑定。