Azure Functions 运行时版本概述

Azure Functions 运行时有两个主版本:1.x 和 2.x。 当前版本为 2.x,其中可使用新功能并在进行改进,但两个版本都支持生产方案。 下面详细介绍了两个版本的一些区别、如何创建每个版本以及从 1.x 升级到 2.x。

Note

本文引用了云服务 Azure Functions。 如需深入了解可运行本地 Azure Functions 的预览产品,请参阅 Azure Functions 运行时概述

跨平台开发

2.x 版运行时在 .NET Core 2 上运行,因此,它可以在 .NET Core 支持的所有平台(包括 macOS 和 Linux)上运行。 在 .NET Core 上运行可以实现跨平台开发和托管方案。

相比之下,1.x 版运行时仅支持 Azure 门户或 Windows 计算机上的开发和托管。

语言

2.x 版运行时使用新的语言扩展性模型。 在版本 2.x 中,函数应用中的所有函数必须共享相同的语言。 函数应用中的函数的语言是在创建应用时选择的。

Azure Functions 1.x 试验性语言不会更新为使用新模型,因此它们在 2.x 中不受支持。 下表指示每个运行时版本目前支持的编程语言。

语言 1.x 2.x
C# GA (.NET Framework 4.7) GA (.NET Core 2)
JavaScript GA (Node 6) GA(Node 8 和 10)
F# GA (.NET Framework 4.7) GA (.NET Core 2)
Java 不适用 GA (Java 8)
Python 试验 预览版 (Python 3.6)
TypeScript 试验 正式版(通过转换为 JavaScript 进行支持)
PHP 试验 不适用
批处理(.cmd、.bat) 试验 不适用
Bash 试验 不适用
PowerShell 试验 不适用

有关语言支持计划更改的信息,请参阅 Azure 路线图

有关详细信息,请参阅支持的语言

在版本 1.x 上运行

默认情况下,在 Azure 门户中创建的函数应用设置为版本 2.x。 应尽可能地使用此运行时版本,因为其中包含投资开发的新功能。 如果需要,仍可在版本 1.x 运行时中运行函数应用。 只能在创建函数应用之后、添加任何函数之前更改运行时版本。 若要了解如何将运行时版本固定为 1.x,请参阅查看和更新当前运行时版本

从 1.x 迁移到 2.x

可以选择迁移所编写的现有应用,以使用 1.x 版运行时,而不使用版本 2.x。 需要做出的大多数更改与语言运行时的更改相关,例如,.NET Framework 4.7 与 .NET Core 2 之间的 C# API 更改。 还需要确保代码和库与所选的语言运行时兼容。 最后,请务必注意触发器、绑定和以下突出显示功能中的任何更改。 为获得最佳迁移结果,应该为版本 2.x 创建一个新函数应用,并将现有的 1.x 版函数代码移植到新应用。

触发器和绑定的更改

版本 2.x 要求为应用中的函数所用的特定触发器和绑定安装扩展。 唯一的例外是 HTTP 和计时器触发器,它们不需要扩展。 有关详细信息,请参阅注册和安装绑定扩展

此外,在不同的版本中,函数的 function.json 或属性存在几处更改。 例如,事件中心的 path 属性现在为 eventHubName。 请参阅现有绑定表,以获取每个绑定的文档链接。

特性和功能的更改

此外,新版本中已删除、更新或替换了几项功能。 本部分详细介绍在使用版本 1.x 后,版本 2.x 中会出现的更改。

在版本 2.x 中做出了以下更改:

  • 用于调用 HTTP 终结点的密钥始终以加密方式存储在 Azure Blob 存储中。 在版本 1.x 中,密钥默认存储在 Azure 文件存储中。 将应用从版本 1.x 升级到版本 2.x 时,会重置文件存储中的现有机密。

  • 2.x 版运行时不包含对 Webhook 提供程序的内置支持。 做出此项更改的目的是提高性能。 仍可以使用 HTTP 触发器作为 Webhook 的终结点。

  • 主机配置文件 (host.json) 应该为空或包含字符串 "version": "2.0"

  • 函数应用中的所有函数必须共享相同的语言。 创建函数应用时,必须选择该应用的运行时堆栈。 运行时堆栈由应用程序设置中的 FUNCTIONS_WORKER_RUNTIME 值指定。 增加此项要求的目的是减少占用空间和启动时间。 进行本地开发时,还必须在 local.settings.json 文件中包含此设置。

  • 应用服务计划中函数的默认超时已更改为 30 分钟。 可以使用 host.json 中的 functionTimeout 设置,将超时手动改回到无限。

  • 由于 .NET Core 的限制,已删除对 F# 脚本 (.fsx) 函数的支持。 编译的 F# 函数 (.fs) 仍受支持。

