你当前正在访问 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

安装扩展

你安装的扩展 NuGet 包取决于你在函数应用中使用的 C# 模式进程内独立工作进程

可通过安装版本 1.0.0 的 NuGet 包来使用此扩展。

使用 .NET CLI:

dotnet add package Microsoft.Azure.WebJobs.Extensions.Dapr

安装捆绑包

可以通过在 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”:

演示如何在 Azure 门户中查找 Function App 的 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# 执行模式,可以是以下类型之一:

进程内类库是编译的 C# 函数,该函数在与 Functions 运行时相同的进程中运行。

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). 若要解决此错误消息,请执行以下步骤:

  1. 在容器应用的 Dapr 设置中:

    • 如果在代码中使用 Dapr 触发器,请验证应用端口是否设置为 3001DAPR_APP_PORT 环境变量的值。

    • 如果未在代码中使用 Dapr 触发器,请验证应用端口是否 未设置。 它应为空。

  2. 验证是否在 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 
      

后续步骤

详细了解 Dapr。