如何编写无服务器函数

介绍

Serverless 架构允许在必要的基础上实现后端 Web 服务,而不是需要维护自己的服务器配置,为无服务器提供商构建软件可以最大限度地减少相关的负担。

这意味着无服务器函数可以有效地扩展到零 - 函数或端点不应该消耗任何资源,只要它没有被访问,但是,这也意味着无服务器函数必须表现良好,并且应该从空闲状态出发,以提供对输入请求的个别响应。

本教程将涵盖写示例无服务器函数的一些最佳实践。

前提条件

要遵循本教程,您将需要:

  • 安装了无服务器部署工具的本地壳环境. 一些无服务器平台使用无服务器命令,而本教程将反映DigitalOcean的doctl沙盒工具。 两者都提供类似的功能。 要安装和配置doctl,请参阅 它的文档
  • 在您的开发环境中可用的版本控制工具 Git

步骤 1 — 创建一个无服务器应用程序存储库

一个完整的无服务器应用程序至少可以包含两个文件 - 配置文件,通常使用.yml语法,该语法向无服务器提供商声明您的应用程序所需的元数据,以及包含代码的文件,例如my_app.py,my_app.jsmy_app.go

要初始化无服务器应用程序,您可以使用doctl sandbox init以新目录的名称:

1[environment local]
2doctl sandbox init myServerlessProject
1[secondary_label Output]
2[environment local]
3A local sandbox area 'myServerlessProject' was created for you.
4You may deploy it by running the command shown on the next line:
5  doctl sandbox deploy myServerlessProject

默认情况下,这将创建具有以下目录结构的项目:

1myServerlessProject/
2├── packages
3│   └── sample
4│       └── hello
5│           └── hello.js
6└── project.yml

「project.yml」包含在顶级目录中,它声明了「hello.js」的元数据,其中包含一个单一的函数。所有无服务器应用程序都将遵循相同的基本结构。您可以找到更多的示例,使用其他无服务器框架,在官方的 Serverless Framework GitHub 存储库,或参阅 DigitalOcean 的文档.您也可以从头开始创建这些目录结构而不依赖init函数,但请注意每个无服务器提供商的要求会略有不同。

在下一步中,您将更详细地探索您初始化的样本项目。

步骤 2 – 构建一个无服务器应用程序

无服务器应用程序可以是一个单一的函数,用一个由您的无服务器计算提供商解释的语言编写(通常是 GoPythonJavaScript),只要它可以返回某些输出。

在最后一步中运行doctl sandbox init自动生成您的无服务器应用程序的样本项目,包括一个名为hello.js的文件。

1[environment local]
2nano myServerlessProject/packages/sample/hello/hello.js
1[label ~/myServerlessProject/packages/sample/hello/hello.js]
2[environment local]
3function main(args) {
4    let name = args.name || 'stranger'
5    let greeting = 'Hello ' + name + '!'
6    console.log(greeting)
7    return {"body": greeting}
8  }

此文件包含一个单一的函数,称为main(),可以接受一组参数. 这是无服务器架构管理输入处理的默认方式. 无服务器函数不一定需要直接解析 JSON 或 HTTP 标题来处理输入。

函数的第一个行使用JavaScript的 gc OR操作员来解析一个名称参数,如果它存在,或者如果函数被调用而没有任何参数,使用陌生字符串。这在函数的终端点被错误查询或缺少数据的情况下很重要。无服务器函数应始终有一个代码路径,允许您快速返回null,或在形成良好的HTTP响应中返回相当于null,并且需要最少的额外处理。

根据您的无服务器提供商,您可能没有任何文件系统或操作系统级别的功能可用于您的功能。无服务器应用程序不一定无状态。然而,允许无服务器应用程序在运行之间记录或保留状态的功能通常属于每个提供商的所有权。最常见的例外是能够从您的功能中登录输出。样本hello.js应用程序包含一个console.log()功能,该功能使用内置的JavaScript功能来输出一些额外的数据到浏览器控制台或本地终端的stdout,而不会将其返回用户。大多数无服务器提供商将允许您以这种方式保留和审查日志输出。

