无服务器函数指南以及如何部署这些函数

167 阅读9分钟

在过去的几年里,无服务器功能(有时也被称为 "无服务器 "或 "无服务器计算")已经成为一种流行的技术。然而,围绕这个术语仍有很多困惑。如何才能在没有服务器的情况下运行代码?该技术有哪些优点和缺点?你可能在哪些情况下使用它?在这篇文章中,我希望能回答这些问题,并让你对该技术有一个很好的了解。

什么是无服务器功能?

第一次听到 "无服务器 "这个词,肯定会引起你的好奇心。"没有服务器,你如何在网络上运行代码?"你可能会问。它的实际含义是,作为开发者,你不必担心你的代码所运行的服务器。硬件的配置、网络的配置、软件的安装和扩展都被无服务器提供商抽象化了。

从开发的角度来看,无服务器功能是你上传到无服务器提供商(如AWS或谷歌)的一捆代码。这段代码可以被配置为通过URL响应请求,按计划运行(即通过cron job),或从其他服务或无服务器函数中调用。

无服务器函数是为前端应用程序添加少量后台功能的理想选择,而不需要运行一个完整的服务器的复杂性和成本。

在规模的另一端,你也可以用无服务器函数构建整个应用程序。与其他提供文件存储、数据库系统和认证的云服务结合起来,就有可能建立大型、稳健和可扩展的应用,而无需配置一台服务器。

优势

无服务器功能是在微型容器中运行的,可以按需启动。它们被设计为运行时间较短的进程,因此在设置计费时也考虑到了这一点。与通常按小时计费的完整服务器实例不同,无服务器功能通常按GB-秒计费。由于最短的计费时间是几毫秒,低频或零星的工作负载作为无服务器功能运行要比传统服务器实例便宜得多。轻度工作负载和原型设计甚至可以落入某些供应商的免费层。

无服务器功能的按需调用意味着它们可以快速、轻松地扩展,而不需要开发人员做额外的工作。这使它们成为流量可能不可预测地激增的情况的理想选择,因为更多的函数实例将自动提供,以处理负载。之后,该功能将被缩减,这意味着你将不会为未使用的容量付费。

无服务器模式的一个关键优势是不需要处理服务器。运行一个网络应用程序需要大量的时间和服务器管理的专业知识,以便使软件保持最新的安全补丁,并确保服务器配置正确,以保证安全和性能。对于初创企业和小型企业来说,雇人处理服务器管理问题是一笔很大的额外开销。有了无服务器,开发人员可以专注于创造解决方案。

劣势

当然,没有一种技术是完美的,无服务器功能也不是没有缺点的。正如我之前提到的,无服务器模式在设计时考虑到了短命的流程。它的最大执行时间以分钟为单位(例如,AWS上为15分钟,Google上为9分钟),因此不适合处理大批量数据等运行时间较长的工作。

另一个被广泛讨论的问题是冷启动时间的问题。这是供应商为你的无服务器功能提供和初始化容器所需的时间,然后它就可以开始运行了。一旦函数运行完毕,该容器就会被保留很短的时间,以便在再次执行代码时被重新使用。这种 "冷启动 "延迟可能会给你的函数的响应时间带来半秒到一秒的延迟。对此有一些解决方法,包括无服务器框架的WarmUp插件,它可以按计划对你的函数进行ping,以保持容器的活力。

尽管无服务器功能让你不必担心服务器的配置和维护,但这并不是说没有学习曲线。用无服务器构建应用程序需要一种与传统单体代码库不同的思维方式。你必须以不同的方式构造你的代码,将功能分解成更小的、离散的服务,以适应无服务器功能的限制。部署也更加复杂,因为每个功能都是独立的版本和更新。

还有一个供应商锁定的问题,有时被提到是无服务器技术的一个缺点。目前,这一领域的主要供应商(AWS、谷歌、Azure)都有各自不同的实现方式和管理工具。这可能会使无服务器应用程序从一个云供应商转移到另一个云供应商变得困难。无服务器框架等项目试图将底层服务抽象化,以使应用在供应商之间可以移植。

使用案例

