玩转并测试您的第一个无服务器 Azure Function






4.59/5 (9投票s)
如何使用 Microsoft Azure 创建和测试无服务器函数应用。
目录
场景
这是一个场景;您负责一家披萨公司的烤箱温度数据记录器。您监控这些数据以帮助确定何时需要烤箱维护。
您的公司从多家披萨店和不同型号的烤箱接收传感器数据。您的任务是开发一项可重用服务,该服务可以处理来自所有这些工厂的温度数据。
您认为处理此任务的最佳且最具成本效益的方法是使用无服务器计算。对于这个项目,您将使用 Azure Functions。考虑到这一点,我们将立即使用 Azure Functions 来了解它的工作原理。
什么是无服务器计算
借助无服务器计算,您的云提供商负责管理基础设施的配置和维护,让您可以专注于构建应用程序逻辑。它使您能够在云中运行您选择的编程语言编写的代码片段或函数。换句话说,就是功能即服务 (FaaS),或者托管在云上的微服务。您的函数应用会根据负载自动向上或向下扩展。
无服务器计算的一些好处
- 用您选择的语言代码编写自己的业务逻辑
- 您无需管理任何服务器硬件或资源
- 您根据使用情况收费,而不是按预留时间收费
- 您可以避免过度分配基础设施 - 通过自动向上或向下扩展
- 它提供无状态逻辑 - 函数实例按需创建和销毁
- 函数是事件驱动的 - 它们仅在响应触发器或换句话说事件时运行
- 如果您的应用程序需求发生变化,您可以将函数应用移至传统计算环境 - 您可以在非无服务器环境中移动并部署它
什么是 Azure Functions
Azure Functions 是微软提供的无服务器应用程序平台。这允许开发人员利用无服务器计算的优势来托管业务逻辑。Azure Functions 提供所需的扩展能力,并且只收取所用资源的费用。您可以使用您选择的语言(如 C#、F# 或 JavaScript)编写您的函数应用代码。它支持 NuGet 和 NPM,因此您可以在业务逻辑中使用您喜欢的库。
准备好动手
注意:请确保您有一个 Azure 帐户。如果没有,请单击此处创建一个免费帐户。
让我们创建一个函数应用
- 登录Azure 门户。
- 选择门户左上角的创建资源按钮。
- 选择开始使用按钮,然后单击函数应用链接。
- 输入一个唯一的应用名称;它还将用作服务的基础 URL,即您可以将其命名为pizza-functions-xxxxxxx,其中x可以替换为您的姓名首字母和出生年份。
- 选择您希望应用托管的订阅。
- 在资源组下,选择创建新 - 名称将与应用名称匹配。保留名称不变。
- 对于操作系统,请选择Windows。
- 对于托管计划,请选择消耗计划以提供无服务器计算的好处。
- 在位置下,选择离您最近的地理位置。
- 对于运行时堆栈,我们将从下拉列表中选择JavaScript。
- 在存储下,选择创建新并使用已自动创建的。
- 将应用程序见解名称保留原样。
- 点击创建按钮。部署需要几分钟时间,完成后您将收到通知。
现在您已经创建了自己的函数应用,让我们执行一个实际的函数。首先,需要了解一些术语和概念。
触发器
这些是定义函数如何被调用的事件对象。您必须配置一个函数,其中包含一个事件触发器。函数是事件驱动的,需要一个触发器才能运行。
绑定
这些是您函数内的数据连接。您不必在函数中编写代码来连接到数据源并管理连接,因为它会为您处理复杂性。每个函数可以有一个或多个绑定来管理数据的输入和输出。
有两种绑定
- 输入绑定 - 数据源的连接。您的函数可以从这些输入读取数据。
- 输出绑定 - 数据目标的连接。您的函数可以将数据写入这些目标。
Azure 提供了一长串绑定,用于连接到不同的存储和服务。
验证您的函数应用已创建
- 点击门户左侧菜单上的资源组按钮。
- 点击与您之前创建的函数应用名称匹配的资源组名称链接。
- 您应该看到类似这样的列表
注意:带有闪电图标的那个是您的函数应用。
-
点击函数应用名称链接。
注意:您会注意到它有一个公共 URL。
如果您点击该 URL,您应该会看到一个默认网页,表明函数应用正在运行。
现在,我们将把一个实际函数和逻辑模板添加到函数应用中。
-
在应用仪表板上点击+ 新函数按钮。
- 选择在门户中框,然后点击底部的继续按钮。
- 选择更多模板…框,然后点击完成并查看模板按钮。
- 从列表中选择HTTP 触发器框。
- 在新函数对话框中,在名称字段中输入OvenTemperatureService,并将授权级别保留为函数。
- 点击创建按钮。几秒钟后,代码编辑器将打开一个包含模板代码内容的index.js文件。
测试您的模板函数
- 在index.js代码编辑器中,点击</> 获取函数 URL 以获取终结点。
- 在获取函数 URL对话框中,复制URL并关闭对话框。
注意:此URL包含您的函数密钥。这允许您通过授权密钥保护对 HTTP 触发函数的访问。 - 将URL粘贴到记事本等安全的地方以备后用。
- 在左侧,展开您的函数应用,然后展开函数,然后点击管理按钮。
- 下载并安装Postman以测试函数应用。Postman是一个用于测试 Web 服务的工具应用。
- 使用Postman创建一个新请求
- 使用POST请求,并粘贴您之前从获取函数 URL对话框复制的URL。
- 在Params选项卡下,添加以下键值对
- 对于Key,输入
name
,对于Value,输入Azure Function
。
- 对于Key,输入
- 在Headers选项卡下,添加以下键值对
- 对于Key,输入
Content-Type
,对于Value,输入application/json
。
- 对于Key,输入
- 点击Send按钮,Postman将收到带有文本
Hello Azure Function
的响应。太棒了!它有效,您可以通过 HTTP 与函数应用进行通信。
现在,让我们将我们自己的逻辑添加到函数中,以满足披萨公司的要求。
您的函数要求
- 0 到 300 华氏度之间的披萨烹饪温度应标记为 COLD。
- 400 到 500 华氏度之间的披萨烹饪温度应标记为 GREAT。
- 600 到 700 华氏度之间的披萨烹饪温度应标记为 BURNT。
将您的代码添加到函数中
- 打开Azure 门户。
- 在index.js文件中,用以下代码替换模板代码
module.exports = function(context, req) { context.log('OvenTemperature Service triggered'); if (req.body && req.body.readings) { req.body.readings.forEach(function(reading) { let dateTime = new Date(reading.timestamp * 1000); dateTime.toLocaleString('en-US'); if (reading.temperature <= 300) { reading.status = 'COLD'; } else if (reading.temperature <= 500) { reading.status = 'GREAT'; } else { reading.status = 'BURNT'; } context.log( `The Pizza Oven Temperature Reading is ${ reading.status } at ${dateTime} for Oven at ${reading.factory}` ); }); context.res = { // status: 200, /* Defaults to 200 */ body: { readings: req.body.readings, }, }; } else { context.res = { status: 400, body: 'Please send an array of temperature readings in the request body', }; } context.done(); };
- 点击代码编辑器顶部的Save按钮。
这是一个简单的逻辑,它迭代读取数组,检查字段,并输出烤箱状态、日期时间和工厂名称。
让我们测试我们自己的逻辑
- 打开Postman工具应用。
- 使用Postman创建一个新请求
- 使用POST请求,并粘贴您之前从获取函数 URL对话框复制的URL。
- 在Headers选项卡下,添加以下键值对
- 在Key下,输入
Content-Type
,在Value下,输入application/json
。
- 在Key下,输入
- 点击Send按钮,Postman将收到带有文本
Please send an array of temperature readings in the request body
的响应。这意味着我们需要一些数据。 - 现在,我们将添加一些数据。在Body选项卡下,选择raw单选按钮,然后从下拉列表中选择JSON (application/json)。
- 将以下 JSON 片段样本读数请求粘贴到请求正文文本框中
{ "readings": [ { "factory": "Waterbury Pizza Pizza Factory", "temperatureId": 1, "timestamp": 1554391200, "temperature": 203 }, { "factory": "Harford DiGeorgio Factory", "temperatureId": 3, "timestamp": 1554391800, "temperature": 400 }, { "factory": "New York Migrante Factory", "temperatureId": 3, "timestamp": 1554390800, "temperature": 298 }, { "factory": "Orlando Raton Pizza Factory", "temperatureId": 18, "timestamp": 1554392100, "temperature": 658 } ] }
- 将以下 JSON 片段样本读数请求粘贴到请求正文文本框中
- 点击Send按钮,Postman将收到 JSON 响应。
- 回到Azure 门户和index.js代码编辑器。
- 打开页面底部弹出窗口中的Logs选项卡。下面的屏幕截图显示了Logs窗格中消息的示例响应。
您可以看到我们的状态字段已正确添加到每个读数中,以及日期时间和工厂名称。
- 如果您导航到 Monitor 仪表板,您会看到请求已记录到Application Insights。
给自己鼓鼓掌!它有效,您的无服务器函数应用能够通过 HTTP 接收多个样本读数。这些读数将为您提供每家披萨店烤箱的状态。
您正在为披萨公司提供他们需要的可重用服务。
摘要
您做到了!您已经试玩并测试了一个无服务器函数应用。您已经学会了如何在云中创建和托管带有业务逻辑的函数应用。一种将无服务器托管服务添加到您的解决方案的好方法,该服务可以扩展和增长。
在这种情况下,Azure 管理基础设施,您专注于代码。您还可以与其他服务集成,例如GitHub、Twilio等,以快速轻松地创建复杂的无服务器工作流。披萨公司现在可以确定为每家披萨店安排维护的最佳时间。