使用 Azure 门户创建 Durable Functions

Azure Functions 的 Durable Functions 扩展是在 NuGet 包 Microsoft.Azure.WebJobs.Extensions.DurableTask 中提供的。 此扩展必须安装在函数应用中。 本文介绍如何安装此包,以便在 Azure 门户中开发 Durable Functions。

注意

创建函数应用

必须使用函数应用托管任何函数的执行。 函数应用可将函数分组为逻辑单元,以便更轻松地管理、部署、缩放和共享资源。 你可以创建 .NET 或 JavaScript 应用。

  1. 在 Azure 门户菜单上或在门户主页中,选择“创建资源”。

  2. “新建” 页面,选择 “计算”>“函数应用”

  3. 在“基本信息”页面上,按照下列所述使用函数应用设置:

    设置 建议值 描述
    订阅 你的订阅 将在其中创建新函数应用的订阅。
    资源组 myResourceGroup 将在其中创建函数应用的新资源组的名称。 你需要创建新的资源组,因为在现有资源组中创建新函数应用时存在已知限制
    函数应用名称 全局唯一名称 用于标识新 Function App 的名称。 有效字符为 a-z(不区分大小写)、0-9-
    发布 代码 用于发布代码文件或 Docker 容器的选项。
    运行时堆栈 首选语言 选择支持你喜欢的函数编程语言的运行时。 门户中编辑仅适用于 JavaScript、PowerShell、TypeScript 和 C# 脚本。 C# 类库、Java 和 Python 函数必须在本地开发
    版本 版本号 选择已安装的运行时的版本。
    区域 首选区域 选择与你靠近或者与函数可以访问的其他服务靠近的区域
  4. 选择“下一步: 托管”。 在“托管”页面上,输入以下设置:

    设置 建议值 说明
    存储帐户 全局唯一名称 创建函数应用使用的存储帐户。 存储帐户名称必须为 3 到 24 个字符,并且只能包含数字和小写字母。 也可使用现有帐户,但该帐户必须符合存储帐户要求
    操作系统 Windows 系统会根据你的运行时堆栈选择为你预先选择一个操作系统,但你可以根据需要更改该设置。 仅在 Windows 上支持门户内编辑。
    计划 消耗(无服务器) 定义如何将资源分配给 Function App 的托管计划。 在默认的消耗计划中,根据函数需求动态添加资源。 在此无服务器托管中,只需为函数运行时间付费。 按应用服务计划运行时,必须管理函数应用的缩放
  5. 选择“下一步: 监视”。 在“监视”页面上,输入以下设置:

    设置 建议值 说明
    Application Insights 默认 在最近的受支持的区域中,创建一个具有相同应用名称的 Application Insights 资源。 通过展开此设置或选择“新建”,可以更改 Application Insights 名称或在 Azure 地理位置中选择要存储数据的其他区域。
  6. 选择“查看 + 创建”,以便查看应用配置选择。

  7. 在“查看 + 创建”页上查看设置,然后选择“创建”来预配并部署函数应用 。

  8. 选择门户右上角的“通知”图标,留意是否显示了“部署成功”消息。

  9. 选择“转到资源”,查看新的函数应用。 还可选择“固定到仪表板”。 固定可以更轻松地从仪表板返回此函数应用资源。

    Screenshot of deployment notification.

默认情况下,创建的函数应用使用 2.x 版 Azure Functions 运行时。 Durable Functions 扩展在 C# 中能够在 1.x 和 2.x 版 Azure Functions 运行时上工作,在 JavaScript 中能够在 2.x 版上工作。 但是,无论选择哪种语言,只有在以 2.x 版运行时为目标时,才能使用模板。

安装 Durable Functions npm 程序包(仅限 JavaScript)

如果要创建 JavaScript Durable Functions,需要安装 durable-functions npm 程序包

  1. 从函数应用的页面中,选择左侧窗格中“开发工具”下的“高级工具”。

    Functions platform features choose Kudu

  2. 在“高级工具”页中,选择“Go”。

  3. 在 Kudu 控制台中,选择“调试控制台”,然后选择“CMD”。

    Kudu debug console

  4. 此时应当会显示你的函数应用的文件目录结构。 导航到 site/wwwroot 文件夹。 在这里,可以通过将 package.json 文件拖放到文件目录窗口中来将其上传。 下面是一个示例 package.json

    {
      "dependencies": {
        "durable-functions": "^1.3.1"
      }
    }
    

    Kudu upload package.json

  5. 上传你的 package.json 后,从 Kudu 远程执行控制台中运行 npm install 命令。

    Kudu run npm install

创建一个业务流程协调程序函数

  1. 在函数应用中,从左窗格中选择“函数”,然后从顶部菜单中选择“添加”。

  2. 在“新建函数”页的搜索字段中,输入 durable,然后选择“Durable Functions HTTP 初学者”模板。

    Select Durable Functions HTTP starter

  3. 对于新函数名称,请输入 HttpStart,然后选择“创建函数”。

    创建的函数用于启动业务流程。

  4. 在函数应用中创建另一函数,这次使用“Durable Functions 业务流程协调程序”模板。 将新的业务流程函数命名为 HelloSequence

  5. 使用“Durable Functions 活动”模板创建第三个函数(名为 Hello)。

测试持久函数业务流程

  1. 返回到 HttpStart 函数,选择“获取函数 URL”,然后选择“复制到剪贴板”图标以复制该 URL。 请使用此 URL 启动 HelloSequence 函数。

  2. 使用 HTTP 工具(例如 Postman 或 cURL)将 POST 请求发送到已复制的 URL。 以下示例是一个 cURL 命令,该命令将 POST 请求发送到持久函数:

    curl -X POST https://{your-function-app-name}.chinacloudsites.cn/api/orchestrators/{functionName} --header "Content-Length: 0"
    

    在此示例中,{your-function-app-name} 是作为函数应用名称的域,{functionName} 是 HelloSequence 业务流程协调程序函数。 响应消息包含一组 URI 终结点,这些终结点可以用来监视并管理执行,该执行如以下示例所示:

    {  
       "id":"10585834a930427195479de25e0b952d",
       "statusQueryGetUri":"https://...",
       "sendEventPostUri":"https://...",
       "terminatePostUri":"https://...",
       "rewindPostUri":"https://..."
    }
    
  3. 调用 statusQueryGetUri 终结点 URI,此时会看到持久函数的当前状态,如以下示例所示:

        {
            "runtimeStatus": "Running",
            "input": null,
            "output": null,
            "createdTime": "2017-12-01T05:37:33Z",
            "lastUpdatedTime": "2017-12-01T05:37:36Z"
        }
    
  4. 继续调用 statusQueryGetUri 终结点,直到状态更改为“Completed”,此时会看到一个响应,如以下示例所示:

    {
            "runtimeStatus": "Completed",
            "input": null,
            "output": [
                "Hello Tokyo!",
                "Hello Seattle!",
                "Hello London!"
            ],
            "createdTime": "2017-12-01T05:38:22Z",
            "lastUpdatedTime": "2017-12-01T05:38:28Z"
        }
    

现已在 Azure 中启动并运行第一个持久函数。

后续步骤