你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
快速入门:创建 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 扩展获得。
先决条件
若要完成本快速入门,你需要:
已安装 Visual Studio Code。
已安装 Visual Studio Code 扩展 Azure Functions。
已安装 Azure Functions Core Tools 的最新版本。
一个 HTTP 测试工具,用于保护数据安全。 有关详细信息,请参阅 HTTP 测试工具。
Azure 订阅。 若要使用 Durable Functions,必须具有 Azure 存储帐户。
已安装 Python 3.7、3.8、3.9 或 3.10 版本。
如果没有 Azure 订阅,请在开始之前创建一个 Azure 免费帐户。
创建本地项目
在本部分,你将使用 Visual Studio Code 创建一个本地 Azure Functions 项目。
在 Visual Studio Code 中,按 F1(或按 Ctrl/Cmd+Shift+P)打开命令面板。 在提示符 (
>
) 处输入命令,然后选择“Azure Functions: 创建新项目”。选择浏览。 在“选择文件夹”对话框中,转到要用于项目的文件夹,然后选择“选择”。
根据提示提供以下信息:
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。
根据提示提供以下信息:
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.json 和 local.settings.json 配置文件。
此外,还会在根文件夹中创建 requirements.txt 文件。 它指定运行函数应用所需的 Python 包。
从 PyPI 安装 azure-functions-durable
创建项目后,Azure Functions Visual Studio Code 扩展会自动使用所选的 Python 版本创建虚拟环境。 需要在终端中激活该虚拟环境,并安装 Azure Functions 和 Durable Functions 所需的某些依赖项。
在编辑器中打开 requirements.txt 并将其内容更改为以下代码:
azure-functions azure-functions-durable
在当前文件夹中,打开编辑器的集成终端 (Ctrl+Shift+`)。
在集成终端中,根据操作系统激活当前文件夹中的虚拟环境。
然后,在已激活虚拟环境的集成终端中,使用 pip 安装定义的包。
python -m pip install -r requirements.txt
创建自己的函数
最基本的 Durable Functions 应用包含三个函数:
- 业务流程协调程序函数:用于协调其他函数的工作流。
- 活动函数:由业务流程协调程序函数调用的函数,它会执行工作并选择性地返回一个值。
- 客户端函数:Azure 中用于启动业务流程协调程序函数的常规函数。 本示例使用 HTTP 触发的函数。
业务流程协调程序函数
使用一个模板在项目中创建 Durable Functions 应用代码。
在命令面板中,输入内容,然后选择“Azure Functions: 创建函数”。
根据提示提供以下信息:
Prompt 操作 说明 选择函数的模板 选择“Durable Functions 业务流程协调程序”。 创建 Durable Functions 应用业务流程。 提供函数名称 选择“HelloOrchestrator”。 持久函数的名称。
你已添加了一个业务流程协调程序来协调活动函数。 打开 HelloOrchestrator/__init__.py 查看业务流程协调程序函数。 每次调用 context.call_activity
都会调用名为 Hello
的活动函数。
接下来,请添加引用的 Hello
活动函数。
活动函数
在命令面板中,输入内容,然后选择“Azure Functions: 创建函数”。
根据提示提供以下信息:
Prompt 操作 说明 选择函数的模板 选择“Durable Functions 活动”。 创建活动函数。 提供函数名称 输入“Hello”。 活动函数的名称。
现已添加业务流程协调程序调用的 Hello
活动函数。 打开 Hello/__init__.py,可以看到,该函数采用某个名称作为输入,并返回一句问候语。 在活动函数中执行操作,例如,发出数据库调用或执行计算。
最后,添加一个启动业务流程的 HTTP 触发的函数。
客户端函数(HTTP 启动器)
在命令面板中,输入内容,然后选择“Azure Functions: 创建函数”。
根据提示提供以下信息:
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 需要以下最低版本:
- Azure Functions 运行时 v4.16+
- Azure Functions Core Tools v4.0.5095+(如果在本地运行)
- azure-functions-durable v1.2.4+
启用 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 中启动某个函数时,系统会提示你安装这些工具。
若要测试函数,请在
Hello
活动函数代码中(在 Hello/__init__.py 中)设置断点。 按 F5 或者在命令面板中选择“调试: 开始调试”启动函数应用项目。 Core Tools 的输出会显示在终端面板中。注意
有关调试的详细信息,请参阅 Durable Functions 诊断。
若要测试函数,请在
hello
活动函数代码中设置一个断点。 按 F5 或者在命令面板中选择“调试: 开始调试”启动函数应用项目。 Core Tools 的输出会显示在终端面板中。注意
有关调试的详细信息,请参阅 Durable Functions 诊断。
Durable Functions 需要一个 Azure 存储帐户才能运行。 当 Visual Studio Code 提示选择存储帐户时,请选择“选择存储帐户”。
在提示符处提供以下信息,以在 Azure 中创建新的存储帐户。
提示 操作 说明 选择订阅 选择你的订阅名称。 Azure 订阅。 选择存储帐户 选择“创建新存储帐户”。 输入新存储帐户的名称 输入唯一名称。 要创建的存储帐户的名称 选择资源组 输入唯一名称。 要创建的资源组名称。 选择位置 选择 Azure 区域。 选择离你近的区域。 在终端面板中,复制 HTTP 触发的函数的 URL 终结点。
使用浏览器或 HTTP 测试工具向 URL 终结点发送 HTTP POST 请求。
将最后一个段替换为业务流程协调程序函数的名称 (
HelloOrchestrator
)。 URL 应类似于http://localhost:7071/api/orchestrators/HelloOrchestrator
。响应是 HTTP 函数的初始结果。 它让你知道持久业务流程已成功启动。 它尚未显示业务流程的最终结果。 响应中包括了几个有用的 URL。 现在,查询业务流程的状态。
复制
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" }
使用浏览器或 HTTP 测试工具向 URL 终结点发送 HTTP POST 请求。
将最后一个段替换为业务流程协调程序函数的名称 (
HelloOrchestrator
)。 URL 应类似于http://localhost:7071/api/orchestrators/HelloOrchestrator
。响应是 HTTP 函数的初始结果。 它让你知道持久业务流程已成功启动。 它尚未显示业务流程的最终结果。 响应中包括了几个有用的 URL。 现在,查询业务流程的状态。
复制
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" }
- 若要停止调试,请在 Visual Studio Code 中选择 Shift+F5。
确认该函数可以在本地计算机上正确运行以后,即可将项目发布到 Azure。
登录 Azure
必须先登录到 Azure,然后才能创建 Azure 资源或发布应用。
如果你尚未登录,请在活动栏中选择 Azure 图标。 然后在“资源”下,选择“登录到 Azure”。
如果你已登录并可以看到你的现有订阅,请转到下一部分。 如果你没有 Azure 帐户,请选择“创建 Azure 帐户”。 学生可以选择“创建面向学生的 Azure 帐户”。
在浏览器中出现提示时,请选择你的 Azure 帐户,并使用你的 Azure 帐户凭据登录。 如果创建新帐户,你可以在创建帐户后登录。
成功登录后,可以关闭新的浏览器窗口。 属于你的 Azure 帐户的订阅显示在边栏中。
在 Azure 中创建函数应用
在本部分中,你将在 Azure 订阅中创建函数应用和相关的资源。 许多资源创建决策都是根据默认行为为你做出的。 要更好地控制已创建的资源,必须改为使用高级选项创建函数应用。
在 Visual Studio Code 中选择 F1 键,打开命令面板。 在提示符 (
>
) 处,输入并选择“Azure Functions: 在 Azure 中创建函数应用”。根据提示提供以下信息:
Prompt 操作 选择订阅 选择要使用的 Azure 订阅。 如果“资源”下只有一个订阅可见,则不会出现提示符。 输入函数应用的全局唯一名称 输入在 URL 路径中有效的名称。 系统将对你输入的名称进行验证,以确保其在 Azure Functions 中是唯一的。 选择一个运行时堆栈 选择当前本地运行的语言版本。 选择新资源的位置 选择 Azure 区域。 为了获得更好的性能,请选择你附近的区域。 在“Azure: 活动日志”面板中,Azure 扩展将显示在 Azure 中创建的各个资源的状态。
创建函数应用时,系统将在你的 Azure 订阅中创建以下相关资源。 资源基于你为函数应用输入的名称命名。
- 一个资源组:相关资源的逻辑容器。
- 一个标准 Azure 存储帐户:用于维护项目的状态和其他信息。
- 一个函数应用:提供用于执行函数代码的环境。 可以通过函数应用将函数分组为逻辑单元,以便在同一托管计划中更轻松地管理、部署和共享资源。
- 一个 Azure 应用服务计划,用于定义你的函数应用的基础主机。
- 一个连接到函数应用的 Application Insights 实例,用于跟踪应用中函数的使用。
创建函数应用并应用了部署包之后,会显示一个通知。
提示
默认情况下,根据为函数应用输入的名称创建函数应用所需的 Azure 资源。 默认情况下,使用函数应用在同一个新资源组中创建资源。 如果要自定义关联资源的名称或重复使用现有资源,请使用高级创建选项发布项目。
将项目部署到 Azure
重要
部署到现有函数应用将始终覆盖该应用在 Azure 中的内容。
在命令面板中,输入并选择“Azure Functions: 部署到函数应用”。
选择你刚才创建的函数应用。 当系统提示覆盖以前的部署时,请选择“部署”,将函数代码部署到新的函数应用资源。
部署完成后,选择“查看输出”,以查看创建和部署结果,其中包括已创建的 Azure 资源。 如果错过了通知,请选择右下角的铃铛图标再次查看。
在 Azure 中测试函数
从输出面板复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 必须采用此格式:
https://<functionappname>.azurewebsites.net/api/orchestrators/HelloOrchestrator
从输出面板复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 必须采用此格式:
https://<functionappname>.azurewebsites.net/api/orchestrators/hello_orchestrator
- 将 HTTP 请求的这个新 URL 粘贴到浏览器的地址栏中。 使用已发布的应用时,可以获得与本地测试相同的状态响应。
你使用 Visual Studio Code 创建和发布的 Python Durable Functions 应用已可供使用。
清理资源
如果你不再需要为完成本快速入门而创建的资源,为避免在 Azure 订阅中产生相关费用,请删除资源组和所有相关资源。