文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

使用Node.js和AWS Lambda创建无服务器的微服务经过了Camilo Reyes, Joan Yin, Yaphi BerhanuMoritz Kröger这几位同行的评审。 多亏所有SitePoint的同行评审,才使SitePoint内容成为行业最好!

Create Serverless Microservices with Node.js and AWS Lambda

如果你曾经想要写一个网络应用程序或API,而且不会因为服务器而弄得晕头转向,那么 亚马逊的 Lambda 可能正是你想要的。 AWS是由亚马逊开发并公开提供的开发人员的工具宝箱。

作者的更多推荐

在本文中,我们将使用 Lambda—Amazon Web Services(AWS)套件中的一个新工具—来启动并运行一个微服务。 我们将使用 Lambda 创建一个 HTTP GET 终端,该终端使用 GitHub 的API 发起请求,从 GitHub 中提取存储库信息并返回一个 JSON 响应。

第 1 段(可获 1.81 积分)

为了方便你可以按本文中的步骤进行操作,你需要一个自己的AWS账户。 如果没有,您可以在https://aws.amazon.com/ 上创建免费的AWS账户。

什么是 AWS Lambda?

Lambda的口号是:“运行代码不用考虑服务器”。乍一看,这可能让人觉得比较困惑。 代码究竟是在哪里或如何运行的呢?

无服务器与函数即服务

“无服务器”是一个新的软件基础设施术语,你可能有所耳闻。 它用于描述按需执行代码的解决方案。“无服务器”这个术语可能会误导大家,因为事实上,在程序中仍然有服务器。 更好的描述符是FaaS或“函数即服务”。

 

第 2 段(可获 1.39 积分)

这两个定义用于描述新的开发和部署经验。 这种新体验被认为是“无服务器”的,因为作为开发人员,不再需要管理,监视或扩展正在运行代码的任何服务器。 您只需将代码上传到FaaS提供服务的程序(在本例中为AWS Lambda),FaaS提供程序将在后台帮你执行代码并管理所有的基础架构。

Serverless 架构的利与弊

鉴于这种“Serverless”架构的扩展定义,让我们来看看在运用Lambda时的一些利与弊

第 3 段(可获 1.2 积分)

优点

  • 按需使用定价.

    传统服务器托管使用重复的计费周期。你的服务器经常启动和运行正在使用的资源或者等待接收数据。 为了保持服务器正常运行,你按月或按年作为账单周期来支付费用。

    Lambda采取按需定价, 按每个函数的使用进行计费, 这将意味着如果你的项目使用的 Lambda 的功能不是有高需求的,那么相比传统的托管解决方案,你可以节省大量的金钱。

    Lambda 定价如下:

    • 每 100 万个请求 0.20 美元
    • 每 个GB-second 的计算时间 0.00001667 美元,每次执行时间接近 100ms

    想了解更多请点击: https://aws.amazon.com/lambda/pricing/

  • 内置的自动伸缩功能 

    在一个传统的被托管的基础设施中, 你会进入到这样一个时期,你可能需要担心性能和扩展性。随着应用程序使用的量和流量的增加,您可能需要添加更多的托管服务器基础设施来跟上需求。对于你的用户而言,这可能会导致失败,或成为瓶颈。  而Lambda 则会在需要必要时自动完成扩展或裁减,以减少额外的大量开销,

第 4 段(可获 2.35 积分)

缺点

  • 与本地开发工作流程不一致。

    你可以在本地写 Lambda 功能代码,隔离测试,但是在没有创建你的拼装版的 Lambda,你不能在本地模拟生产环境。

Lambda 关键概念

函数代码和触发器

Lambda 有两个主要概念:代码和触发器。 代码是不言自明的。 在我们的示例中,就是那些由您编写并上传到 Lambda 以产生你所需行为的 JavaScript 代码。

一旦你上传后,代码不会自行执行。 Lambda 有一个称为“触发器”的附加概念。触发器是由其他 AWS 服务触发的事件,它们将数据传递到 Lambda 函数以供执行。

第 5 段(可获 1.36 积分)

