使用 JavaScript 创建你的第一个持久函数

Durable FunctionsAzure Functions 的一个扩展,可用于在无服务器环境中编写有状态函数。 该扩展可用于管理状态、检查点和重启。

本文介绍了如何使用 Visual Studio Code Azure Functions 扩展在本地创建并测试“hello world”持久函数。 此函数将协调对其他函数的调用并将其链接在一起。 然后将函数代码发布到 Azure。

重要

本文的内容根据你在此页顶部的选择器中选择的 Node.js 编程模型而异。 v4 模型目前处于预览状态,旨在为 JavaScript 和 TypeScript 开发人员提供更为灵活和直观的体验。 在升级指南中详细了解 v3 和 v4 之间的差异。

Screenshot of an Edge window. The window shows the output of invoking a simple durable function in Azure.

先决条件

为完成此教程:

  • Durable Functions 需要一个 Azure 存储帐户。 需要一个 Azure 订阅。
  • 确保已安装 Node.js 版本 16.x+。
  • 确保已安装 Node.js 版本 18.x+。

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

创建本地项目

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

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

    Screenshot of the Visual Studio Code command palette. The command titled

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

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

    Prompt 说明
    选择函数应用项目的语言 JavaScript 创建本地 Node.js Functions 项目。
    选择 JavaScript 编程模型 模型 V3 选择 V3 编程模型。
    选择版本 Azure 函数 v4 仅当尚未安装 Core Tools 时,才会出现此选项。 在本例中,当你首次运行应用时即已安装 Core Tools。
    为项目的第一个函数选择模板 暂时跳过
    选择打开项目的方式 在当前窗口中打开 在所选的文件夹中重新打开 VS Code。
  1. 按照提示提供以下信息:

    Prompt 说明
    选择函数应用项目的语言 JavaScript 创建本地 Node.js Functions 项目。
    选择 JavaScript 编程模型 模型 V4 选择 V4 编程模型。
    选择版本 Azure 函数 v4 仅当尚未安装 Core Tools 时,才会出现此选项。 在本例中,当你首次运行应用时即已安装 Core Tools。
    为项目的第一个函数选择模板 暂时跳过
    选择打开项目的方式 在当前窗口中打开 在所选的文件夹中重新打开 VS Code。

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

此外,还会在根文件夹中创建 package.json 文件。

安装 Durable Functions npm 包

若要在 Node.js 函数应用中使用 Durable Functions,请使用名为 durable-functions 的库。

