使用 Python 创建你的第一个持久函数
Durable Functions 是 Azure Functions 的一个扩展,可用于在无服务器环境中编写有状态函数。 该扩展可用于管理状态、检查点和重启。
本文介绍了如何使用 Visual Studio Code Azure Functions 扩展在本地创建并测试“hello world”持久函数。 此函数将协调对其他函数的调用并将其链接在一起。 然后可将函数代码发布到 Azure。
先决条件
为完成此教程:
安装 Azure Functions Visual Studio Code 扩展。
确保安装了最新版本的 Azure Functions Core Tools。
Durable Functions 需要一个 Azure 存储帐户。 需要一个 Azure 订阅。
确保已安装 3.7、3.8、3.9 或 3.10 版 Python。
如果没有 Azure 订阅,可在开始前创建一个试用帐户。
创建本地项目
在本部分,你将使用 Visual Studio Code 创建一个本地 Azure Functions 项目。
在 Visual Studio Code 中,按 F1(或 Ctrl/Cmd+Shift+P)打开命令面板。 在命令面板中,搜索并选择
Azure Functions: Create New Project...
。为项目选择一个空文件夹位置,然后选择“选择”。
按照提示提供以下信息:
Prompt 值 说明 选择函数应用项目的语言 Python 创建本地 Python Functions 项目。 选择版本 Azure 函数 v4 仅当尚未安装 Core Tools 时,才会出现此选项。 在本例中,当你首次运行应用时即已安装 Core Tools。 Python 版本 Python 3.7、3.8、3.9 或 3.10 Visual Studio Code 将使用所选版本创建虚拟环境。 为项目的第一个函数选择模板 暂时跳过 选择打开项目的方式 在当前窗口中打开 在所选的文件夹中重新打开 Visual Studio Code。
按照提示提供以下信息:
Prompt 值 说明 选择一种语言 Python(编程模型 V2) 使用 V2 编程模型创建本地 Python Functions 项目。 选择版本 Azure 函数 v4 仅当尚未安装 Core Tools 时,才会出现此选项。 在本例中,当你首次运行应用时即已安装 Core Tools。 Python 版本 Python 3.7、3.8、3.9 或 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 触发的函数。
业务流程协调程序函数
你将使用一个模板在项目中创建持久函数代码。
在命令面板中,搜索并选择
Azure Functions: Create Function...
。按照提示提供以下信息:
Prompt 值 说明 选择函数的模板 Durable Functions 业务流程协调程序 创建 Durable Functions 业务流程 提供函数名称 HelloOrchestrator 持久函数的名称
现已添加一个业务流程协调程序来协调活动函数。 打开 HelloOrchestrator/__init__.py 查看业务流程协调程序函数。 每次调用 context.call_activity
都会调用名为 Hello
的活动函数。
接下来,添加引用的 Hello
活动函数。
活动函数
在命令面板中,搜索并选择
Azure Functions: Create Function...
。按照提示提供以下信息:
Prompt 值 说明 选择函数的模板 Durable Functions 活动 创建活动函数 提供函数名称 你好 活动函数的名称
现已添加业务流程协调程序调用的 Hello
活动函数。 打开 Hello/__init__.py,可以看到,该函数采用某个名称作为输入,并返回一句问候语。 将在活动函数中执行操作,例如,发出数据库调用或执行计算。
最后,添加一个启动业务流程的 HTTP 触发的函数。
客户端函数(HTTP 启动器)
在命令面板中,搜索并选择
Azure Functions: Create Function...
。按照提示提供以下信息:
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 "Hello " + city
请查看下表,了解每个函数及其在示例中的用途的说明。
方法 | 说明 |
---|---|
hello_orchestrator |
描述工作流的业务流程协调程序函数。 在这种情况下,业务流程将启动,按顺序调用三个函数,并返回列表中所有 3 个函数的有序结果。 |
hello |
执行正在协调的工作的活动函数。 该函数将返回作为参数传递的城市的简单问候语。 |
http_start |
HTTP 触发的函数,用于启动业务流程的实例并返回检查状态响应。 |
注意
Durable Functions 还支持 Python V2 的蓝图。 要使用它们,需要使用 azure-functions-durable
Blueprint
类注册蓝图函数,如此处所示。 然后,可以正常注册生成的蓝图。 有关示例,请参阅我们的示例。
在本地测试函数
使用 Azure Functions Core Tools 可以在本地开发计算机上运行 Azure Functions 项目。 首次从 Visual Studio Code 启动某个函数时,系统会提示你安装这些工具(若尚未安装)。
- 若要测试函数,请在
Hello
活动函数代码 (Hello/__init__.py) 中设置断点。 按 F5 或者在命令面板中选择Debug: Start Debugging
以启动函数应用项目。 来自 Core Tools 的输出会显示在“终端” 面板中。
- 若要测试函数,请在
hello
活动函数代码中设置一个断点。 按 F5 或者在命令面板中选择Debug: Start Debugging
以启动函数应用项目。 来自 Core Tools 的输出会显示在“终端” 面板中。
注意
有关调试的详细信息,请参阅 Durable Functions 诊断。
Durable Functions 需要一个 Azure 存储帐户才能运行。 当 Visual Studio Code 提示选择存储帐户时,请选择“选择存储帐户”。
按照提示提供以下信息,并在 Azure 中创建新的存储帐户:
Prompt 值 说明 选择订阅 订阅的名称 选择 Azure 订阅 选择存储帐户 新建存储帐户 输入新存储帐户的名称 唯一名称 要创建的存储帐户的名称 选择资源组 唯一名称 要创建的资源组名称 选择一个位置 region 选择离你较近的区域 在“终端” 面板中,复制 HTTP 触发的函数的 URL 终结点。
复制
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": "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 图标。 然后在“资源”区域中,选择 + 图标,然后选择“在 Azure 中创建函数应用”选项。
根据提示提供以下信息:
Prompt 选择 选择订阅 选择要使用的订阅。 如果你在“资源”下只有一个订阅可见,则你不会看到此提示。 输入函数应用的全局唯一名称 键入在 URL 路径中有效的名称。 将对你键入的名称进行验证,以确保其在 Azure Functions 中是唯一的。 选择一个运行时堆栈 选择你一直在本地运行的语言版本。 选择新资源的位置 为了获得更好的性能,请选择你附近的区域。 在 Azure 中创建各个资源时,该扩展会在“Azure: 活动日志”面板中显示这些资源的状态。
创建完成时,会在你的订阅中创建以下 Azure 资源。 资源基于你的函数应用名称进行命名:
- 一个资源组:相关资源的逻辑容器。
- 一个标准 Azure 存储帐户:用于维护项目的状态和其他信息。
- 一个函数应用:提供用于执行函数代码的环境。 可以通过函数应用将函数分组为逻辑单元,以便在同一托管计划中更轻松地管理、部署和共享资源。
- 一个应用服务计划:用于你的函数应用的基础主机。
- 一个连接到函数应用的 Application Insights 实例,用于跟踪你的函数在应用中的使用情况。
创建函数应用并应用了部署包之后,会显示一个通知。
提示
默认情况下,会根据你提供的函数应用名称创建函数应用所需的 Azure 资源。 默认情况下,还会在函数应用所在的新资源组中创建这些资源。 如果要自定义这些资源的名称或重复使用现有资源,则需要使用高级创建选项来发布项目。
将项目部署到 Azure
重要
部署到现有函数应用将始终覆盖该应用在 Azure 中的内容。
在活动栏中选择 Azure 图标,然后在“工作区”区域中选择你的项目文件夹,并选择“部署...”按钮。
选择“部署到函数应用...”,然后选择刚刚创建的函数应用,选择“部署”。
在部署完成后,选择“查看输出”以查看创建和部署结果,其中包括你创建的 Azure 资源。 如果错过了通知,请选择右下角的响铃图标以再次查看。
在 Azure 中测试函数
- 从“输出” 面板复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 必须采用此格式:
http://<functionappname>.chinacloudsites.cn/api/orchestrators/HelloOrchestrator
- 从“输出” 面板复制 HTTP 触发器的 URL。 调用 HTTP 触发的函数的 URL 必须采用此格式:
http://<functionappname>.chinacloudsites.cn/api/orchestrators/hello_orchestrator
- 将 HTTP 请求的这个新 URL 粘贴到浏览器的地址栏中。 必须得到与之前使用已发布的应用时相同的状态响应。
后续步骤
你已使用 Visual Studio Code 创建并发布了一个 Python 持久函数应用。