一些示例触发器:

  • 用指向 AWS API 网关的 HTTP 请求来触发 Lambda 代码。

  • 用轮循的事件触发,例如来源于 CloudWatch 事件的 corn 任务。

  • 用 DynamoDB 表的更新来触发 Lambda 代码。

Lambda 代码函数签名

你可以从与预期的 Lambda 签名相匹配的 JavaScript 中,通过导出一个常规函数来定义一个 Lambda 函数。

exports.myLambdaFunction = (event, context, callback) => {
   // Use callback() and return 
}

该函数接收3个参数:

  1. event — Lambda 传递给函数的'触发数据'的键值对字典。

  2. context — AWS 内部信息,例如 AWS 请求ID, Lambda 超时时间, 和日志信息.
     更多详细信息请看: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-context.html

  3. callback — 一个标准的 JavaScript 异步回调句柄。
     更多详细信息请看: http://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html#nodejs-prog-model-handler-callback

第 6 段(可获 1.6 积分)

创建一个Lambda函数

要开始创建一个新的Lambda函数,请访问Lambda操作面板:
https://console.aws.amazon.com/lambda/home?region=us-east-1#/functions?display=list

它看起来应该是这样:
Screenshot of the AWS Lambda dashboard

点击蓝色按钮开始创建一个Lambda函数。

选择一个蓝图

下一个屏幕应提示您选择蓝图并显示可过滤蓝图的列表。 单击空白功能选项,它应该是蓝图列表中的第一个。 此页面可用于将来的引用,目的是为了检查Lambda的其他实用程序。

配置触发器

第 7 段(可获 1.19 积分)

下面的截图是触发器的配置,如下图所示:

Screenshot of the Configure triggers screen

单击Next跳过这个屏幕。在我们设置好我们函数之后,我们将分配一个触发器。

配置函数

Screenshot of the fields on the Configure function screen

在本节中我们将给我们的Lambda函数命名。 我用nameGithubGet作为我们的函数名。当然,据情况的需要,您也可以为函数提供描述。

指定Lambda函数的代码

默认情况下,Lambda UI设置为内联编辑代码。 您应该看到一个内联编辑器,编辑器中有一个样本函数,如下所示:

Screenshot of the online function editor

内联编辑器需要很少的开销来获取和运行lambda代码,但对于本教程,我们将做一些更进阶的事情。

第 8 段(可获 1.44 积分)

创建复杂的函数依赖关系

在大多数真实环境中,你如果要创建更多的复杂函数,常常需要通过npm来安装第三方的库。

让我们创建一个使用npm依赖项的自定义函数,并将其上传到Lambda。 您可以按照下面的步骤,或者可随意使用示例代码库 中的代码

创建一个新的函数

让我们为我们的新函数设置一个文件夹,并在文件夹中用默认的package.json文件初始化npm:

npm init -f

 接下来,我们将安装GitHub客户端:

npm install github

创建 index.js文件,使用以下代码:

第 9 段(可获 1.16 积分)

下面是这段代码的功能细节:

  1. 引入并初始化了GitHubAPI      
  2. 定义了一个与Lambda签名匹配的 handler 函数。
  3. handler 函数被调用时,它会发出一个查询请求到GitHub,对所有符合‘sitepoint’的数据仓库进行查询。
  4. 在Github的应答格式中,创建了一个map数据结构,其中包含了每个数据仓库的网址和星标数。
  5.  最后,用http响应(如对象)调用Lambda的回调函数,好与API 网关预计集成 相匹配。

将代码上传至 AWS Lambda

任意使用一个你熟悉的zip工具,创建一个包含函数文件的zip压缩包。我在OS X系统上使用zip命令行是这样的:

第 10 段(可获 1.38 积分)
zip -r lambdaupload.zip ./index.js ./node_modules/

  要将代码上传到Lambda, 在内联编辑器的 “代码条目类型” 选项上选择 “ 上传 zip 文件 ”,然后使用弹出的窗口上传您的代码。

Animated GIF showing the upload to Lambda process

配置函数的handler和role

在这一部分下,我们要设置几个值。 Handler是在上传的JavaScript文件中Lambda函数的引用。 默认情况下,它设置为index.handler。hander函数通过查找index文件与我们上传的文件相映射,并为我们hander函数检索出与我们export.handler文件相对应的的导出语句。

第 11 段(可获 1.14 积分)

使用以下信息填写“Role”字段,为创建Lambda函数的基本角色:

  • Role: 从模板中创建新的role
  • Role name: Lambda获取Role
  • Policy templates: 简单的微服务权限

Screenshot of the settings mentioned above

这部分完成后, 单击“Next” 按钮继续。比可以看到  ‘Review’ 界面的概述配置:

Review screen summarizing the chosen options

如果一切正常,单击“创建函数”按钮继续。

为我们的新函数分配一个触发器

到目前为止,我们的函数已经被创建和初始化,我们需要一种方法来调用它。 是为该函数分配触发器的时候了。 我们将使用API网关作为我们的触发器。

第 12 段(可获 1.34 积分)

API网关是另一个AWS服务,它可以自动创建HTTP终端,而且你可以配置该终端的响应信号。 我们将把我们的Lambda函数作为API网关响应。

  1. 点击 ‘触发器’ 按钮。
  2. 点击 ‘添加触发器’ 按钮。
  3. 点击 lambda旁边的空白框。
  4. 选择 “API 网关”。
  5. 在安全选项框选择 “打开”。
  6. 单击提交

这些步骤显示在以下GIF中:

Animated walk-through of the steps to add an AWS Lambda function trigger

成功添加触发器后,您可以在 Triggers 选项卡下看到它已经附加到您的函数。

Triggers tab, showing the newly created API Gateway trigger

  在PI Gateway ID下会列出一个URL。  你可以在浏览器中访问此网址,而且你会看到类似于以下内容的JSON响应:

第 13 段(可获 1.31 积分)
[{"url":"https://github.com/bodrovis/Sitepoint-source","stars":106},
{"url":"https://github.com/Azzurrio/moviestore","stars":80},
{"url":"https://github.com/bodrovis/SitepointMiniChat","stars":54},
{"url":"https://github.com/upchuk/d8-demo-modules","stars":34},

恭喜你!您已经在Lambda上成功地部署和触发了代码。

后续步骤和Lambda的未来

希望此项目为您使用AWS Lambda奠定了良好的基础。 尽管在我们的函数代码中使用了第三方客户端(GitHub)来集成,但是这个客户端可以由任何其他客户端的API或数据库客户端连接进行替换。

第 14 段(可获 0.71 积分)

无服务器框架

这篇文章中演示了建立起 Lambda 的这个过程。这过程看起来手工操作比较多,时间也不长。还有另外一个配置和初始化 Lambda 的方法,就是通过 AWS API 来完成。

现在,已经有一些框架基于 AWS API 建立起来了,它们有助于简化这个过程。

  • https://serverless.com/ 

    Serverless 框架是当前最强大的无服务器框架。在写文本的时候,这个框架进行了重大版本更新,从0.5 更新到官方 1.0 发行版。很不幸,这个更新并不向后兼容。大多数流行的插件当前还是 0.5,未能更新到 1.0,还需要等等待一段时间才能使用。

                Serverless 以及它的插件,承诺提供一个非常全面的 Lambda 体验。它的本地开发环境提供了快速迭代、自动化的 Lambda 代码开发、多个开发平台环境,以及其它功能。

  • https://open-lambda.org/

     OpenLambda 试图通过提供一个本地开发体验来模拟 Lambda 环境。它提供工具来让部署 Lambda 代码变得容易,也提供快速迭代。这弥补了上面列出的 Lambda 的一些缺点。

第 15 段(可获 2.29 积分)

你有什么感想?

在你将来的项目中会考虑使用FaaS么?  或许你已经开始使用Lambda作为应用程序架构的一部分? 无论如何,我很乐意听到你的想法。 请在下面的评论中分享您的想法吧!

第 16 段(可获 0.53 积分)

文章评论