快速入门:创建 Python Durable Functions 应用

使用 Durable Functions(Azure Functions 的一项功能)在无服务器环境中编写有状态函数。 可以通过在 Visual Studio Code 中安装 Azure Functions 扩展来安装 Durable Functions。 此扩展管理应用程序中的状态、检查点和重启。

在本快速入门中,你将使用 Visual Studio Code 中的 Durable Functions 扩展在 Azure Functions 中以本地方式创建并测试“hello world”Durable Functions 应用。 Durable Functions 应用会协调对其他函数的调用并将其链接在一起。 接下来,将函数代码发布到 Azure。 使用的工具可通过 Visual Studio Code 扩展获得。

Azure 中运行的 Durable Functions 应用的屏幕截图。

先决条件

若要完成本快速入门,你需要:

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

创建本地项目

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

  1. 在 Visual Studio Code 中,按 F1(或按 Ctrl/Cmd+Shift+P)打开命令面板。 在提示符 (>) 处输入命令,然后选择“Azure Functions: 创建新项目”

    “创建函数”窗口的屏幕截图。

  2. 选择浏览。 在“选择文件夹”对话框中,转到要用于项目的文件夹,然后选择“选择”

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

    Prompt 操作 说明
    选择函数应用项目的语言 选择“Python” 创建本地 Python Functions 项目。
    选择版本 选择“Azure Functions v4” 只有在尚未安装 Core Tools 的情况下,才会出现此选项。 在本例中,当你首次运行应用时,即已安装 Core Tools。
    Python 版本 选择 Python 3.7、Python 3.8、Python 3.9 或 Python 3.10 Visual Studio Code 使用所选版本创建虚拟环境。
    为项目的第一个函数选择模板 选择“暂时跳过”。
    选择打开项目的方式 选择“在当前窗口中打开”。 在所选的文件夹中打开 Visual Studio Code。
  1. 根据提示提供以下信息:

    Prompt 说明
    选择一种语言 选择“Python(编程模型 V2)” 使用 V2 编程模型创建本地 Python Functions 项目。
    选择版本 选择“Azure Functions v4” 只有在尚未安装 Core Tools 的情况下,才会出现此选项。 在本例中,当你首次运行应用时,即已安装 Core Tools。
    Python 版本 选择 Python 3.7、Python 3.8、Python 3.9 或 Python 3.10 Visual Studio Code 使用所选版本创建虚拟环境。
    选择打开项目的方式 选择“在当前窗口中打开”。 在所选的文件夹中打开 Visual Studio Code。

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

此外,还会在根文件夹中创建 requirements.txt 文件。 它指定运行函数应用所需的 Python 包。

从 PyPI 安装 azure-functions-durable