若要使用 V4 编程模型,需要安装 durable-functions 的预览 v3.x 版。

  1. 使用“视图”菜单或按 Ctrl+Shift+`,在 VS Code 中打开新的终端。
  1. 通过运行函数应用的根目录中的 npm install durable-functions 来安装 durable-functions npm 包。
  1. 通过运行函数应用的根目录中的 npm install durable-functions@preview 来安装 durable-functions npm 包预览版。

创建函数

最基本的 Durable Functions 应用包含三个函数:

  • 业务流程协调程序函数 - 描述用于协调其他函数的工作流。
  • 活动函数 - 由业务流程协调程序函数调用,它会执行工作并选择性地返回一个值。
  • 客户端函数 - 用于启动业务流程协调程序函数的常规 Azure 函数。 本示例使用 HTTP 触发的函数。

业务流程协调程序函数

你将使用一个模板在项目中创建持久函数代码。

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

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

    Prompt 说明
    选择函数的模板 Durable Functions 业务流程协调程序 创建 Durable Functions 业务流程
    选择持久存储类型。 Azure 存储(默认) 选择用于 Durable Functions 的存储后端。
    提供函数名称 HelloOrchestrator 持久函数的名称

现已添加一个业务流程协调程序来协调活动函数。 打开 HelloOrchestrator/index.js 查看业务流程协调程序函数。 每次调用 context.df.callActivity 都会调用名为 Hello 的活动函数。

接下来,添加引用的 Hello 活动函数。

活动函数

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

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

    Prompt 说明
    选择函数的模板 Durable Functions 活动 创建活动函数
    提供函数名称 你好 活动函数的名称

现已添加业务流程协调程序调用的 Hello 活动函数。 打开 Hello/index.js,可以看到,该函数采用某个名称作为输入,并返回一句问候语。 活动函数是在工作流中执行“实际工作”的地方:执行数据库调用或执行一些非确定性计算等工作。

最后,添加一个启动业务流程的 HTTP 触发的函数。

客户端函数(HTTP 启动器)

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

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

    Prompt 说明
    选择函数的模板 Durable Functions HTTP 启动器 创建 HTTP 启动器函数
    提供函数名称 DurableFunctionsHttpStart 活动函数的名称
    授权级别 匿名 出于演示目的,请允许在不进行身份验证的情况下调用函数

现已添加一个启动业务流程的 HTTP 触发的函数。 打开 DurableFunctionsHttpStart/index.js,可以看到,该函数使用 client.startNew 启动新的业务流程。 然后,它使用 client.createCheckStatusResponse 返回 HTTP 响应,其中包含可用于监视和管理新业务流程的 URL。

现已创建一个可在本地运行并可部署到 Azure 的 Durable Functions 应用。

V4 编程模型的优点之一是可以灵活地写入函数。 在 V4 模型中,可以使用单个模板在项目中的一个文件中创建所有的三个函数。

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

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

    Prompt 说明
    选择函数的模板 Durable Functions 业务流程协调程序 使用 Durable Functions 业务流程、活动函数和 Durable Client starter 函数创建文件。
    选择持久存储类型 Azure 存储(默认) 选择用于 Durable Functions 的存储后端。
    提供函数名称 hello 用于持久函数的名称

打开 src/functions/hello.js 查看创建的函数。

现已创建一个名为 helloOrchestrator 的业务流程协调程序来协调活动函数。 每次调用 context.df.callActivity 都会调用名为 hello 的活动函数。

此外也已添加业务流程协调程序调用的 hello 活动函数。 在同个文件中可以看到,该函数采用某个名称作为输入,并返回一句问候语。 活动函数是在工作流中执行“实际工作”的地方:执行数据库调用或执行一些非确定性计算等工作。

最后,已添加一个启动业务流程的 HTTP 触发函数。 在同一文件中,可以看到该函数使用 client.startNew 启动新的业务流程。 然后,它使用 client.createCheckStatusResponse 返回 HTTP 响应,其中包含可用于监视和管理新业务流程的 URL。

现已创建一个可在本地运行并可部署到 Azure 的 Durable Functions 应用。

在本地测试函数

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

  1. 若要测试函数,请在 Hello 活动函数代码 (Hello/node.js) 中设置断点。 按 F5 或者在命令面板中选择 Debug: Start Debugging 以启动函数应用项目。 来自 Core Tools 的输出会显示在“终端” 面板中。
  1. 若要测试函数,请在 hello 活动函数代码(src/functions/hello.js)中设置断点。 按 F5 或者在命令面板中选择 Debug: Start Debugging 以启动函数应用项目。 来自 Core Tools 的输出会显示在“终端” 面板中。

注意

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

  1. Durable Functions 需要一个 Azure 存储帐户才能运行。 当 VS Code 提示选择存储帐户时,请选择“选择存储帐户”。

    Screenshot of a Visual Studio Code alert window. The window says

  2. 按照提示提供以下信息,以在 Azure 中创建新的存储帐户。

    Prompt 说明
    选择订阅 订阅的名称 选择 Azure 订阅
    选择存储帐户 新建存储帐户
    输入新存储帐户的名称 唯一名称 要创建的存储帐户的名称
    选择资源组 唯一名称 要创建的资源组名称
    选择一个位置 region 选择离你较近的区域
  3. 在“终端” 面板中,复制 HTTP 触发的函数的 URL 终结点。

    Screenshot of the Visual Studio code terminal panel. The terminal shows the output of running an Durable Functions app locally. The table titled

  1. 使用浏览器或者 PostmancURL 之类的工具向 URL 终结点发送一个 HTTP POST 请求。 将最后一个段替换为业务流程协调程序函数的名称 (HelloOrchestrator)。 URL 应类似于 http://localhost:7071/api/orchestrators/HelloOrchestrator
  1. 使用浏览器或者 PostmancURL 之类的工具向 URL 终结点发送一个 HTTP POST 请求。 将最后一个段替换为业务流程协调程序函数的名称 (helloOrchestrator)。 URL 应类似于 http://localhost:7071/api/orchestrators/helloOrchestrator

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

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

    请求将查询业务流程实例的状态。 你应该会得到一个最终响应,它显示实例已经完成,并包含持久函数的输出或结果。 输出如下所示:

    {
        "name": "HelloOrchestrator",
        "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"
    }
    
    {
        "name": "helloOrchestrator",
        "instanceId": "6ba3f77933b1461ea1a3828c013c9d56",
        "runtimeStatus": "Completed",
        "input": "",
        "customStatus": null,
        "output": [
            "Hello, Tokyo",
            "Hello, Seattle",
            "Hello, Cairo"
        ],
        "createdTime": "2023-02-13T23:02:21Z",
        "lastUpdatedTime": "2023-02-13T23:02:25Z"
    }
    
  2. 若要停止调试,请在 VS Code 中按 Shift + F5

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

登录 Azure

在发布应用之前,必须先登录到 Azure。

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

    Screenshot of the sign-in to Azure window within VS Code.

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

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

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

在 Azure 中创建函数应用

在本部分中,你将在 Azure 订阅中创建函数应用和相关的资源。

  1. 在活动栏中选择 Azure 图标。 然后在“资源”区域中,选择 + 图标,然后选择“在 Azure 中创建函数应用”选项。

    Create a resource in your Azure subscription

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

    Prompt 选择
    选择订阅 选择要使用的订阅。 如果你在“资源”下只有一个订阅可见,则你不会看到此提示。
    输入函数应用的全局唯一名称 键入在 URL 路径中有效的名称。 将对你键入的名称进行验证,以确保其在 Azure Functions 中是唯一的。
    选择一个运行时堆栈 选择你一直在本地运行的语言版本。
    选择新资源的位置 为了获得更好的性能,请选择你附近的区域

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

    Log of Azure resource creation

  3. 创建完成时,会在你的订阅中创建以下 Azure 资源。 资源基于你的函数应用名称进行命名:

    • 一个资源组:相关资源的逻辑容器。
    • 一个标准 Azure 存储帐户:用于维护项目的状态和其他信息。
    • 一个函数应用:提供用于执行函数代码的环境。 可以通过函数应用将函数分组为逻辑单元,以便在同一托管计划中更轻松地管理、部署和共享资源。
    • 一个应用服务计划:用于你的函数应用的基础主机。
    • 一个连接到函数应用的 Application Insights 实例,用于跟踪你的函数在应用中的使用情况。

    创建函数应用并应用了部署包之后,会显示一个通知。

    提示

    默认情况下,会根据你提供的函数应用名称创建函数应用所需的 Azure 资源。 默认情况下,还会在函数应用所在的新资源组中创建这些资源。 如果要自定义这些资源的名称或重复使用现有资源,则需要使用高级创建选项来发布项目

将项目部署到 Azure

重要

部署到现有函数应用将始终覆盖该应用在 Azure 中的内容。

  1. 在活动栏中选择 Azure 图标,然后在“工作区”区域中选择你的项目文件夹,并选择“部署...”按钮。

    Deploy project from the Visual Studio Code workspace

  2. 选择“部署到函数应用...”,然后选择刚刚创建的函数应用,选择“部署”。

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

    Screenshot of the View Output window.

在 Azure 中测试函数

注意

若要使用 V4 节点编程模型,请确保应用至少在 4.25 版 Azure Functions 运行时上运行。

  1. 从“输出” 面板复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 应采用此格式:http://<functionappname>.chinacloudsites.cn/api/orchestrators/HelloOrchestrator
  1. 从“输出” 面板复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 应采用此格式:http://<functionappname>.chinacloudsites.cn/api/orchestrators/helloOrchestrator
  1. 将 HTTP 请求的这个新 URL 粘贴到浏览器的地址栏中。 你应当会得到与之前使用已发布的应用时相同的状态响应。

后续步骤

你已使用 Visual Studio Code 创建并发布了一个 JavaScript 持久函数应用。