尽管无服务器功能可用于构建整个应用,但让我们来看看无服务器可使普通开发者受益的一些不太雄心勃勃的用例。

表单邮件发送器

除了一个客户希望在用户点击发送时通过电子邮件发送的联系表之外,网站完全是静态的,这种情况并不少见。网站的托管商可能支持也可能不支持服务器端脚本,即使如此,也可能不是用你熟悉的语言。将无服务器功能设置为表单邮件,可以将该功能添加到静态主机上的网站。

Cron job

有时你可能需要在后台运行一个预定任务。通常情况下,你需要支付一个服务器来设置一个cron job,而这个服务器在任务之间会闲置。有了无服务器功能,你只需为工作运行的时间付费(如果属于免费层,也许根本不用付费)。

缩略图生成器

想象一下,你的React应用允许用户上传一张照片,作为整个应用的头像使用。你想调整上传图片的大小,这样你就不会因为提供远大于需要的图片而浪费带宽了。可以使用一个无服务器函数来处理上传请求,将图片调整到所需的大小,并保存到S3或谷歌存储等服务中。

一个实际的例子

为了更深入地了解无服务器函数的工作原理,让我们来看看一个实际的例子。我们将创建一个带有通讯注册表的静态页面,该页面使用无服务器函数将用户的姓名和电子邮件地址保存到谷歌电子表格中。

根据供应商的不同,无服务器函数可以用各种语言编写,但我们将使用JavaScript,因为Netlify支持Node.js函数。我将假设你在本地机器上安装了最新版本的Node/npm,以便跟着做。

1.注册一个Netlify账户

我们将使用Netlify作为本例的主机,因为他们提供了一个包含无服务器功能的免费层级,而且非常容易启动和运行。首先,到他们的网站上注册一个免费账户

2.安装Netlify CLI工具

为了在本地测试我们的示例网站并部署到Netlify,我们将使用他们的CLI工具。这可以作为一个全局npm模块从命令行安装。

npm install -g netlify-cli

一旦CLI安装完毕,运行以下命令将打开一个浏览器窗口,将CLI连接到你的账户。

netlify login

3.创建一个项目文件夹并安装依赖项

让我们为项目创建一个文件夹,并初始化一个新的npm项目

mkdir serverless-mailinglist && cd serverless-mailinglist
npm init -y

这将为我们建立一个项目的package.json 文件,准备安装依赖关系。说到这里,我们的无服务器功能将需要几个包。

npm install dotenv google-spreadsheet

第一个是dotenv,这个包可以让我们从项目根部的.env 文件中加载数值,并将其作为环境变量暴露给Node脚本(我们的无服务器函数)。另一个是google-spreadsheet,这是一个包装Google Sheets API的包,使其更容易使用。

4.启用谷歌表单API并创建证书

为了使用表单API,我们需要做一些准备工作。首先,你需要通过前往API控制台为你的谷歌账户启用API。从顶部的菜单中创建一个新项目,然后点击启用按钮。

一旦完成,你将需要创建一个服务账户。这个账户将给你一套具有必要权限的凭证来访问API。要做到这一点,请遵循以下步骤。

  1. 确保你在Sheet API管理屏幕上。
  2. 点击左侧边栏的凭证,然后点击**+创建凭证,从下拉菜单中选择服务账户**。
  3. 填写表格,为服务账户选择一个名称。你选择的名字,加上项目名称,将构成服务账户ID的一部分。例如,如果你将账户命名为 "邮件列表",项目名称为 "Sitepoint无服务器演示",那么ID将是mailing-list@sitepoint-serverless-demo.iam.gserviceaccount.com 。点击CREATE
  4. 你可以跳过该页面的其余两个可选部分。点击CONTINUE,然后点击DONE
  5. 接下来,点击新创建的服务账户。这将使你进入一个显示账户细节的屏幕。点击顶部菜单中的KEYS,然后是添加密钥创建新密钥。选择JSON作为密钥类型。
  6. 点击CREATE按钮,一个JSON密钥文件将被下载到你的电脑。(注意:这是唯一的副本,所以要妥善保管!)

继续阅读《无服务器功能指南》以及如何SitePoint上部署这些功能。