快速入门:创建 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 应用的屏幕截图。

注意

本快速入门使用基于修饰器的 Python v2 编程模型。 此模型提供更简单的文件结构,与 v1 相比,它以代码为中心。

先决条件

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

如果没有 Azure 帐户,请在开始前创建一个免费帐户

创建本地项目

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

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

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

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

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

    提示 操作 说明
    选择函数应用项目的语言 选择“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。

如果需要创建项目,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

注意

必须安装 azure-functions-durable v1.2.4 或更高版本。

创建自己的函数

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

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

示例代码

若要使用这 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/hello_orchestrator")
@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-durableBlueprint注册蓝图函数。 可以照常注册生成的蓝图。 可以使用我们的示例作为示例。

配置存储模拟器

可以使用 Azurite(一个适用于 Azure 存储的模拟器)在本地测试该函数。 在 local.settings.json 中,将 AzureWebJobsStorage 的值设置为 UseDevelopmentStorage=true,如以下示例所示:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "python"
  }
}

要在 Visual Studio Code 中安装并开始运行 Azurite 扩展,请在命令面板中输入“Azurite: Start”并选择 Enter

可以对 Durable Functions 应用使用其他存储选项。 有关存储选项及其优势的详细信息,请参阅 Durable Functions 存储提供程序

在本地测试函数

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

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

    注意

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

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

    Azure 本地输出的屏幕截图。

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

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

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

  4. 复制 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"
    }
    
  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 中创建函数应用

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

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

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

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

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

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

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

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

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

    提示

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

将项目部署到 Azure

重要

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

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

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

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

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

在 Azure 中测试函数

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

    https://<functionappname>.azurewebsites.net/api/orchestrators/hello_orchestrator

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

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

清理资源

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