Courses
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 触发器:响应事件流来运行函数。对于大数据量非常有用。
Azure Functions 绑定
我认为触发器和绑定经常被混淆,尽管它们看起来相似,但作用完全不同。触发器用于启动函数,而绑定通过读取或发送数据将函数与数据连接起来。
输入绑定
无需编写自定义集成代码,您就能为函数提供数据。例如,函数只需声明绑定即可自动读取数据库中的记录。
输出绑定
这使您可以将函数的结果发送到其他地方。例如,您可以使用输出绑定将处理后的消息写入队列。
这里有个示例来帮助理解:当图像被上传时,Blob 存储触发器会启动一个函数。随后,输出绑定将调整大小后的图像保存到另一个存储容器。通过这种方式,无需手写存储客户端代码。
如何创建您的第一个 Azure Function
下面是一个非常简单的基于 HTTP 触发的函数示例,它会返回问候语。流程如下:
- 创建一个 Function App。它是 Azure 中承载您函数的容器。
- 选择运行时并选定您要使用的编程语言。
- 创建函数,以便在您的 Function App 中添加一个新函数。
- 选择 HTTP 触发器,使函数能响应 Web 请求。
- 添加一个简单功能,例如从请求中读取姓名并返回“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。