创建项目后,Azure Functions Visual Studio Code 扩展会自动使用所选的 Python 版本创建虚拟环境。 需要在终端中激活该虚拟环境,并安装 Azure Functions 和 Durable Functions 所需的某些依赖项。

  1. 在编辑器中打开 requirements.txt 并将其内容更改为以下代码:

    azure-functions
    azure-functions-durable
    
  2. 在当前文件夹中,打开编辑器的集成终端 (Ctrl+Shift+`)。

  3. 在集成终端中,根据操作系统激活当前文件夹中的虚拟环境。

    source .venv/bin/activate
    

然后,在已激活虚拟环境的集成终端中,使用 pip 安装定义的包。

python -m pip install -r requirements.txt

创建自己的函数

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

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

业务流程协调程序函数

使用一个模板在项目中创建 Durable Functions 应用代码。

  1. 在命令面板中,输入内容,然后选择“Azure Functions: 创建函数”

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

    Prompt 操作 说明
    选择函数的模板 选择“Durable Functions 业务流程协调程序” 创建 Durable Functions 应用业务流程。
    提供函数名称 选择“HelloOrchestrator” 持久函数的名称。

你已添加了一个业务流程协调程序来协调活动函数。 打开 HelloOrchestrator/__init__.py 查看业务流程协调程序函数。 每次调用 context.call_activity 都会调用名为 Hello 的活动函数。

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

活动函数

  1. 在命令面板中,输入内容,然后选择“Azure Functions: 创建函数”

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

    Prompt 操作 说明
    选择函数的模板 选择“Durable Functions 活动” 创建活动函数。
    提供函数名称 输入“Hello” 活动函数的名称。

现已添加业务流程协调程序调用的 Hello 活动函数。 打开 Hello/__init__.py,可以看到,该函数采用某个名称作为输入,并返回一句问候语。 在活动函数中执行操作,例如,发出数据库调用或执行计算。

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

客户端函数(HTTP 启动器)

  1. 在命令面板中,输入内容,然后选择“Azure Functions: 创建函数”

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

    Prompt 操作 说明
    选择函数的模板 选择“Durable Functions HTTP 启动器” 创建 HTTP 启动器函数。
    提供函数名称 输入“DurableFunctionsHttpStart” 客户端函数的名称
    授权级别 选择“匿名” 出于演示目的,该值允许在不使用身份验证的情况下调用函数。

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

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

要求

Python 编程模型的版本 2 需要以下最低版本:

启用 v2 编程模型

运行 v2 编程模型需要以下应用程序设置:

  • 名称AzureWebJobsFeatureFlags
  • EnableWorkerIndexing

如果使用 Azure Functions Core Tools 在本地运行,则应将此设置添加到 local.settings.json 文件中。 如果要在 Azure 中运行,请使用相关工具完成这些步骤:

<FUNCTION_APP_NAME><RESOURCE_GROUP_NAME> 分别替换为函数应用名称和资源组名称。

az functionapp config appsettings set --name <FUNCTION_APP_NAME> --resource-group <RESOURCE_GROUP_NAME> --settings AzureWebJobsFeatureFlags=EnableWorkerIndexing

若要使用这 3 种函数类型创建基本的 Durable Functions 应用程序,请将 function_app.py 的内容替换为以下 Python 代码:

import azure.functions as func
import azure.durable_functions as df

myApp = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)

# An HTTP-triggered function with a Durable Functions client binding
@myApp.route(route="orchestrators/{functionName}")
@myApp.durable_client_input(client_name="client")
async def http_start(req: func.HttpRequest, client):
    function_name = req.route_params.get('functionName')
    instance_id = await client.start_new(function_name)
    response = client.create_check_status_response(req, instance_id)
    return response

# Orchestrator
@myApp.orchestration_trigger(context_name="context")
def hello_orchestrator(context):
    result1 = yield context.call_activity("hello", "Seattle")
    result2 = yield context.call_activity("hello", "Tokyo")
    result3 = yield context.call_activity("hello", "London")

    return [result1, result2, result3]

# Activity
@myApp.activity_trigger(input_name="city")
def hello(city: str):
    return f"Hello {city}"

请查看下表,了解每个函数及其在示例中的用途的说明:

方法 说明
hello_orchestrator 描述工作流的业务流程协调程序函数。 在这种情况下,业务流程将启动,按顺序调用三个函数,然后返回列表中所有 3 个函数的有序结果。
hello 执行正在协调的工作的活动函数。 该函数将返回作为参数传递的城市的简单问候语。
http_start HTTP 触发的函数,用于启动业务流程的实例并返回 check status 响应。

注意

Durable Functions 还支持 Python v2 的蓝图。 若要使用蓝图,请使用 azure-functions-durable Blueprint 注册蓝图函数。 可以照常注册生成的蓝图。 可以使用我们的示例作为示例。

在本地测试函数

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

  1. 若要测试函数,请在 Hello 活动函数代码中(在 Hello/__init__.py 中)设置断点。 按 F5 或者在命令面板中选择“调试: 开始调试”启动函数应用项目。 Core Tools 的输出会显示在终端面板中。

    注意

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

  1. 若要测试函数,请在 hello 活动函数代码中设置一个断点。 按 F5 或者在命令面板中选择“调试: 开始调试”启动函数应用项目。 Core Tools 的输出会显示在终端面板中。

    注意

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

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

    显示如何创建存储帐户的屏幕截图。

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

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

    Azure 本地输出的屏幕截图。

  1. 使用浏览器或 HTTP 测试工具向 URL 终结点发送 HTTP POST 请求。

    将最后一个段替换为业务流程协调程序函数的名称 (HelloOrchestrator)。 URL 应类似于 http://localhost:7071/api/orchestrators/HelloOrchestrator

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

  2. 复制 statusQueryGetUri 的 URL 值,将其粘贴到浏览器的地址栏中,然后执行请求。 还可以继续使用 HTTP 测试工具发出 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"
    }
    
  1. 使用浏览器或 HTTP 测试工具向 URL 终结点发送 HTTP POST 请求。

    将最后一个段替换为业务流程协调程序函数的名称 (HelloOrchestrator)。 URL 应类似于 http://localhost:7071/api/orchestrators/HelloOrchestrator

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

  2. 复制 statusQueryGetUri 的 URL 值,将其粘贴到浏览器的地址栏中,然后执行请求。 还可以继续使用 HTTP 测试工具发出 GET 请求。

    请求将查询业务流程实例的状态。 应该会看到实例已完成,并且它包含持久函数的输出或结果。 它如以下示例所示:

    {
        "name": "hello_orchestrator",
        "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"
    }
    
  1. 若要停止调试,请在 Visual Studio Code 中选择 Shift+F5。

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

登录 Azure

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

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

    VS Code 中的“登录到 Azure”窗口的屏幕截图。

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

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

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

在 Azure 中创建函数应用

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

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

    在 Azure 订阅中创建资源

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

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

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

    Azure 资源创建日志

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

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

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

    提示

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

将项目部署到 Azure

重要

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

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

    从 Visual Studio Code 工作区部署项目

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

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

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

在 Azure 中测试函数

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

    https://<functionappname>.chinacloudsites.cn/api/orchestrators/HelloOrchestrator

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

    https://<functionappname>.chinacloudsites.cn/api/orchestrators/hello_orchestrator

  1. 将 HTTP 请求的这个新 URL 粘贴到浏览器的地址栏中。 使用已发布的应用时,可以获得与本地测试相同的状态响应。

你使用 Visual Studio Code 创建和发布的 Python Durable Functions 应用已可供使用。

清理资源

如果你不再需要为完成本快速入门而创建的资源,为避免在 Azure 订阅中产生相关费用,请删除资源组和所有相关资源。