你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于 Azure Functions 的 Dapr 扩展
适用于 Azure Functions 的 Dapr 扩展是一组工具和服务,使开发人员能够轻松地将 Azure Functions 与分散式应用程序运行时(Dapr)平台集成。
Azure Functions 是事件驱动的计算服务,它提供一组触发器和绑定,可轻松与其他 Azure 服务连接。 Dapr 提供了一组构建基块和最佳做法,用于生成分布式应用程序,包括微服务、状态管理、发布/订阅消息传送等。
借助 Dapr 和 Functions 之间的集成,可以生成对 Dapr 或外部系统的事件做出响应的函数。
操作 | 方向 | 类型 |
---|---|---|
在 Dapr 输入绑定上触发 | 不可用 | daprBindingTrigger |
在 Dapr 服务调用上触发 | 不可用 | daprServiceInvocationTrigger |
在 Dapr 主题订阅上触发 | 不可用 | daprTopicTrigger |
拉取执行的 Dapr 状态 | 位于 | daprState |
拉取执行的 Dapr 机密 | 位于 | daprSecret |
将值保存到 Dapr 状态 | 出 | daprState |
调用另一个 Dapr 应用 | 出 | daprInvoke |
将消息发布到 Dapr 主题 | 出 | daprPublish |
将值发送到 Dapr 输出绑定 | 出 | daprBinding |
安装扩展
安装捆绑包
可以通过在 host.json
文件中添加或替换以下代码来添加扩展:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.*, 5.0.0)"
}
}
Dapr 启用
可以根据运行时上下文使用各种[自变量和注释][dapr-args] 配置 Dapr。 可以通过两个通道为 Azure Functions 配置 Dapr:
- 基础结构即代码 (IaC) 模板,如 Bicep 或 Azure 资源管理器 (ARM) 模板
- Azure 门户
使用 IaC 模板时,请在容器应用资源定义的 properties
部分中指定以下参数。
DaprConfig: {
enabled: true
appId: '${envResourceNamePrefix}-funcapp'
appPort: 3001
httpReadBufferSize: ''
httpMaxRequestSize: ''
logLevel: ''
enableApiLogging: true
}
上述 Dapr 配置值被视为应用程序范围的更改。 在多修订版模式下运行容器应用时,更改这些设置不会创建新的修订版, 而是会重启所有现有修订版,以确保为它们配置了最新的值。
使用 Azure 门户配置 Dapr 时,导航到函数应用并从左侧菜单中选择“Dapr”:
Dapr 端口和侦听器
从 Dapr 触发函数时,扩展会自动公开端口 3001
以侦听来自 Dapr sidecar 的传入请求。
重要
仅当在函数应用中定义了 Dapr 触发器时,才会公开和侦听端口 3001
。 使用 Dapr 时,sidecar 会在完成实例化之前等待从定义的端口接收响应。 除非有触发器,否则请不要定义dapr.io/port
注释或 --app-port
。 这样做可能会从 Dapr sidecar 锁定应用程序。
如果仅使用输入和输出绑定,则无需公开或定义端口 3001
。
默认情况下,当 Azure Functions 尝试与 Dapr 通信时,它会通过从环境变量 DAPR_HTTP_PORT
解析的端口来调用 Dapr。 如果该变量为 null,则默认为端口 3500
。
可以通过在绑定(或属性)的 function.json
中设置 DaprAddress
属性来替代输入和输出绑定使用的 Dapr 地址。 默认情况下,它使用 http://localhost:{DAPR_HTTP_PORT}
。
函数应用仍然为 HTTP 触发器等内容公开另一个端口和终结点,在本地默认为 7071
,但在容器中默认为 80
。
绑定类型
.NET 支持的绑定类型取决于扩展版本和 C# 执行模式,可以是以下类型之一:
Dapr 扩展支持的参数类型如下表所示。
绑定 | 参数类型 |
---|---|
Dapr 触发器 | daprBindingTrigger daprServiceInvocationTrigger daprTopicTrigger |
Dapr 输入 | daprState daprSecret |
Dapr 输出 | daprState daprInvoke daprPublish daprBinding |
有关使用这些类型的示例,请参阅扩展的 GitHub 存储库。
试用 Azure Functions 的 Dapr 扩展
通过提供的示例了解如何使用适用于 Azure Functions 的 Dapr 扩展。
示例 | 说明 |
---|---|
快速入门 | 开始使用 Dapr 发布/订阅绑定和 HttpTrigger 。 |
Dapr Kafka | 了解如何将 Azure Functions Dapr 扩展与 Kafka 绑定 Dapr 组件配合使用。 |
.NET 进程内 | 了解如何使用 Azure Functions 进程内模型与 .NET 中的多个 Dapr 组件集成,例如服务调用、发布/订阅、绑定和状态管理。 |
.NET 独立 | 使用 Azure Functions 进程外 (OOP) 执行模型与 .NET 中的 Dapr 组件集成。 |
试用 Azure Functions 的 Dapr 扩展
通过提供的示例了解如何使用适用于 Azure Functions 的 Dapr 扩展。
示例 | 说明 |
---|---|
Java 函数 | 了解如何通过 Java 使用 Azure Functions Dapr 扩展。 |
试用 Azure Functions 的 Dapr 扩展
通过提供的示例了解如何使用适用于 Azure Functions 的 Dapr 扩展。
示例 | 说明 |
---|---|
快速入门 | 开始使用 Dapr 发布/订阅绑定和 HttpTrigger 。 |
Dapr Kafka | 了解如何将 Azure Functions Dapr 扩展与 Kafka 绑定 Dapr 组件配合使用。 |
JavaScript | 运行 JavaScript Dapr 函数应用程序并使用 Azure Functions 与 Dapr 服务调用、发布/订阅、绑定和状态管理集成。 |
试用 Azure Functions 的 Dapr 扩展
通过提供的示例了解如何使用适用于 Azure Functions 的 Dapr 扩展。
示例 | 说明 |
---|---|
PowerShell 函数 | 了解如何将 Azure Functions Dapr 扩展与 PowerShell 结合使用。 |
试用 Azure Functions 的 Dapr 扩展
通过提供的示例了解如何使用适用于 Azure Functions 的 Dapr 扩展。
示例 | 说明 |
---|---|
Dapr Kafka | 了解如何将 Azure Functions Dapr 扩展与 Kafka 绑定 Dapr 组件配合使用。 |
Python v1 | 运行 Dapr 化的 Python 应用程序并使用 Azure Functions Python v1 编程模型与 Dapr 组件集成。 |
Python v2 | 使用 Azure Functions Python v2 编程模型启动 Dapr 应用程序以与 Dapr 组件集成。 |
故障排除
本部分介绍如何排查使用 Azure Functions 的 Dapr 扩展时可能发生的问题。
确保在环境中启用 Dapr
如果在 Azure Functions 中使用 Dapr 绑定和触发器,并且环境中未启用 Dapr,可能会收到错误消息:Dapr sidecar isn't present. Please see (https://aka.ms/azure-functions-dapr-sidecar-missing) for more information.
若要在环境中启用 Dapr,请执行以下操作:
如果 Azure 函数部署在 Azure 容器应用中,请参阅 Azure Functions Dapr 扩展的Dapr 启用说明。
如果 Azure 函数部署在 Kubernetes 中,请验证“部署的 YAML 配置”是否具有以下注释:
annotations: ... dapr.io/enabled: "true" dapr.io/app-id: "functionapp" # You should only set app-port if you are using a Dapr trigger in your code. dapr.io/app-port: "<DAPR_APP_PORT>" ...
如果在本地运行 Azure Function,请运行以下命令以确保在使用 Dapr运行函数应用:
dapr run --app-id functionapp --app-port <DAPR_APP_PORT> --components-path <COMPONENTS_PATH> -- func host start
验证 Dapr 配置中的应用端口值
默认情况下,Azure Functions 的 Dapr 扩展在端口 3001
上启动 HTTP 服务器。 可以使用 DAPR_APP_PORT
环境变量配置此端口。
如果在运行 Azure Functions 应用时提供不正确的应用端口值,可能会收到错误消息:The Dapr sidecar is configured to listen on port {portInt}, but the app server is running on port {appPort}. This may cause unexpected behavior. For more information, visit [this link](https://aka.ms/azfunc-dapr-app-config-error).
若要解决此错误消息,请执行以下步骤:
在容器应用的 Dapr 设置中:
如果在代码中使用 Dapr 触发器,请验证应用端口是否设置为
3001
或DAPR_APP_PORT
环境变量的值。如果未在代码中使用 Dapr 触发器,请验证应用端口是否 未设置。 它应为空。
验证是否在 Dapr 配置中提供正确的应用端口值。
如果使用 Azure 容器应用,请在 Bicep 中指定应用端口:
DaprConfig: { ... appPort: <DAPR_APP_PORT> ... }
如果使用 Kubernetes 环境,请设置
dapr.io/app-port
批注:annotations: ... dapr.io/app-port: "<DAPR_APP_PORT>" ...
如果要在本地开发,请使用 Dapr 运行函数应用时验证是否已设置
--app-port
:dapr run --app-id functionapp --app-port <DAPR_APP_PORT> --components-path <COMPONENTS_PATH> -- func host start