Microsoft Azure Functions

Microsoft Azure FunctionsMicrosoft Azure 平台上,提供无服务器计算架构 (Serverless Computing) 的服务,允许开发人员在不用接触与管理服务器的情况下,编写小型的处理程序以处理云端上的消息或事件。

Azure Functions 于微软 Build 2016 大会上宣布,于同年11月15日正式 GA (General Availability)。

Azure Functions 已广泛于用如 Azure Bot ServicesAzure IoT SuiteAzure Logic App 等服务串联。

简介

Azure Functions 是以 Azure Web App 开发时所创建的 Microsoft Azure Azure Web Jobs 为基础所开发的一个服务,Web Jobs 在开发时就已经支持多语言 (包含 Bash, 批量档, C#, node.js, PowerShell, F#, PythonPHP 等) 的运行环境,因此在发展 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"
    }
  ],
}

访问控制

使用 HTTP 绑定作为输入的函数 (通常用于 RESTWebHook),Azure Functions 会另外提供密钥 (Key) 给开发人员使用,以作为访问控制的方法[5]

密钥缺省有两种:

  • 主机密钥 (master key):所有建于此应用程序内的所有函数都可使用。
  • 函数密钥 (function key): 只有密钥所属的函数可使用。

除了上面两个缺省的密钥外,开发人员也可创建自己的密钥,并决定访问权限是限制于函数,还是要支持所有的函数。

开发人员支持

Azure Functions 除了提供 Azure Portal 上的代码编修,以及采用 git 的持续集成的代码管理方式外,也为开发人员在地端的作业提供了 Azure Function Runtime,以加速开发人员在地端的开发与测试。

Visual Studio Code 也有套件支持 Azure Functions 的开发。

参考

  1. . [2017-05-28]. (原始内容存档于2020-10-24).
  2. . [2017-05-28]. (原始内容存档于2020-10-25).
  3. . [2017-05-28]. (原始内容存档于2020-11-12).
  4. . [2017-05-28]. (原始内容存档于2017-09-10).
  5. . [2017-05-28]. (原始内容存档于2019-02-17).

相关条目

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.