本文概述
创建软件并不能以编写良好的代码结尾。在部署软件并能够正确处理请求以及在不影响性能和运行成本的前提下进行扩展时, 它就完成了。
你可能正在考虑如何使用云计算来处理所有这些事情。 “那么, 这种无服务器的新事物是什么, Vignes?”
无服务器计算是一种体系结构样式, 其中的代码在云平台中执行, 因此我们无需担心硬件和软件设置, 安全性, 性能以及CPU空闲时间成本。这是云计算的一项进步, 它超越了抽象软件环境的基础架构。这意味着无需配置即可运行代码。
使用无服务器, 以下将是你的工作风格:
-
开发代码。
-
将代码上传到服务提供商。
-
配置触发器(在本例中为HTTP请求)。
我们的工作完成了!现在, 平台提供商将处理传入的请求和扩展。
无服务器微服务简介
无服务器架构通常与微服务风格设计结合在一起。微服务是大型软件的独立部分, 可处理对特定模块的请求。通过创建可在无服务器环境中运行的微服务, 维护代码和加快部署变得很容易。
AWS Lambda和GCF简介, 比较
无服务器功能通常称为”后端即服务”或”功能即服务”。无服务器计算提供商的数量开始增加。但是, 一些传统的大公司也提供无服务器选项, 例如Amazon Web Services的AWS Lambda Functions和Google Cloud的Google Cloud Functions(GCF), 而后者正在我处于测试阶段时使用。尽管它们的工作原理相似, 但它们之间还是有一些重要的区别。
AWS Lambda | Google Cloud功能 | |
---|---|---|
语言支持 | Node.js, Python, C#, Java | Node.js |
扳机 | DynamoDB, Kinesis, S3, SNS, API网关(HTTP), CloudFront等 | HTTP, Cloud PubSub, 云存储桶 |
最长执行时间 | 300秒 | 540秒 |
在本文中, 我们将介绍使用GCF实施无服务器代码部署的过程。 Google Cloud Functions是一种轻量级的, 基于事件的异步计算解决方案, 可让你创建小型的, 单一目的的函数来响应云事件, 而无需管理服务器或运行时环境。
GCF具有三种基于触发器的可能实现。
-
HTTP触发器将HTTP请求路由到云功能
-
内部Google发布/订阅触发器将发布和订阅请求路由到云功能
-
云存储桶触发器将对存储桶所做的任何更改路由到云功能
让我们使用Google Cloud Functions创建基于HTTP触发器的设置
Google Cloud Functions不需要任何其他特殊设置或安装。 GCF确保设置默认节点环境并准备执行。使用HTTP作为触发器创建云功能时, 它将提供一个URL来触发该功能。与使用API网关进行通信的AWS Lambda相比, Google Cloud Functions根据projectID和区域立即提供URL。
创建无服务器Node.js应用程序
为了使代码在GCF中可执行, 我们应该将代码包装在一个函数中。每当触发发生时, GCF都会调用该特定函数。可能的方法是上传,
-
单个文件:导出默认函数, 该函数将根据请求调用其他函数。
-
多个文件:具有一个index.js文件, 该文件要求所有其他文件并导出默认功能作为起点。
-
多个文件:在package.json中使用” main”:” main.js”作为起点配置一个主文件。
以上任何一种方法都可以使用。
GCF支持特定的Node运行时版本。确保编写代码以支持该特定版本。在创建此帖子时, GCF支持Node版本v6.11.1。
要创建函数, 需要考虑的选项很少。
-
内存这告诉你在一个运行时间内处理请求需要多少内存。以MB为单位定义。对于小型应用程序, 128MB应该足够, 但是可以增加到2GB。
-
超时顾名思义, 超时定义了预期的代码执行超时。此后, 代码将被杀死并停止。此后的任何执行都会突然停止。最大超时为540秒。
-
要执行的功能尽管可以从主处理程序文件中导出多个功能, 但我们需要配置一个应触发以处理请求的功能。这允许开发人员具有基于HTTP方法/ URL的多个入口点。
要上传代码, 只需复制代码粘贴即可创建功能门户。对于多个文件, 请压缩内容并上传文件。确保, 对于ZIP文件, 应该有一个index.js文件或一个package.json文件, 其中提到了主文件。
任何NPM模块依赖项都应在package.json中提及。 GCF会尝试在首次安装过程中安装package.json文件中提到的模块。
让我们创建一个简单的处理程序以返回200状态和一些消息。创建一个函数, 并将以下代码添加到源代码中。
exports.httpServer = function httpServer(req, res) {
console.log(req);
res.status(200).send('Server is working');
}
创建函数后, 打开提供的URL即可触发该函数。它应该像下面这样响应。
现在, 让我们检查日志中的req对象。要查看日志, GCF可以从控制台直接提供选项。单击垂直点并打开日志选项。
现在, 让我们更新代码以处理/ users的简单路由。
以下代码用于处理/ users路由的简单GET&POST请求:
exports.httpServer = function httpServer(req, res) {
const path = req.path;
switch(path) {
case '/users':
handleUsers(req, res);
break;
default:
res.status(200).send('Server is working');
}
};
const handleUsers = (req, res) => {
if (req.method === 'GET') {
res.status(200).send('Listing users...');
} else if (req.method === 'POST') {
res.status(201).send('Creating User...')
} else {
res.status(404);
}
}
更新后, 让我们现在在浏览器中对其进行测试, 但是这次以/ users结尾。
这很酷。我们使用路由创建了一个基本的HTTP服务器。
运营与调试
如果代码是故事的结尾, 那么你将不会研究无服务器Node.js应用程序之类的基础架构选项。以下是有关如何完成部署和调试等常见任务的简短摘要。 Node.js开发人员已为其他应用程序做的事情。
部署:
功能代码可以通过四种方式部署。
-
在控制台中复制粘贴代码
-
上载一个ZIP文件
-
从云存储桶作为ZIP文件进行部署
-
从云源存储库部署
显然, 最方便的选择是从源存储库进行部署。
调用:
在创建功能时, 控制台会提供HTTP URL来触发功能, 其格式为:https:// <region>-<project-id> .cloudfunctions.net / <function-name>
AWS Lambda的函数存在冷启动问题, 这使得函数执行需要花费更多时间才能启动。一旦启动, 以下执行将正常响应。此初始额外的启动时间称为冷启动。尽管我们没有与该主题相关的GCF官方文档, 但在测试过程中并未出现冷启动问题。
调试:
GCF与Google Cloud中的Stackdriver Logging服务集成。所有控制台日志和错误都将记录在此处, 它有助于调试已经部署的代码。
测试:
控制台提供了通过传递JSON作为输入来测试功能的选项。该函数将以JSON作为输入来调用, 输出将显示在控制台中。请求(输入)和响应类似于Express.js框架, 并且可以在开发过程中进行单元测试。如果你需要关于Node.js测试的复习, 请查看《 Node.js实际进行集成测试指南》。
局限性和后续步骤
使用无服务器功能有其自身的优势, 也有局限性
-
供应商锁定:它将我们编写的代码限制为一个特定的服务提供商。将代码移至另一个提供程序时, 需要大量代码来进行迁移, 以重新编写代码。由于这可能是一个大问题, 因此在选择服务提供商时应格外小心。
-
请求和硬件资源数量的限制:提供程序通常会限制函数一次处理的并行请求的数量。也有内存限制。通过与提供者对话, 可以将这些类型的限制提高到更高水平, 但是它们仍然存在。
Google Cloud Functions正在日趋完善。它仍在不断改进和更新, 尤其是在它可以支持的语言中。如果你打算使用Google Cloud功能, 请留意变更日志, 以免实施中发生任何重大变更。
评论前必须登录!
注册