该函数的最后一行用于返回您的函数的输出. 由于大多数无服务器函数被部署为 HTTP 终端点,您通常需要返回 HTTP 响应。

这种函数可以执行更多的步骤,只要它保持相同的输入和输出基线预期。 或者,您的应用程序可以连续运行多个无服务器函数,并根据需要进行交换。 无服务器函数可以被认为与 microservice 驱动的架构类似:这两种功能使您能够构建一个应用程序,包括不一定相互依赖的多个松散连接的服务,并通过已建立的协议(如 HTTP)进行通信。

现在你已经了解了应用程序架构,在下一步,你将学习一些关于准备无服务器函数部署和部署无服务器函数的最佳实践。

步骤 3 – 部署无服务器功能

doctl命令行工具允许您部署和测试您的应用程序,而不会将其推广到生产中,而其他无服务器实现提供了类似的功能,然而,几乎所有无服务器部署工作流程最终将涉及到您将应用程序委托到源控制存储库(如GitHub),并将GitHub存储库连接到无服务器提供商。

当您准备进行生产部署时,您应该能够访问无服务器提供商的控制台,并将源存储库识别为应用程序的组成部分。

目前,您可以使用doctl sandbox直接部署到测试沙盒中:

1[environment local]
2doctl sandbox deploy myServerlessProject

这将返回有关部署的信息,包括您可以执行的另一个命令来请求现场测试 URL:

1[secondary_label Output]
2[environment local]
3Deployed '~/Desktop/myServerlessProject'
4  to namespace 'f8572f2a-swev6f2t3bs'
5  on host 'https://faas-nyc1-78edc.doserverless.io'
6Deployment status recorded in 'myServerlessProject\.nimbella'
7
8Deployed functions ('doctl sbx fn get <funcName> --url' for URL):
9  - sample/hello

运行此命令将返回无服务器函数的当前终点:

1[environment local]
2doctl sbx fn get sample/hello --url
1[secondary_label Output]
2[environment local]
3https://faas-nyc1-78edc.doserverless.io/api/v1/web/f8572f2a-swev6f2t3bs/sample/hello

返回的路径将自动生成,但应根据您的函数名称以/sample/hello结束。

<$>[注] **注:**您可以在其 源存储库查看 doctl sandbox 部署功能。

在测试或生产中部署后,您可以使用cURL将HTTP请求发送到您的终端点. 对于本教程中开发的样本/你好应用程序,您应该能够将弯曲请求发送到您的/ 样本/你好终端点:

1[environment local]
2curl https://faas-nyc1-78edc.doserverless.io/api/v1/web/f8572f2a-swev6f2t3bs/sample/hello

输出将作为标准 HTTP 请求的返回:

1[secondary_label Output]
2[environment local]
3“Hello stranger!”

您也可以按照上文所述为您的函数提供名称参数,将其编码为额外的 URL 参数:

1[environment local]
2curl “https://faas-nyc1-78edc.doserverless.io/api/v1/web/f8572f2a-swev6f2t3bs/sample/hello?name=sammy”
1[secondary_label Output]
2[environment local]
3“Hello sammy!”

测试并确认您的应用程序会返回预期响应后,您应该确保将意外输出发送到您的终端点会使其失败。您可以查看 错误处理最佳实践以确保输入被正确解析,但最重要的是确保您的应用程序永远不会意外停机,因为这可能会导致无服务器应用程序的可用性问题,以及每次使用的意外收费。

最后,您将希望将您的应用程序委托给 GitHub 或其他源代码存储库,以便进行生产. 如果您选择使用 Git 或 GitHub,您可以参阅 如何有效地使用 Git 介绍如何使用 Git 存储库。

将源代码存储库连接到无服务器提供商后,您将能够采取额外的步骤来限制访问功能的终端,或将其与其他无服务器功能结合起来,作为一个更大的标记应用程序的一部分。

结论

在本教程中,您初始化、审查并部署了无服务器功能示例. 虽然每个无服务器计算平台基本上都是专有的,但各种提供商遵循非常相似的架构原则,本教程中的原则广泛适用。

接下来,您可能想要了解更多关于 微服务架构的有效监控以更好地了解无服务器部署的优化。

Published At
Categories with 技术
comments powered by Disqus