在 C 中创建第一个持久函数#

Durable Functions 是 Azure Functions 的扩展,可用于在无服务器环境中编写有状态函数。 该扩展程序将帮助你管理状态、检查点和重启功能。

本文介绍如何使用 Visual Studio Code 在本地创建和测试“hello world”持久函数。 此函数协调并链接对其他函数的调用。 然后,可以将函数代码发布到 Azure。 这些工具作为 Visual Studio Code Azure Functions 扩展的一部分提供。

Visual Studio Code 窗口的屏幕截图,其中包含持久函数。

先决条件

若要完成本教程,

如果没有 Azure 订阅,可在开始前创建一个试用帐户

创建本地项目

在本部分,你将使用 Visual Studio Code 创建一个本地 Azure Functions 项目。

  1. 在 Visual Studio Code 中,按 F1 (或 Ctrl/Cmd+Shift+P)打开命令面板。 在命令面板中,搜索并选择 Azure Functions: Create New Project...

    创建函数项目窗口的屏幕截图。

  2. 为项目选择空文件夹位置,然后选择 “选择”。

  3. 按照提示提供以下信息:

    Prompt 价值 Description
    为函数应用项目选择语言 C# 创建本地 C# Functions 项目。
    选择版本 Azure Functions v4 仅当尚未安装 Core Tools 时,才会看到此选项。 在这种情况下,首次运行应用时会安装 Core Tools。
    为项目的第一个函数选择模板 暂时跳过
    选择要打开项目的方式 在当前窗口中打开 在所选文件夹中重新打开 Visual Studio Code。

Visual Studio Code 根据需要安装 Azure Functions Core Tools。 它还会在某个文件夹中创建一个函数应用项目。 此项目包含 host.json 和 local.settings.json 配置文件。

将函数添加到应用

以下步骤使用模板在项目中创建持久函数代码。

  1. 在命令面板中,搜索并选择 Azure Functions: Create Function...

  2. 按照提示提供以下信息:

    Prompt 价值 Description
    为函数选择模板 DurableFunctionsOrchestration (持久函数编排) 创建 Durable Functions 业务流程
    提供函数名称 HelloOrchestration 在其中创建函数的类的名称
    提供命名空间 公司.功能 生成的类的命名空间
  3. 当 Visual Studio Code 提示选择存储帐户时,请选择“选择存储帐户”。 按照提示作,并提供以下信息,在 Azure 中创建新的存储帐户:

    Prompt 价值 Description
    选择订阅 订阅的名称 选择您的 Azure 订阅
    选择存储帐户 创建新的存储帐户
    输入新存储帐户的名称 唯一名称 要创建的存储帐户的名称
    选择资源组 唯一名称 要创建的资源组名称
    选择一个位置 地区 选择离你较近的区域

将包含新函数的类添加到项目中。 Visual Studio Code 还会将存储帐户连接字符串添加到 local.settings.json ,并将 NuGet 包的 Microsoft.Azure.WebJobs.Extensions.DurableTask 引用添加到 .csproj 项目文件。

打开新的 HelloOrchestration.cs 文件以查看内容。 此持久函数是使用以下方法的简单函数链接示例:

方法 函数名称 Description
RunOrchestrator HelloOrchestration 管理持久编排。 在这种情况下,编排开始运行,创建一个列表,并将三个函数调用的结果添加到该列表中。 完成三个函数调用后,它将返回列表。
SayHello HelloOrchestration_Hello 该函数返回一个问候。 它是包含正在协调的业务逻辑的函数。
HttpStart HelloOrchestration_HttpStart HTTP 触发的函数,该函数启动一个编排实例,并返回检查状态响应。

创建函数项目和持久函数后,可以在本地计算机上对其进行测试。

在本地测试函数

Azure Functions Core Tools 允许在本地开发计算机上运行 Azure Functions 项目。 第一次使用 Visual Studio Code 启动某个函数时,系统将会提示您安装这些工具。

  1. 若要测试函数,请在 SayHello 活动函数代码中设置断点,然后按 F5 启动函数应用项目。 来自 Core Tools 的输出会显示在“终端” 面板中。

    注释

    有关调试的详细信息,请参阅 Durable Functions 诊断

  2. 终端 面板中,复制 HTTP 触发的函数的 URL 终结点。

    Azure 本地输出窗口的屏幕截图。

  3. 使用 PostmancURL 等工具,然后将 HTTP POST 请求发送到 URL 终结点。

    响应是 HTTP 函数的初始结果,告知我们持久业务流程已成功启动。 它尚不是编排的最终结果。 响应中包括了几个有用的 URL。 现在,让我们查询编排的状态。

  4. 复制 URL 值 statusQueryGetUri,将其粘贴到浏览器的地址栏中,并执行请求。 或者,还可以继续使用 Postman 发出 GET 请求。

    请求将查询编排实例的状态。 必须获得最终响应,该响应显示实例已完成并包括持久函数的输出或结果。 如下所示:

    {
        "name": "HelloOrchestration",
        "instanceId": "9a528a9e926f4b46b7d3deaa134b7e8a",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "Hello Tokyo!",
            "Hello Seattle!",
            "Hello London!"
        ],
        "createdTime": "2020-03-18T21:54:49Z",
        "lastUpdatedTime": "2020-03-18T21:54:54Z"
    }
    
  5. 若要停止调试,请按 Visual Studio Code 中的 Shift + F5

