课程
Azure Functions 是微软无服务器计算服务的一部分。它让您可以在事件发生时运行小段代码,而无需自己管理服务器。
例如,当收到一个 HTTP 请求、当文件上传到存储,或当到达预定时间时,函数就可以运行。
“无服务器”并不意味着没有服务器。它表示由 Azure 为您管理基础设施。Azure 会在幕后完成资源预配、伸缩和维护。
在本指南中,我将介绍其构建模块,即触发器、绑定、托管选项,以及一个动手示例,帮助您上手。
什么是 Azure Functions?
Azure Function 本质上是一小段代码,由您选择的事件触发后运行。您编写业务逻辑,其余由 Azure 负责。
该模型由三个核心理念定义。
- 事件驱动的执行使代码只在有事发生时运行,而不是一直运行。
- 自动伸缩使 Azure 能根据需求增减计算资源。
- 基于消耗的计费在某些托管计划中允许您仅为代码实际运行的时间付费。
理想情况下,单个函数只做一件事,比如调整图片大小或处理一条消息。Function App 是承载一个或多个函数的容器。它为其中所有函数管理共享设置,如配置和部署。
Azure Functions 如何工作
函数的生命周期遵循一个简单的模式,如下所示:
- 发生一个事件,例如文件上传或 HTTP 调用。
- 触发器检测到事件并立即启动函数。
- 函数运行其代码。
- 绑定将函数与其他服务连接,读取所需输入或发送输出。
- Azure 基于您选择的托管计划来管理此过程背后的计算资源。
无论语言或托管选项如何,此流程大体相同。变化的只有触发器、代码和绑定。
Azure Functions 触发器
每个函数只有一个触发器。触发器定义函数如何启动。以下是您应该了解的最常见类型:
- HTTP 触发器:在收到 HTTP 请求时运行函数。常用于构建 API。
- 定时器触发器:按计划运行函数,例如每小时或每天一次。
- Blob 存储触发器:当 Azure Blob 存储中的文件被添加或更改时运行函数。
- 队列触发器:当有新消息到达队列时运行函数。
- Event Hub 触发器:针对事件流运行函数。对大规模数据非常有用。
- Cosmos DB 触发器:利用其变更馈送(Change Feed),当 Cosmos DB 容器中的文档被创建或更新时运行函数。
- Service Bus 触发器:响应来自 Azure Service Bus 队列或主题的消息运行函数,常用于企业级消息传递和系统解耦。
- Durable Functions:Azure Functions 的扩展,使您能够在无服务器环境中编写有状态函数,以编排复杂的多步骤工作流。
Azure Functions 绑定
我认为触发器和绑定常被混淆,尽管看起来相似,但它们的职责完全不同。触发器用于启动函数,而绑定通过读取或发送数据将函数与数据连接起来。
输入绑定
通过它,您无需编写自定义集成代码就能为函数提供数据。例如,只需声明绑定,函数就可自动从数据库读取一条记录。
输出绑定
它让您把函数的结果发送到别处。比如,您可以用输出绑定将处理后的消息写入队列。
这里有一个帮助理解的例子:当图片被上传时,Blob 存储触发器会启动一个函数。然后输出绑定将调整大小后的图片保存到另一个存储容器。绑定负责处理存储连接,无需手写存储客户端代码。
如何创建您的第一个 Azure Function
下面是一个非常简单的 HTTP 触发函数示例,它返回问候语。流程如下:
- 创建一个 Function App。它是您在 Azure 中承载函数的容器。
- 选择运行时并挑选您要使用的编程语言。
- 在 Function App 中添加一个新函数。
- 选择 HTTP 触发器,让函数响应网页请求。
- 添加一个简单功能,比如从请求中读取姓名并返回“Hello, [name]”。
- 使用内置测试工具运行并测试函数,或直接从浏览器发送请求。
- 将其部署到 Azure,使其上线并可访问。
我有意将该示例做得很小,以展示模式,并留给您发挥创意。
Azure Functions 支持的语言
Azure Functions 支持多种语言,例如:
- C#
- JavaScript/TypeScript
- Python
- Java
- PowerShell
不同语言与版本的支持与开发模型各不相同。因此,我建议在启动新项目前查看当前的 Azure 文档,因为这些细节经常变化。
Azure Functions 的托管选项
并非所有 Azure Function 的运行方式都相同。Azure 提供多种托管计划,各有取舍。正确选择取决于您的场景。主要权衡包括:
- 伸缩:有些计划可自动即时伸缩,另一些则需要更多手动控制。
- 启动行为:有的计划会保持函数“预热”,即随时就绪;另一些则按需启动函数。
- 网络:有的计划支持高级网络功能,例如连接到专用虚拟网络,另一些不支持。
- 成本:定价模式差异很大,从按次执行计费到固定月费不等。
Azure Functions 的伸缩与冷启动
当您的函数进入生产运行后,还有两个概念很重要:
自动伸缩
Azure 会监控函数负载,当需求增加时添加更多计算实例,需求下降时移除实例。您无需手动管理。
冷启动
如果一个函数近期未运行,那么在处理新请求前可能需要片刻启动时间。此延迟称为冷启动。某些托管计划通过保持实例预热来减少或避免这种情况,如前所述。
常见的 Azure Functions 用例
事件驱动模型适用于您可能遇到的许多日常问题,尤其是:
API 与 Webhook
处理传入的 HTTP 请求,而无需全天候运行完整的 Web 服务器。
文件与图像处理
当文件进入存储时触发函数,然后对其进行缩放、转换或扫描。
计划任务
按定时器运行清理任务、报表或提醒,无需专门的常开服务器。
数据处理管道
随着消息或事件到达,逐步进行处理。
物联网与事件处理
在数据流入时处理海量传感器或设备数据。
后台任务
将发送邮件等缓慢或偶发的工作卸载出去,避免阻塞主应用程序。
监控与排障 Azure Functions
函数上线后,您需要了解其运行情况。
例如,您可以查看日志,记录每次运行期间发生的事情,这对调试非常有用。您还可以在 Azure 工具中查看 Application Insights,它在一个中心位置跟踪性能、请求和失败情况。
您还应跟踪调用失败,以便了解函数何时以及为何未完成。性能监控也有助于在问题出现前发现运行缓慢的函数,当然,还可以配置重试行为,让失败的执行自动重试。
结语
Azure Functions 让您可以在事件发生时运行代码,而无需管理底层服务器。触发器决定函数何时启动;绑定则让函数无需额外集成代码即可轻松连接到其他服务。
当您从简单的测试函数走向生产环境时,托管与伸缩的选择会更加重要。正确的计划不仅影响成本,也影响速度与可靠性。
常见问答
什么是 Azure Functions?
一种无服务器服务,可在事件发生时运行小段代码,而无需您管理服务器。
是什么触发 Azure Function?
诸如 HTTP 请求、定时器、文件上传或队列消息等事件。
触发器与绑定有什么区别?
触发器用于启动函数;绑定用于将其连接到其他服务以获取输入或发送输出。
什么是冷启动?
函数在空闲后启动时出现的短暂延迟。
Azure Functions 支持哪些编程语言?
C#、JavaScript/TypeScript、Python、Java 和 PowerShell。