迁移本地开发的应用程序

现有的函数应用项目可能是使用 1.x 版运行时在本地开发的。 若要升级到版本 2.x,应该针对版本 2.x 创建一个本地函数应用项目,并将现有代码移植到新应用。 可以手动更新现有的项目和代码,这是一种“就地”升级的方法。 但是,在版本 1.x 与版本 2.x 之间,可能还需要做出其他一些改进。 例如,在 C# 中,调试对象已从 TraceWriter 更改为 ILogger。 创建新的 2.x 版项目后,可以基于最新的 2.x 版模板,从更新的函数着手进行开发。

Visual Studio 运行时版本

在 Visual Studio 中,可在创建项目时选择运行时版本。 用于 Visual Studio 的 Azure Functions 工具支持这两个主要运行时版本。 基于项目设置进行调试和发布时,将使用正确的版本。 版本设置在 .csproj 文件中的以下属性内定义:

版本 1.x
<TargetFramework>net461</TargetFramework>
<AzureFunctionsVersion>v1</AzureFunctionsVersion>
版本 2.x
<TargetFramework>netcoreapp2.2</TargetFramework>
<AzureFunctionsVersion>v2</AzureFunctionsVersion>

调试或发布项目时,将使用正确的运行时版本。

VS Code 和 Azure Functions Core Tools

Azure Functions Core Tools 可用于命令行开发,另外,还可供适用于 Visual Studio Code 的 Azure Functions 扩展使用。 若要针对版本 2.x 进行开发,请安装 Core Tools 版本 2.x。 版本 1.x 开发需要 Core Tools 版本 1.x。 有关详细信息,请参阅安装 Azure Functions Core Tools

对于 Visual Studio Code 开发,可能还需要更新 azureFunctions.projectRuntime 的用户设置,使之与已安装工具的版本匹配。 此设置还会更新创建函数应用期间使用的模板和语言。

在 Azure 中更改应用版本

Azure 中的已发布应用使用的 Functions 运行时版本由 FUNCTIONS_EXTENSION_VERSION 应用程序设置指定。 值 ~2 表示面向 2.x 版运行时,~1 表示面向 1.x 版运行时。 请不要随意更改此设置,因为这可能需要在函数中进行其他应用设置更改和代码更改。 若要了解将函数应用迁移到不同运行时版本的建议方法,请参阅如何以 Azure Functions 运行时版本为目标

绑定

2.x 版运行时使用新的绑定扩展性模型,该模型具有以下优势:

  • 支持第三方绑定扩展。

  • 运行时和绑定分离。 此项更改允许对绑定扩展进行版本控制和单独发布操作。 例如,可以选择升级到依赖于基础 SDK 的较新版本的扩展版本。

  • 更轻便的执行环境,其中运行时仅知道和加载正在使用的绑定。

除 HTTP 和计时器触发器外,其他所有绑定必须显式添加到函数应用项目,或者在门户中注册。 有关详细信息,请参阅注册绑定扩展

下表显示了每个运行时版本支持的绑定。

下表显示了 Azure Functions 运行时的两个主要版本支持的绑定。

类型 1.x 2.x1 触发器 输入 输出
Blob 存储
Cosmos DB
事件中心
HTTP 和 Webhook
Microsoft Graph
Excel 表
Microsoft Graph
OneDrive 文件
Microsoft Graph
Outlook 电子邮件
Microsoft Graph
事件
Microsoft Graph
身份验证令牌
移动应用
通知中心
队列存储
SendGrid
服务总线
表存储
计时器

1 在 2.x 中,除了 HTTP 和 Timer 以外,所有绑定都必须注册。 请参阅注册绑定扩展

函数应用超时持续时间

函数应用的超时持续时间可通过 host.json 项目文件中的 functionTimeout 属性定义。 下表显示两种计划和两种运行时版本的默认值和最大值(以分钟为单位):

计划 运行时版本 默认 最大值
消耗 1.x 5 10 个
消耗 2.x 5 10 个
应用服务 1.x 无限制 无限制
应用服务 2.x 30 无限制

Note

不管函数应用超时设置如何,230 秒是 HTTP 触发的函数在响应请求时需要的最长时间。 这起因于 Azure 负载均衡器的默认空闲超时。 对于处理时间较长的情况,考虑使用 Durable Functions 异步模式延迟实际工作并返回即时响应

后续步骤

有关详细信息,请参阅以下资源: