Serverless 是近几年来变得越来越流行的一种云计算模型,它可以让开发者将精力更多地集中在业务逻辑上而不是服务器管理上。在此背景下,将已有的 Node.js 服务迁移到 Serverless 环境中,不仅能更加灵活地管理应用,还可以大幅减少服务器维护开销。本文将介绍 Node.js 服务迁移到 Serverless 的实践经验,为大家提供有深度、有学习和指导意义的内容。
什么是 Serverless?
Serverless 是一种云计算模型,其核心思想是将应用程序的逻辑部分独立出来,运行在一个事件驱动的环境中。这个环境由云服务提供商(如 AWS Lambda、Azure Functions、Google Cloud Functions 等)管理,使用者只需要上传代码,然后在指定的入口处绑定触发器即可。
Serverless 的优势在于,它可以让我们将精力更多地集中在业务逻辑上而不是服务器管理上。当我们将应用程序的逻辑部分拆分成多个小函数时,每个函数都可以独立进行扩展和管理,而且只有在被触发时才会被执行,因此可以显著减少成本。
对于 Node.js 的应用程序来说,迁移到 Serverless 环境中的主要流程包括以下几个步骤:
步骤一:构建函数
首先我们需要将已有的 Node.js 服务拆分成多个小函数(也称为 Lambda 函数),每个函数只承担一个功能。这样,每个函数都可以独立进行扩展和管理。
例如,我们有一个 Node.js 服务代码可以处理上传图片的请求,其中代码的结构如下所示:
-- -------------------- ---- ------- -- ------ ----- ------- - ------------------- ----- --- - ---------- ----- ---- - ---------------- -- ----- ------------------- ----- ---- -- - -- ------ ------ ---- --- ---------------- -- -- - ------------------- --------- -- ---- ---------- ---
我们需要将其拆分成两个 Lambda 函数:
// upload.js exports.handler = async (event, context) => { // handle upload here };
-- -------------------- ---- ------- -- ------ ----- ------- - ------------------- ----- --- - ---------- ----- ------ - -------------------- -- ------ ------ -------- ----- ---- - ---------------- -- ----- ------------------- ---------------- --------------- - ----
这样,我们就可以将上传图片的逻辑独立成一个 Lambda 函数,而原来的 app.js 中只需要包含路由相关的代码即可。
步骤二:打包代码
在 Serverless 环境中,我们需要将代码打包成一个 zip 文件上传到云服务提供商的控制台中。因此,我们需要用到 webpack 或者其他类似的打包工具进行代码打包。
以 webpack 为例,我们在 package.json 中添加以下配置:
"scripts": { "build": "webpack --config webpack.config.js" }, "devDependencies": { "webpack": "^5.39.1", "webpack-cli": "^4.7.2" }
然后在项目根目录下新建 webpack.config.js 文件,配置如下:
-- -------------------- ---- ------- ----- ---- - ---------------- -------------- - - ------ - ------ ------------- ------- -------------- -- ------- - --------- ------------ ----- ----------------------- ------- -- ------- ------- -- ------- --- ------- -------- ----- ------------- -- ----------- --
然后运行 npm run build
命令即可将代码打包成 dist/index.js 和 dist/upload.js 两个文件。
步骤三:上传代码
打包后的代码可以在云服务提供商的控制台中上传。以 AWS Lambda 为例,我们需要在控制台中新建一个函数,选择“上传”作为函数代码来源,然后上传刚刚打包好的 zip 文件即可。
步骤四:配置触发器
对于一个函数来说,我们需要在控制台中选择触发器,让函数在触发器被激活时执行。触发器可以是以下几种类型:
- API Gateway
- S3
- Kinesis
- DynamoDB Stream
- CloudWatch 规则
- SNS 主题
- Alexa 技能
例如,我们可以在控制台中选择 API Gateway 作为触发器,然后将上传图片的路由与 API Gateway 绑定,这样每次收到上传图片的请求时,API Gateway 就会触发绑定的 Lambda 函数执行。
案例:将 Express 应用迁移到 AWS Lambda
我们以一个简单的 Express 应用为例,演示将其迁移到 AWS Lambda 的过程。
假设我们有一个 app.js 文件,其代码如下所示:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- --- - ---------- ----- ---- - ---------------- -- ----- ------------ ----- ---- -- - --------------- --------- --- ---------------- -- -- - ------------------- --------- -- ---- ---------- --- -------------- - ----
首先我们需要将其拆分成两个 Lambda 函数:一个用于处理 / 路径的请求,另一个仅包含 express 实例的文件。我们将第一个 Lambda 函数命名为 index,代码如下所示:
-- -------------------- ---- ------- --------------- - ----- ------- -------- -- - ----- --- - ----------------- ----- ------ - -------------- ----- -------- - ----- --- ----------------- ------- -- - ----- ------- - - ------- ----------------- ---- ----------- -------- -------------- ----- ----------- -- ----- --- - - --- --------- - --------------- - -- -- -------------- --- -------- --- ---- ------ -- - --------- ----------- ---------------- ----- -------- ------------- --- --------------- -- -- ------------ ----- --- ------ --------- --
其中,我们使用 express 实例处理请求,并通过 Promise 封装返回结果。注意,为了在 Lambda 函数中使用 app.js 中的 express 实例,我们需要将其作为一个模块导出。
第二个 Lambda 函数仅包含 express 实例,代码如下所示:
const express = require('express'); const app = express(); app.get('/', (req, res) => { res.send('Hello World!'); }); module.exports = app;
然后我们需要运行以下命令打包代码:
npm init npm install --save-dev webpack webpack-cli npm install --save express npx webpack
打包完成后得到的代码可以上传到 AWS Lambda,使用 API Gateway 作为触发器即可。在 API Gateway 中为 / 路径绑定 index 函数,然后在浏览器中输入 API Gateway 的地址即可看到“Hello World!”。
总结
本文介绍了将 Node.js 服务迁移到 Serverless 环境中的实践经验。我们首先将已有的服务拆分成多个小函数,然后使用 webpack 进行代码打包,最后在云服务提供商的控制台中上传代码并配置触发器。通过这些步骤,我们可以将 Node.js 服务迁移到 Serverless 环境中,更加灵活地管理应用,并且显著减少服务器维护开销。希望本文能够对大家有所帮助,为 Node.js 迁移到 Serverless 提供一些指导意义。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64715b3a968c7c53b0f3cc6d