确认该函数可以在本地计算机上正确运行以后,即可将项目发布到 Azure。

登录到 Azure

必须先登录到 Azure,然后才能创建 Azure 资源或发布应用。

  1. 如果你尚未登录,请在活动栏中选择 Azure 图标。 然后在“资源”下,选择“登录到 Azure”。

    在 Visual Studio Code 中登录到 Azure 窗口的屏幕截图。

    如果你已登录并可以看到你的现有订阅,请转到下一部分。 如果你没有 Azure 帐户,请选择“创建 Azure 帐户”。 学生可以选择“创建面向学生的 Azure 帐户”。

  2. 在浏览器中出现提示时,请选择你的 Azure 帐户,并使用你的 Azure 帐户凭据登录。 如果创建新帐户,可以在创建帐户后登录。

  3. 成功登录后,可以关闭新的浏览器窗口。 属于你的 Azure 帐户的订阅显示在边栏中。

在 Azure 中创建函数应用

在本部分中,将在 Flex Consumption 计划中创建函数应用以及 Azure 订阅中的相关资源。 许多资源创建决策都是根据默认行为为你做出的。 要更好地控制已创建的资源,必须改为使用高级选项创建函数应用

  1. 在 Visual Studio Code 中选择 F1 键,打开命令面板。 在提示符 (>) 处,输入并选择“Azure Functions: 在 Azure 中创建函数应用”。

  2. 根据提示提供以下信息:

    Prompt Action
    选择订阅 选择要使用的 Azure 订阅。 如果“资源”下只有一个订阅可见,则不会出现提示符。
    输入新的函数应用名称 在 URL 路径中输入一个全局唯一且有效的名称。 系统将对你输入的名称进行验证,以确保其在 Azure Functions 中是唯一的。
    选择运行时堆栈 选择当前本地运行的语言版本。
    选择资源身份验证类型 选择 托管标识,这是连接到 默认主机存储帐户的最安全选项。

    在“Azure: 活动日志”面板中,Azure 扩展将显示在 Azure 中创建的各个资源的状态。

    显示了 Azure 资源创建日志的屏幕截图。

  3. 创建函数应用时,系统将在你的 Azure 订阅中创建以下相关资源。 资源基于你为函数应用输入的名称命名。

    • 一个资源组:相关资源的逻辑容器。
    • 一个函数应用:提供用于执行函数代码的环境。 可以通过函数应用将函数分组为逻辑单元,以便在同一托管计划中更轻松地管理、部署和共享资源。
    • 一个 Azure 应用服务计划,用于定义你的函数应用的基础主机。
    • 一个标准 Azure 存储帐户,Functions 主机使用它来维护有关函数应用的状态和其他信息。
    • 一个连接到函数应用的 Application Insights 实例,用于跟踪应用中函数的使用。
    • 用户分配的托管标识,添加到新的默认主机存储帐户中的存储 Blob 数据参与者角色。

    创建函数应用并应用部署包后会显示通知。

    小窍门

    默认情况下,根据为函数应用输入的名称创建函数应用所需的 Azure 资源。 默认情况下,使用函数应用在同一个新资源组中创建资源。 如果要自定义关联资源的名称或重复使用现有资源,请使用高级创建选项发布项目

将项目部署到 Azure

重要

部署到现有函数应用程序时,总是会覆盖该应用程序在 Azure 中的所有内容。

  1. 在命令面板中,输入并选择“Azure Functions: 部署到函数应用”。

  2. 选择你刚才创建的函数应用。 当系统提示覆盖以前的部署时,请选择“部署”,将函数代码部署到新的函数应用资源。

  3. 部署完成后,选择“查看输出”,以查看创建和部署结果,其中包括已创建的 Azure 资源。 如果错过了通知,请选择右下角的铃铛图标再次查看。

    “视图输出”窗口的屏幕截图。

