你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
适用于 Azure Functions 的 Dapr 扩展是一组工具和服务,开发人员可以轻松地将 Azure Functions 与 分布式应用程序运行时(Dapr) 平台集成。
Azure Functions 是事件驱动的计算服务,它提供一组 触发器和绑定 ,以便轻松与其他 Azure 服务连接。 Dapr 提供了一组构建基块和构建分布式应用程序的最佳做法,包括微服务、状态管理、发布/子消息传送等。
借助 Dapr 和 Functions 之间的集成,可以生成对 Dapr 或外部系统的事件做出响应的函数。
| Action | 方向 | 类型 |
|---|---|---|
| Dapr 输入绑定上的触发器 | N/A | daprBindingTrigger |
| 对 Dapr 服务调用触发 | N/A | daprServiceInvocationTrigger |
| 对 Dapr 主题订阅触发 | N/A | daprTopicTrigger |
| 拉取 Dapr 状态执行 | In | daprState |
| 拉取 Dapr 机密执行 | In | daprSecret |
| 将值保存到 Dapr 状态 | Out | daprState |
| 调用另一个 Dapr 应用 | Out | daprInvoke |
| 将消息发布到 Dapr 主题 | Out | daprPublish |
| 将值发送到 Dapr 输出绑定 | Out | daprBinding |
安装扩展
安装捆绑包
若要能够在应用中使用此绑定扩展,请确保项目的根目录中 host.json 文件包含以下 extensionBundle 引用:
{
"version": "2.0",
"extensionBundle": {
"id": "Microsoft.Azure.Functions.ExtensionBundle",
"version": "[4.0.0, 5.0.0)"
}
}
在此示例中,version[4.0.0, 5.0.0)值指示 Functions 主机使用至少4.0.0小于但小于5.0.0的捆绑包版本,其中包括所有可能的 4.x 版本。 此表示法有效地在 v4.x 扩展捆绑包的最新可用次要版本上维护应用。
如果可能,应使用最新的扩展捆绑包主版本,并允许运行时自动维护最新的次要版本。 可以在 扩展捆绑包发布页上查看最新捆绑包的内容。 有关详细信息,请参阅 Azure Functions 扩展捆绑包。
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 配置值被视为应用程序范围更改。 在多修订模式下运行容器应用时,对这些设置的更改不会创建新的修订。 相反,所有现有修订都会重启,以确保它们配置了最 up-to日期值。
使用 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。
可以通过在绑定(或属性)中DaprAddress设置function.json属性来替代输入和输出绑定使用的 Dapr 地址。 默认情况下,它使用 http://localhost:{DAPR_HTTP_PORT}。
函数应用仍然公开另一个端口和终结点,例如 HTTP 触发器(本地默认为 7071,但在容器中)默认为 80。
绑定类型
.NET 支持的绑定类型取决于扩展版本和 C# 执行模式,可以是下列类型之一:
Dapr 扩展支持下表的参数类型。
| Binding | 参数类型 |
|---|---|
| Dapr 触发器 |
daprBindingTrigger daprServiceInvocationTrigger daprTopicTrigger |
| Dapr 输入 |
daprState daprSecret |
| Dapr 输出 |
daprState daprInvoke daprPublish daprBinding |
有关使用这些类型的示例,请参阅 扩展的 GitHub 存储库。
试用 Azure Functions 的 Dapr 扩展
了解如何通过提供的示例使用 Azure Functions 的 Dapr 扩展。
| Samples | Description |
|---|---|
| 快速入门 | 开始使用 Dapr Pub/sub 绑定和 HttpTrigger。 |
| Dapr Kafka | 了解如何将 Azure Functions Dapr 扩展与 Kafka 绑定 Dapr 组件配合使用。 |
| .NET 进程内 | 了解如何使用 Azure Functions 进程内模型与 .NET 中的多个 Dapr 组件集成,例如服务调用、Pub/sub、绑定和状态管理。 |
| .NET 独立 | 使用 Azure Functions pro-of-proc (OOP) 执行模型与 .NET 中的 Dapr 组件集成。 |
试用 Azure Functions 的 Dapr 扩展
了解如何通过提供的示例使用 Azure Functions 的 Dapr 扩展。
| Samples | Description |
|---|---|
| Java 函数 | 了解如何使用 Java 使用 Azure Functions Dapr 扩展。 |
试用 Azure Functions 的 Dapr 扩展
了解如何通过提供的示例使用 Azure Functions 的 Dapr 扩展。
| Samples | Description |
|---|---|
| 快速入门 | 开始使用 Dapr Pub/sub 绑定和 HttpTrigger。 |
| Dapr Kafka | 了解如何将 Azure Functions Dapr 扩展与 Kafka 绑定 Dapr 组件配合使用。 |
| JavaScript | 运行 JavaScript Dapr 函数应用程序,并使用 Azure Functions 与 Dapr 服务调用、Pub/sub、绑定和状态管理集成。 |
试用 Azure Functions 的 Dapr 扩展
了解如何通过提供的示例使用 Azure Functions 的 Dapr 扩展。
| Samples | Description |
|---|---|
| PowerShell 函数 | 了解如何将 Azure Functions Dapr 扩展与 PowerShell 配合使用。 |
试用 Azure Functions 的 Dapr 扩展
了解如何通过提供的示例使用 Azure Functions 的 Dapr 扩展。
| Samples | Description |
|---|---|
| Dapr Kafka | 了解如何将 Azure Functions Dapr 扩展与 Kafka 绑定 Dapr 组件配合使用。 |
| Python v1 | 运行 Dapr 化 Python 应用程序,并使用 Azure Functions Python v1 编程模型与 Dapr 组件集成。 |
| Python v2 | 使用 Azure Functions Python v2 编程模型启动 Dapr 应用程序,以便与 Dapr 组件集成。 |
Troubleshooting
本部分介绍如何排查使用 Azure Functions 的 Dapr 扩展时可能发生的问题。
确保在环境中启用 Dapr
如果在 Azure Functions 中使用 Dapr 绑定和触发器,并且环境中未启用 Dapr,则可能会收到错误消息:若要在环境中启用 Dapr: Dapr sidecar isn't present. Please see (https://aka.ms/azure-functions-dapr-sidecar-missing) for more information.
如果 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 函数,请运行以下命令以确保 使用 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