Node.js 服务迁移到 Serverless 的实践

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 函数:

-- ---------
--------------- - ----- ------- -------- -- -
  -- ------ ------ ----
--
-- ------
----- ------- - -------------------
----- --- - ----------
----- ------ - -------------------- -- ------ ------ --------

----- ---- - ---------------- -- -----

------------------- ----------------

--------------- - ----

这样,我们就可以将上传图片的逻辑独立成一个 Lambda 函数,而原来的 app.js 中只需要包含路由相关的代码即可。

步骤二:打包代码

在 Serverless 环境中,我们需要将代码打包成一个 zip 文件上传到云服务提供商的控制台中。因此,我们需要用到 webpack 或者其他类似的打包工具进行代码打包。

以 webpack 为例,我们在 package.json 中添加以下配置:

---------- -
  -------- -------- -------- ------------------
--
------------------ -
  ---------- ----------
  -------------- --------
-

然后在项目根目录下新建 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 实例,代码如下所示:

----- ------- - -------------------
----- --- - ----------
------------ ----- ---- -- -
  --------------- ---------
---
-------------- - ----

然后我们需要运行以下命令打包代码:

--- ----
--- ------- ---------- ------- -----------
--- ------- ------ -------
--- -------

打包完成后得到的代码可以上传到 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


猜你喜欢

  • Kubernetes 中安全的 pod 策略

    Kubernetes 是一款用于容器编排和管理的领先开源平台。在 Kubernetes 中,pod 是最小的可部署对象。它是 Kubernetes 资源模型中的基本单位,并且它是多个容器的集合。

    1 年前
  • 基于 Koa2 的炸药级 error 处理技巧

    前端开发中,错误处理一直是一个非常重要的方面。特别是在服务器端应用程序开发中,错误处理问题尤为关键。Koa2 是一个极其灵活的服务器端 Web 框架,因此,错误处理在 Koa2 中也是至关重要的。

    1 年前
  • 基于 Hapi 实现网站实时聊天的经验分享

    随着移动互联网的发展和普及,实时聊天功能已经成为了现代网站的一个重要组成部分。在前端开发中,使用 Hapi 框架可以轻松地实现网站的实时聊天功能。本文将为大家详细介绍基于 Hapi 实现网站实时聊天的...

    1 年前
  • 使用 TypeScript 开发 Web 应用中的错误处理

    前言: 在 Web 应用中,错误处理是至关重要的。一旦经常出现错误,基本上没人会使用你的应用。这篇文章主要介绍使用 TypeScript 开发 Web 应用时,如何处理错误,并且提供一些具体的实例操作...

    1 年前
  • Angular SPA 应用中使用 ngResource 请求接口的方法

    在开发 Angular SPA 应用时,需要与后端交互,请求接口数据。使用 Angular 官方提供的 ngResource 模块可以简化请求接口的过程,使代码更加简洁易懂。

    1 年前
  • 如何实现响应式设计的 CSS Reset

    现今,在实现网页响应式设计时,CSS Reset 扮演着非常重要的角色。CSS Reset 是用来清除浏览器预设样式的一种技巧。而在实现响应式设计时,你需要根据不同设备大小和浏览器特性进行自适应的设置...

    1 年前
  • 在 React 应用中使用 Babel 实现 ES6 转换

    前言 随着前端技术的不断发展,JavaScript 语言在功能和用法上也不断更新和改善。然而,这也带来了许多问题。一些过时的浏览器不支持新的语言特性,这限制了我们的开发速度和用户体验。

    1 年前
  • Server-Sent Events 的底层协议详解

    在前端开发中,实时数据更新是非常常见的需求。例如,股票行情、聊天室消息等实时推送数据,需要用到一种技术来实现。传统的做法是使用轮询或长轮询技术,但这种技术不太友好,因为它需要不断向服务器发送请求,造成...

    1 年前
  • 使用 Angular 的 HttpClient 进行 http 请求的实现与异常处理

    Angular 是一款流行的前端框架,使用它进行前端开发的过程中,我们经常需要使用 HttpClient 进行 http 请求。在进行 http 请求时,需要注意一些问题,比如如何正确处理异常等。

    1 年前
  • Docker Compose:使用外部服务启动和停止容器

    什么是 Docker Compose Docker Compose 是 Docker 公司提供的一个用于定义和管理多个容器应用的工具。它允许用户使用一个 YAML 格式的文件来配置整个应用的服务,并通...

    1 年前
  • 使用 ESLint 在项目中统一代码风格

    随着前端项目越来越复杂,并且参与的人员也越来越多,将代码统一风格变得尤为重要。在 JavaScript 中,则可以使用 ESLint,它可以帮你在开发时接下来各种风格问题,从而保证代码风格的一致性,本...

    1 年前
  • 解决 Enzyme 测试中的 “TypeError: Cannot read property 'setState' of undefined” 错误

    在 React 项目的开发中,单元测试是一项重要的任务。而 Enzyme 是一个流行的 React 测试工具,它提供了丰富的 API 来模拟和操作组件。但是,在使用 Enzyme 进行测试时,你可能会...

    1 年前
  • LESS 中的模块化编程指南

    在前端开发中,样式表的管理一直是一个令人头痛的问题。之前,我们只能通过将代码分离成多个文件来降低复杂度。但是,这样做并不能使整个样式表更加易于维护。幸运的是,LESS 解决了这个问题,并引入了一些概念...

    1 年前
  • RESTful API 中使用 MongoDB 的方法

    在现代 Web 开发中,RESTful API(Representational State Transfer)已经成为了最常见的 API 设计风格,它通过 URI(统一资源标识符)来表示资源,并利用...

    1 年前
  • Socket.io 教程:如何实现实时地图更新

    随着技术的不断进步和发展,web 应用程序越来越多地需要支持实时通信。而 Socket.io 就是一种用于实时通信的工具,它能够在客户端和服务器之间建立一个持久性连接,从而实现实时消息传递。

    1 年前
  • 使用 Karma 和 Chai 进行 JavaScript 单元测试的指南

    单元测试是开发中非常重要的一环,它可以帮助我们发现代码的问题、调试代码,并且保证代码质量。在 JavaScript 的开发中,使用 Karma 和 Chai 进行单元测试是非常流行的做法。

    1 年前
  • CSS Grid 如何实现算法矩阵布局

    前言 CSS Grid 是一个强大的布局系统,可以实现复杂的布局,支持网格排列,自适应大小等特性。在前端开发中,很多时候需要对数据进行排列,例如排行榜,数据列表等,这时候使用算法矩阵布局可以方便快捷地...

    1 年前
  • Cypress:如何在测试中模拟键盘事件?

    在前端开发中,自动化测试是非常重要的一环。Cypress 是一款被越来越多前端开发者所认可的自动化测试框架。Cypress 具有高效稳定的测试能力和易于调试的特点,因此备受欢迎。

    1 年前
  • 在 Mocha 中使用 ES6 进行测试的方法

    在 Mocha 中使用 ES6 进行测试的方法 在前端开发中,测试是一个必须要进行的过程,它可以确保我们的代码符合预期并且能够正常工作。而 Mocha 是一个常用的测试框架,它可以帮助我们进行单元测试...

    1 年前
  • MongoDB 中如何进行数据迁移

    随着业务的发展和数据量的增加,可能需要将 MongoDB 中的数据迁移到另一个服务器或集群。本文将介绍 MongoDB 数据迁移的几种方法和工具,并提供示例代码和操作说明。

    1 年前

相关推荐

    暂无文章