在 Azure 中测试函数

  1. “输出 ”面板复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 必须采用以下格式:

    https://<functionappname>.chinacloudsites.cn/api/HelloOrchestration_HttpStart

  2. 将此 HTTP 请求的新 URL 粘贴到浏览器的地址栏中。 使用已发布的应用时,必须获得与之前相同的状态响应。

后续步骤

你已使用 Visual Studio Code 创建和发布 C# 持久函数应用。

本文介绍如何使用 Visual Studio 2022 在本地创建和测试“hello world”持久函数。 此函数协调对其他函数的调用并链接在一起。 然后将函数代码发布到 Azure。 这些工具作为 Visual Studio 2022 中 Azure 开发工作负载的一部分提供。

Visual Studio 2019 窗口的屏幕截图,其中包含持久函数。

先决条件

若要完成本教程,

  • 安装 Visual Studio 2022。 确保还安装了“Azure 开发”工作负荷。 Visual Studio 2019 还支持 Durable Functions 开发,但 UI 和步骤不同。

  • 验证是否已安装并运行 Azurite 模拟器

如果没有 Azure 订阅,可在开始前创建一个试用帐户

创建函数应用项目

Azure Functions 模板创建可发布到 Azure 中的函数应用的项目。 函数应用可将函数分组为逻辑单元,以便更轻松地管理、部署、缩放和共享资源。

  1. 在 Visual Studio 中,从“文件”菜单中选择“>项目”。

  2. 在“ 创建新项目 ”对话框中,搜索 functions,选择 Azure Functions 模板,然后选择“ 下一步”。

    用于在 Visual Studio 中创建函数的新项目对话框的屏幕截图。

  3. 输入项目 的项目名称 ,然后选择“ 确定”。 项目名称必须可以充当 C# 命名空间,因此请勿使用下划线、连字符或非字母数字字符。

  4. “其他信息”下,使用图像后面的表中指定的设置。

    在 Visual Studio 中创建新的 Azure Functions 应用程序对话框的屏幕截图。

    设置 建议值 Description
    Functions 辅助角色 .NET 6 创建支持 .NET 6 和 Azure Functions 运行时 4.0 的函数项目。 有关详细信息,请参阅如何指向 Azure Functions 运行时版本
    功能 创建一个空的函数应用程序。
    存储帐户 存储模拟器 持久函数状态管理需要存储帐户。
  5. 选择“ 创建 ”以创建空函数项目。 此项目包含运行函数所需的基本配置文件。

将函数添加到应用

以下步骤使用模板在项目中创建持久函数代码。

  1. 右键单击 Visual Studio 中的项目,然后选择“ 添加新>的 Azure 函数”。

    “添加新函数”的屏幕截图。

  2. 验证是否已从“添加”菜单中选择 Azure Function ,输入 C# 文件的名称,然后选择“ 添加”。

  3. 选择 Durable Functions 编排 模板,然后选择 添加

    选择持久模板的屏幕截图。

新的持久函数已添加到应用中。 打开新的 .cs 文件以查看内容。 此持久函数是使用以下方法的简单函数链接示例:

方法 函数名称 Description
RunOrchestrator <file-name> 管理持久编排。 在这种情况下,编排流程将启动,创建一个列表,并将三个函数调用的结果添加到列表中。 完成三个函数调用后,它将返回列表。
SayHello <file-name>_Hello 该函数返回一个问候。 它是包含正在协调的业务逻辑的函数。
HttpStart <file-name>_HttpStart 一个由HTTP 触发的函数,它启动编排实例并返回检查状态响应。

现在您已经创建了函数项目和持久函数,可以在本地计算机上测试它。

在本地测试函数

Azure Functions Core Tools 允许在本地开发计算机上运行 Azure Functions 项目。 当你首次从 Visual Studio 启动某个函数时,系统会提示你安装这些工具。

  1. 若要测试函数,请按 F5。 如果系统提示,请接受来自 Visual Studio 的请求以下载并安装 Azure Functions Core (CLI) 工具。 可能还需要启用防火墙例外,以便工具可以处理 HTTP 请求。

  2. 从 Azure Functions 运行时输出复制函数的 URL。

    Azure 本地运行时的屏幕截图。

  3. 将 HTTP 请求的 URL 粘贴到浏览器的地址栏中并执行请求。 下面显示了浏览器中对函数返回的本地 GET 请求的响应:

    浏览器窗口的屏幕截图,其中已调用 statusQueryGetUri。

    响应是 HTTP 函数的初始结果,告知我们持久业务流程已成功启动。 它尚不是协调的最终结果。 响应中包括了几个有用的 URL。 现在,我们查询编排的状态。

  4. 复制 URL 值 statusQueryGetUri,将其粘贴到浏览器的地址栏中,并执行请求。

    请求将查询业务流程实例以获取状态。 你必须得到一个最终响应,其格式如下。 此输出显示实例已完成,并包括持久函数的输出或结果。

    {
        "name": "Durable",
        "instanceId": "d495cb0ac10d4e13b22729c37e335190",
        "runtimeStatus": "Completed",
        "input": null,
        "customStatus": null,
        "output": [
            "Hello Tokyo!",
            "Hello Seattle!",
            "Hello London!"
        ],
        "createdTime": "2019-11-02T07:07:40Z",
        "lastUpdatedTime": "2019-11-02T07:07:52Z"
    }
    
  5. 若要停止调试,请按 Shift + F5

