Microsoft Azure Functions
Microsoft Azure Functions 是 Microsoft Azure 平台上,提供无服务器计算架构 (Serverless Computing) 的服务,允许开发人员在不用接触与管理服务器的情况下,编写小型的处理程序以处理云端上的消息或事件。
Azure Functions 于微软 Build 2016 大会上宣布,于同年11月15日正式 GA (General Availability)。
Azure Functions 已广泛于用如 Azure Bot Services、Azure IoT Suite、Azure Logic App 等服务串联。
简介
Azure Functions 是以 Azure Web App 开发时所创建的 Microsoft Azure Azure Web Jobs 为基础所开发的一个服务,Web Jobs 在开发时就已经支持多语言 (包含 Bash, 批量档, C#, node.js, PowerShell, F#, Python 与 PHP 等) 的运行环境,因此在发展 Azure Functions 时,也将 Web Jobs 的多语言能力移植到 Azure Functions,同时基于无服务器的架构,Azure Functions 只要求开发人员在 Azure 的管理接口上撰写代码,即可立即测试与运行,不必担心背后的资源分配与服务器管理的问题。
Azure Functions 在设计上以函数 (function) 会有的特性来规划,一个函数本身会有输入 (input)、处理 (process) 与输出 (output) 三个部份,微软将输入和输出进行抽象化的处理,以绑定 (binding) 来替代 [1]。
- 输入绑定 (input binding) 表示函数会于绑定指定的条件发生时触发,并将条件所需的参数传到函数作为输入的参数 (argument)。
- 输出绑定 (output binding) 表示函数会输出成指定的格式,通常作为回传值 (return value)。
Azure Functions 如同其他 Azure应用服务 一般,运行于 App Service Plan (应用服务计划)[2] 之上,不过为了要达到无服务器架构的目标,Azure Functions 还多了一个使用模式,称为消费计划 (Consumption Plan),以运行次数 (Executions) 和运行时的资源耗用量 (Resource Consumption) 为计费基础 [3],但用户可选择要用原始的 App Service Plan 还是要使用计量级的 Consumption Plan 作为计费单位。
功能
Azure Functions 基于无服务器管理架构,因此其功能大多数都落在代码的开发、绑定的设置与安全密钥的管理,当然也可以依需求进一步的设置其所处的 App Service Plan (即使是 Consumption Plan 也有) 的高端设置,例如加上 SSL 或增修应用程序组态档的设置等等。
代码管理
Azure Functions 允许开发人员直接编写函数的代码,也就是处理 (Process) 这个部份,基于与函数的绑定的集成,微软提供了数个样板 (template) 给开发人员选用,每个支持的绑定都会有一个样板,开发人员不需费心于思考如何在函数中使用绑定,只要在函数的本体中编写处理的代码即可。
例如使用 HTTP 触发 (即送 HTTP 要求给该函数) 的 C# 代码如下:
public static Task<HttpResponseMessage> Run(HttpRequestMessage request, string category, int? id,
TraceWriter log)
{
if (id == null)
return req.CreateResponse(HttpStatusCode.OK, $"All {category} items were requested.");
else
return req.CreateResponse(HttpStatusCode.OK, $"{category} item with id = {id} has been requested.");
}
而同样功能的 node.js 代码如下:
module.exports = function (context, req) {
var category = context.bindingData.category;
var id = context.bindingData.id;
if (!id) {
context.res = {
// status: 200, /* Defaults to 200 */
body: "All " + category + " items were requested."
};
}
else {
context.res = {
// status: 200, /* Defaults to 200 */
body: category + " item with id = " + id + " was requested."
};
}
context.done();
}
范本会先为开发人员设置好参数,开发人员只要填入处理的程序即可。
另外,Azure Functions 也支持由 git 部署[4],然而若使用 git 部署时,Azure Portal 上的代码编辑器会强制停用。
绑定
绑定决定了函数的输入、触发时间与输出,Azure Functions 支持了下列的触发进程、输入与输出。由于触发进程和输入参数可以不同,因此下表中无输入但有触发支持时,触发的参数会作为输入的参数。
类型 | 触发 | 输入 | 输出 |
---|---|---|---|
调度 | 支持 (设置的时间或周期到时) | ||
HTTP | 支持 (接到由 REST 或 WebHook 发送的 HTTP 要求时) | 支持 | |
Blob | 支持 (Azure Storage Blob 监控的容器有数据添加或更新时) | 支持 | 支持 |
事件 | 支持 (EventHub 有事件进入时) | 支持 | |
队列 | 支持 (Azure Storage Queue 队列内有消息时) | 支持 | |
队列和主题 | 支持 (Azure Service Bus Queue 队列或 Topic 主题内有消息时) | 支持 | |
保存体数据表 | 支持 | 支持 | |
SQL 数据表 | 支持 | 支持 | |
NoSQL 数据库 | 支持 | 支持 | |
通知消息 | 支持 | ||
Twilio SMS 服务 | 支持 | ||
SendGrid | 支持 |
每个输入、输出绑定与触发进程也会有必要的参数设置 (例如调度需要设置运行周期、Blob 需要设置监控的保存体帐户与容器等等)。
绑定的设置除了可在用户接口上设置外,也可使用每个函数都有的 function.json 文件设置,例如下列设置表示了监控 blob 的输入,如果有输入就触发函数,并且将函数的输出指定为另一个 blob 的绑定。
{
"bindings": [
{
"name": "image",
"type": "blobTrigger",
"path": "sample-images/{filename}",
"direction": "in",
"connection": "MyStorageConnection"
},
{
"name": "imageSmall",
"type": "blob",
"path": "sample-images-sm/{filename}",
"direction": "out",
"connection": "MyStorageConnection"
}
],
}
开发人员支持
Azure Functions 除了提供 Azure Portal 上的代码编修,以及采用 git 的持续集成的代码管理方式外,也为开发人员在地端的作业提供了 Azure Function Runtime,以加速开发人员在地端的开发与测试。
Visual Studio Code 也有套件支持 Azure Functions 的开发。