使用 Node.js 的无服务器速成课程
无论你的开发背景如何,在过去的一年里,你肯定听说过“无服务器”这个词。这个词在我耳边萦绕的时间比我敢说的要长。我已经很久没有深入研究它了。好了,现在就说到这里。
准备好了吗?今天我们将探讨无服务器技术的优缺点。我们还将定义一些关键的关键词和主题,这些关键词和主题对于这项技术的入门至关重要。最后,我们将直接开始编写代码,编写我们自己的无服务器函数,在本地模拟环境并监控性能!请记住,您需要一个AWS账户才能跟随代码示例学习。幸运的是,他们提供了超值的免费套餐,因此您在尝试新事物时无需担心花费太多。
你是說什麼?
怎么突然就觉得无服务器这么酷了?现在不用服务器是不是也挺好的?我爱服务器,为什么不用呢?服务器很棒。你可以用命令行告诉它们做什么。谁会想放弃它呢?我当时真的惊呆了。但是,退一步来说,我意识到它们并非最佳选择。在集群中管理它们很麻烦。它们的扩展性也不好。这些只是我首先想到的几点。
让我们彻底转变思维模式。想想只用函数。不用再管理服务器了,你只需要关心代码。听起来很酷。作为开发人员,我们不应该再在命令行上做那些繁琐的工作。让运维人员来处理吧。这种架构该怎么称呼?只用函数?小型函数?还是微型服务?
函数即服务 (FaaS)
它被称为函数即服务,这真是太棒了。这个概念基于无服务器计算。它使我们能够部署任何单独的代码片段或函数。代码运行并返回一个值,从而结束整个过程。听起来很简单,对吧?确实如此。如果您曾经编写过 REST API,您就会对此感到驾轻就熟。您通常放在一个地方的所有服务和端点现在都被拆分成一堆微小的代码片段,即微服务。目标是将服务器完全从开发人员那里抽象出来,并仅根据函数的调用次数来计费。这意味着此类服务易于扩展。
然而,事情并非如此乐观。FaaS 一直在经历一些初期问题。您认为错误是如何处理的?没有物理服务器进行监控确实有点费脑筋。深入了解系统本身相当困难,尤其是在大规模系统上。
涉入浅水区
要了解如何编写无服务器应用程序,我们首先需要了解其背后的原理。我们可以使用哪些工具和服务来实现这一切。
AWS Lambda
AWS Lambda是一种计算服务,可让您运行代码而无需配置或管理服务器。– AWS 文档
Lambda是一个基于事件的云代码运行系统。你无需担心服务器,只需关心你编写的代码。它会自动扩展,并且只按实际运行代码的时间(即计算时间)收费。最重要的是,它会自动扩展!这太棒了!你再也不用担心你启动的EC2 实例是否足够大,无法服务所有用户了。
AWS API 网关
如果没有API 网关, Lambda 就不完整。所有 Lambda 函数都需要触发事件才能调用。网关提供了触发这些函数的 REST 端点。假设你有一个普通的 Express 应用。你通常会app.get()
为特定路由创建一个方法,如下所示:
app.get('/', function(req, res, next) { /* execute some code */ });
当用户点击'/'
路由时,事件将触发回调函数。Gateway 是路由,Lambda 是回调函数。
无服务器框架
管理所有这些真是太痛苦了。我第一次尝试的时候,花了大半天才搞清楚每个功能的作用。理由很充分。文档太复杂了,对初学者一点也不友好。无服务器来拯救你!
Serverless 是部署和运维无服务器架构的工具包。专注于您的应用程序,而非基础设施。– Serverless.com
无服务器框架将您所需的所有工具捆绑到一个易于管理的软件包中,使创建和部署无服务器应用程序变得简单直接。它非常棒,它抽象了您在 AWS 控制台中必须执行的所有繁琐任务,例如创建函数并将其连接到事件。唯一的缺点是,每次要测试函数时,您都必须将代码推送到 AWS,而在本地模拟环境则有点麻烦。
无服务器架构的应用场景非常广泛。由于其易于扩展且维护成本低,任何在生产环境中,用户吞吐量变化较大的应用程序都可以选择无服务器架构。最后,如果你不擅长 Linux shell,并且 DevOps 不适合你,那么你完全有理由尝试无服务器架构。
新的思维方式
无服务器架构是无情的。这是事实。仅仅是设置它就需要相当多的脑力劳动。我还没算上在本地模拟它。那完全是另一回事。
这种敌意迫使我们改变方法。我们必须接受无法掌控整个系统的事实。但人类终将适应并克服。无服务器框架就像一位身披闪亮盔甲的骑士。
让我们开始创建一个简单的无服务器功能。
设置 Serverless 非常简单。你只需要通过 npm 安装它并绑定你的 AWS 账户即可。不用担心,如果你对 AWS 控制台感到困惑,没关系。我会逐步分解整个过程,带你一步步完成。
1.首先需要全局安装Serverless。
启动终端窗口并运行:
$ npm install -g serverless
现在,您已在计算机上全局安装了 Serverless 框架。现在,您可以从终端中的任何位置使用 Serverless 命令。
注意:如果您使用的是 Linux,则可能需要以 sudo 身份运行该命令。
2. 在 AWS 控制台中创建 IAM 用户
打开你的 AWS 控制台,点击左上角的服务下拉菜单。你会看到一大堆服务出现。在搜索框中输入“IAM”,然后点击它。
您将被重定向到您帐户的 IAM 主页。继续添加新用户。
为新的 IAM 用户选择一个有趣的名称,并授予该用户编程访问权限。继续下一步。
现在,您可以为用户添加一组权限。由于我们将让 Serverless 在我们的 AWS 账户上创建和删除各种资产,因此请检查 AdministratorAccess。
继续下一步,您将看到用户已创建。现在,也只有现在,您才有权访问用户的访问密钥 ID 和秘密访问密钥。请务必记下它们或下载 .csv 文件。请妥善保管,切勿向任何人展示。虽然这只是一个演示,但我已将它们像素化,以确保您了解保护它们安全的重要性。
完成后,我们终于可以继续将密钥输入无服务器配置中。
3. 在无服务器配置中输入 IAM 密钥
太棒了!保存密钥后,您就可以设置 Serverless 来访问您的 AWS 账户了。切换回终端,在一行中输入以下代码:
$ serverless config credentials --provider aws --key xxxxxxxxxxxxxx --secret xxxxxxxxxxxxxx
按下回车键!现在,你的 Serverless 安装知道在运行任何终端命令时要连接到哪个账户了。让我们开始实际操作吧。
4.创建您的第一个服务
创建一个新目录来存放您的无服务器应用服务。在那里启动一个终端。现在,您可以创建新服务了。您可能会问,什么是服务?可以将其视为一个项目。但实际上并非如此。在这里,您可以定义 AWS Lambda 函数、触发这些函数的事件以及它们所需的任何 AWS 基础设施资源,所有这些都包含在一个名为serverless.yml的文件中。
返回您的终端类型:
$ serverless create --template aws-nodejs --path my-service
create 命令会创建一个新的service。震惊!但接下来才是有意思的部分。我们需要为函数选择一个运行时。这被称为template。传入 aws-node 会将运行时设置为 Node.js。这正是我们想要的。path会为该服务创建一个文件夹。在本例中,我们将其命名为 my-service 。
5. 使用代码编辑器探索服务目录
使用您常用的代码编辑器打开 my-service 文件夹。里面应该有三个文件。serverless.yml包含此服务的所有配置设置。在这里,您可以指定通用配置设置和每个函数的配置。您的serverless.yml如下所示,只是包含一些注释。
# serverless.yml
service: my-service
provider:
name: aws
runtime: nodejs6.10
functions:
hello:
handler: handler.hello
functions 属性列出了服务中的所有函数。您可以看到 hello 是handler.js文件中当前唯一的函数。handler 属性指向包含要在函数中运行的代码的文件和模块。默认情况下,此处理程序文件名为handler.js。确实非常方便。
打开handler.js文件,你会看到名为 hello 的处理程序模块和函数。该函数接受三个参数。event 参数表示传递给函数的事件数据。context 参数告诉我们函数的上下文、运行时间、状态以及其他重要信息。最后一个参数是一个回调函数,它会返回数据。在本例中,响应作为回调函数的第二个参数返回。第一个参数始终表示错误。如果没有错误,则传递 null。
// handler.js
module.exports.hello = (event, context, callback) => {
const response = { statusCode: 200, body: 'Go Serverless!' };
callback(null, response);
};
一切顺利,但我们仍然无法触发该函数。没有与之关联的事件,因此无法触发该函数。让我们修复这个问题。跳回到serverless.yml文件,并取消注释 events: 行。
# serverless.yml
service: my-service
provider:
name: aws
runtime: nodejs6.10
functions:
hello:
handler: handler.hello
events: # uncomment these lines
- http:
path: hello/get
method: get
注意不要弄乱文件的缩进,事件应该直接放在处理程序的下方。太好了,完成后,我们终于可以将函数部署到 AWS 了。
6.部署到AWS
部署过程非常简单。在服务目录中,在终端中运行以下命令:
$ serverless deploy -v
你会看到终端亮起,上面显示着大量消息。这就是 -v 的魔力所在。你一定会喜欢这些详细的日志!
但对我们来说最重要的是它会返回终端节点的日志。Serverless 自动创建了一个 API 网关终端节点,并将其连接到 Lambda 函数。这太棒了!?在浏览器中访问该终端节点会返回文本“Go Serverless!”
注意:如果您想通过命令行测试该功能,您可以运行:
$ serverless invoke -f hello -l
这将返回完整的响应对象以及有关 Lambda 函数状态的信息,例如持续时间和内存使用情况。
缓解疼痛
每次测试函数时,我都得把函数部署到 AWS,这太烦人了。如果能有个办法在本地模拟环境就好了。
扯了这么个尴尬的题外话,瞧!无服务器离线!现在我终于可以在本地测试所有代码,然后再推送到 AWS 了。这减轻了我的不少压力。
将 Serverless Offline 添加到你的服务中非常简单。只需安装一个 npm 模块并在serverless.yml中添加两行即可。
没有比向您展示更好的方法来证明这一点。
1.在服务目录初始化npm
现在你需要进入 my-service 目录并打开一个终端窗口。进入后,你可以运行:
$ npm init
2. 安装 Serverless Offline
初始化 npm 后,除了运行安装之外无需再做其他事情。
$ npm install serverless-offline --save-dev
--save-dev 标志将把包保存为开发依赖项。
在继续之前,首先需要让终端知道有新的命令可用。因此,在serverless.yml文件中添加两行新命令。
# serverless.yml
service: my-service
provider:
name: aws
runtime: nodejs6.10
functions:
hello:
handler: handler.hello
events:
- http:
path: hello/get
method: get
# adding these two lines
plugins:
- serverless-offline
3. 本地运行
要确保您已正确安装所有内容,请运行:
$ serverless
您应该会在列出的各种选项中看到一个名为“离线”的选项。如果看到,就可以开始了。
注意:如果您想查看有关 Serverless Offline 的更多有用信息,请在终端窗口中运行 serverless Offline --help。
完成所有这些后,继续启动 Lambda 和 API Gateway 的本地仿真。
$ serverless offline start
您将在终端中看到所有路由列表。您的 Lambda 函数现在已在本地主机上运行。默认端口为 3000。您可以打开浏览器查看。访问端点http://localhost:3000/hello/get将返回与上例相同的文本,其中包含已部署的函数。
这真是太棒了!现在我们不用频繁地把代码推送到 AWS 去验证了。我们可以在本地测试,只有确定没问题了才推送。
看着我的背影
在传统应用程序中,一旦出现问题,你就会立即知道。你也知道问题出在哪里。真是太喜欢那些堆栈跟踪了!无论如何,这类应用程序的监控过程非常简单。这与使用无服务器有什么关系?AWS CloudWatch 上的日志非常糟糕。我花了很长时间才找到简单应用程序的故障函数,想象一下大规模应用程序的可怕之处。
我发现Dashbird是一个很好的替代方案。它免费,而且看起来很有前景。而且他们也不需要信用卡,让人感觉“为什么不试试呢”。
只需 5 分钟即可启动并运行该服务,这主要是因为他们有出色的入门教程。
将 Dashbird 与 Serverless 连接起来,终于让我可以清楚地看到我的应用运行情况了。有人在背后守护着自己,真是太棒了。
错误会高亮显示,我可以看到系统的整体健康状况。真是太方便了!它还能跟踪成本。不用担心超出预算。甚至还包含实时监控。这真是太棒了。
这样的工具使得管理大型应用程序变得轻而易举。
总结
多么奇妙的旅程!您现在已经见证了从传统 Web 开发到无服务器革命的转变。有了这些简单的工具,我们现在拥有了创建出色、可扩展且可靠的应用程序所需的一切。
唯一阻碍我们前进的是我们自己的思维模式。意识到函数不等于服务器将是一个转折点。但是,我们正朝着正确的方向前进。像Serverless和Dashbird这样的工具极大地缓解了这种痛苦的转变。在我探索无服务器架构的未知领域时,它们给了我很大的帮助。
我强烈建议你继续使用这些工具。尝试将它们融入你现有的开发流程。你会因为突然获得如此多的支持而感到轻松自在。这对缓解紧张情绪也有奇效。
如果您想查看我们上面编写的所有代码,请访问此处的存储库。或者,如果您想阅读我的最新文章,请访问此处。
希望大家喜欢阅读这篇文章,就像我喜欢写这篇文章一样。
你觉得这篇教程对大家有帮助吗?欢迎分享。如果你喜欢,请在下方点个 爱心 ,这样其他人就能在 Dev.to 上看到它了。
免责声明:Tracetest赞助了这篇博文。使用可观察性可以将测试创建和故障排除的时间和精力减少 80%。
鏂囩珷鏉ユ簮锛�https://dev.to/adnanrahic/a-crash-course-on-serverless-with-nodejs-5jp