确认该函数可以在本地计算机上正确运行以后,即可将项目发布到 Azure。

将项目发布到 Azure

在发布项目之前,必须在 Azure 订阅中拥有函数应用。 可以直接从 Visual Studio 创建函数应用。

  1. 解决方案资源管理器中,右键单击该项目,然后选择“ 发布”。

  2. “发布 ”页上,进行以下选择:

    • “目标”上,选择 “Azure”,然后选择“ 下一步”。
    • “特定目标”上,选择 “Azure Function App”,然后选择“ 下一步”。
    • Functions 实例上,选择“ 新建”。

    “发布”页的屏幕截图。在“Functions 实例”部分中,资源组可见,并突出显示了“新建”。

  3. 使用下表中指定的值创建新实例:

    设置 价值 Description
    名称 全局唯一名称 该名称必须唯一标识新的函数应用。 接受建议的名称或输入新名称。 以下字符有效: a-z0-9-
    订阅名称 订阅的名称 函数应用是在 Azure 订阅中创建的。 接受默认订阅或从列表中选择其他订阅。
    资源组 资源组的名称 函数应用在资源组中创建。 选择“新建”来创建一个新的资源组。 还可以从列表中选择现有的资源组。
    计划类型 弹性消耗 当您将项目发布到运行在 Flex Consumption 计划中的函数应用时,您可能只需为函数应用的执行次数付费。 其他托管计划可能会产生更高的成本。
    重要提示:
    创建弹性消耗计划时,必须先选择 应用服务计划 ,然后重新选择 Flex Consumption 以清除对话框的问题。
    操作系统 Linux Flex 消耗计划当前需要 Linux。
    位置 应用服务的位置 选择 弹性消耗计划支持的 Azure 区域中的位置。 选择不受支持的区域时, “创建 ”按钮灰显。
    实例内存大小 2048 运行应用的 虚拟机实例的内存大小 对于 Flex Consumption 计划是唯一的。
    Azure 存储 常规用途存储帐户 Functions 运行时需要存储帐户。 选择“新建”即可配置常规用途存储帐户。 还可以使用满足 存储帐户要求的现有帐户
    Application Insights Application Insights 实例 应为函数应用启用 Application Insights 集成。 选择“新建”以在新的或现有的 Log Analytics 工作区中创建新实例。 还可以使用现有实例。

    “函数应用创建新”对话框的屏幕截图。填写名称、订阅、资源组、计划和其他设置的字段。

  4. 选择“创建”,在 Azure 中创建一个函数应用及其相关资源。 资源创建的状态显示在窗口左下角。

  5. 选择完成。 此时会显示 “发布配置文件创建进度 ”窗口。 创建配置文件时,选择“ 关闭”。

  6. 在发布配置文件页上,选择 “发布 ”将包含项目文件的包部署到 Azure 中的新函数应用。

    部署完成后,Azure 中的函数应用的根 URL 将显示在发布配置文件页上。

  7. 在发布配置文件页上,导航至“主机托管”部分。 选择省略号 (...),然后选择“ 在 Azure 门户中打开”。 新的函数应用 Azure 资源将在 Azure 门户中打开。

    “发布配置文件”页的屏幕截图。在“托管”部分,省略号快捷菜单已打开,且 Azure 门户中的“打开”按钮突出显示。

在 Azure 中测试函数

  1. 从“发布配置文件”页复制函数应用的基础 URL。 将您在本地测试函数时使用的 URL 中的localhost:port部分替换为新的基 URL。

    调用持久函数 HTTP 触发器的 URL 必须采用以下格式:

    https://<APP_NAME>.chinacloudsites.cn/api/<FUNCTION_NAME>_HttpStart

  2. 将此 HTTP 请求的新 URL 粘贴到浏览器的地址栏中。 使用已发布的应用时,必须获得与之前相同的状态响应。

后续步骤

你已使用 Visual Studio 创建和发布 C# 持久函数应用。