你当前正在访问 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 或外部系统的事件做出响应的函数。

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

安装扩展

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

此扩展可通过安装 NuGet 包版本 1.0.0 提供。

使用 .NET CLI:

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

安装捆绑包

若要能够在应用中使用此绑定扩展,请确保项目的根目录中 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

演示如何在 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

可以通过在绑定(或属性)中DaprAddress设置function.json属性来替代输入和输出绑定使用的 Dapr 地址。 默认情况下,它使用 http://localhost:{DAPR_HTTP_PORT}

函数应用仍然公开另一个端口和终结点,例如 HTTP 触发器(本地默认为 7071,但在容器中)默认为 80

绑定类型

.NET 支持的绑定类型取决于扩展版本和 C# 执行模式,可以是下列类型之一:

进程内类库是在与 Functions 运行时相同的进程中运行的已编译 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).

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

    • 如果在代码中使用 Dapr 触发器,请验证应用端口是否已设置为 3001 或设置为环境变量的值 DAPR_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。