前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版

Serverless 部署前后端项目实践,腾讯云 SCF 全流程笔记

首页2022-06-18 10:10:24Front-End
部署serverless腾讯云Node.js

一个只有几十个日活的小后台,为了它长期挂着一台 2 核 4G 的云主机,每月几十块钱雷打不动,还得自己管 nginx、管 pm2、管证书续期。这个账我算了很久都觉得不划算。后来把这类项目陆续搬到了腾讯云 Serverless 上,代码几乎没改,成本降到了免费额度以内,运维那部分直接消失了。

这篇是我把 Egg、Nest.js、Koa 三种 Node 后端框架,以及 Vue、React、VuePress 三种静态站点搬上腾讯云 SCF 的完整过程记录。从概念、脚手架安装,一直到 serverless.yml 每个字段怎么填、Layer 怎么拆、COS 图片上传怎么配、域名和 HTTPS 怎么绑,中间踩过的坑和控制台截图都留着。看完你应该能自己独立把一个项目部署上去。

在本篇文章中,我们将从浅入深,和大家一起学习以下知识:

  • Serverless 到底是什么,它和传统 ServerFul 架构、和「云函数」的区别在哪
  • serverless 脚手架安装,以及 WebIDE、VS Code 插件两条开发路径
  • 用 Serverless Framework 的 HTTP 组件部署 Egg、Nest.js、Koa 项目的完整配置
  • 用 Layer 分层把 node_modules 拆出去,让 sls deploy 快起来
  • 用 website 组件部署 Vue、React、VuePress 静态站
  • 云函数里连 MySQL 和 MongoDB,VPC 私有网络该怎么配
  • COS 对象存储介绍,以及 Express 在 Serverless 里实现图片上传
  • 自定义域名、HTTPS 证书,以及配额超限时的绕过办法

# 一、Serverless 架构介绍与安装

先把概念捋清楚,不然后面看 serverless.yml 里那些字段会一头雾水。

Serverless 又名无服务器。所谓无服务器并非是说不需要依赖和依靠服务器等资源,而是开发者再也不用过多考虑服务器的问题,可以更专注在产品代码上。

它是一种软件系统架构的思想和方法,不是软件框架、类库或者工具。它与传统架构的不同之处在于,完全由第三方管理,由事件触发,存在于无状态(Stateless)、暂存(可能只存在于一次调用的过程中)计算容器内。构建无服务器应用程序,指的是开发者可以专注在产品代码上,而无须管理和操作云端或本地的服务器或运行时(运行时通俗的讲就是运行环境,比如 nodejs 环境、java 环境、php 环境)。Serverless 真正做到了部署应用无需涉及基础设施的建设,自动构建、部署和启动服务。

一句话概括就是,Serverless 是构建和运行软件时不需要关心服务器的一种架构思想。

虚拟主机已经是快被淘汰掉的上一代产物了。云计算涌现出很多改变传统 IT 架构和运维方式的新技术,比如虚拟机、容器、微服务,无论这些技术应用在哪些场景,降低成本、提升效率是云服务永恒的主题。Serverless 的出现,把降低成本和提升效率这两件事同时往前推了一大步。它真正做到了 弹性伸缩、高并发、按需收费、备份容灾、日志监控 等能力开箱即用。

我自己的感受是,Serverless 最爽的不是省钱,而是「没有服务器可以坏」。以前半夜收到磁盘写满的告警,现在这类告警根本不存在。

# 1.1 传统的开发模式与 Serverless 开发模式对比

先看两张图的对比,能直观感受到差别在哪。下面这张是传统模式,从买机器、装环境、配 nginx 到发布,链路里每一环都要你自己负责。

传统开发模式的部署链路

图里每一个方框都是你要维护的东西,少一个环节服务就起不来。

再看 Serverless 的开发模式,中间那一大段基础设施被云厂商吃掉了,你的交付物退化成「一份代码 + 一份配置」。

Serverless 开发模式的部署链路

从流程视角再看一次,Serverless 改变的是整个软件交付的节奏,不只是省了几台机器。

Serverless 对软件开发流程的改变

# 1.2 Serverless 和 ServerFul 架构的区别

# 传统的 ServerFul 架构模式

ServerFul 架构就是 n 台 Server 通过网络通信的方式协作在一起。也可以说,ServerFul 架构是基于 Server 和网络通信(分布式计算)的软件实现架构,这里的 Server 可以是虚拟机、物理机,以及基于硬件实现的云服务器。

下面这张图画的就是这种结构,注意每个节点都需要你自己扩容和容灾。

ServerFul 架构示意图

看图的时候留意一点,节点之间的连线越多,你要维护的运维复杂度就越高。

# Serverless 架构模式

Serverless 的核心特点就是实现自动弹性伸缩和按量付费。同样一张架构图,画出来会干净很多。

Serverless 架构示意图

这张图里你能看到的只剩函数和触发器,机器那一层被完全抹掉了。

# 1.3 使用 Serverless 的优势

优势主要落在三件事上,资源分配、计费方式和弹性伸缩。

  • 资源分配:在 Serverless 架构中,你不用关心应用运行的资源(比如服务配置、磁盘大小),只提供一份代码就行。
  • 计费方式:在 Serverless 架构中,计费方式按实际使用量计费(比如函数调用次数、运行时长),不按传统的执行代码所需的资源计费(比如固定 CPU)。计费精确到了毫秒级,而不是传统的小时级别。个别云厂商推出了每个月的免费额度,比如腾讯云当时提供了每个月 40 万 GBs 的资源使用额度和 100 万次调用次数的免费额度。中小企业的网站访问量不是特别大的话完全可以免费使用。

下面这张是当时控制台里的计费说明截图,可以对照着看单价构成。

腾讯云 SCF 计费方式说明

这里补一句时效性的话,这篇写于 2022 年,文中所有额度和价格都是当时的行情。这几年各家的免费额度、计费单位和控制台界面都调整过好几轮,具体数字请以你打开控制台时看到的官方计费页为准,我不敢拿旧数字给你打包票。

  • 弹性伸缩:Serverless 架构的弹性伸缩更自动化、更精确,可以快速根据业务并发扩容更多的实例,甚至允许缩容到零实例状态来实现零费用,对用户来说是完全无感知的。而传统架构对服务器(虚拟机)进行扩容,虚拟机的启动速度也比较慢,需要几分钟甚至更久。

缩容到零这一条是最容易被低估的。一个内部工具站半夜没人访问,实例数就是 0,账单也是 0。

# 1.4 Serverless 的组成

这个词在不同语境下指的东西不一样,分开看会清楚很多。

  • 广义的 Serverless 更多是指一种技术理念,Serverless 是构建和运行软件时不需要关心服务器的一种架构思想。刚开始学 Serverless,你可以把它理解为虚拟主机的升级版本。
  • 狭义的 Serverless 是指现阶段主流的技术实现,由 FaaS 和 BaaS 两部分组成。

FaaS 就是云函数那一层,BaaS 是对象存储、数据库这些托管后端服务。下面这张图把两者的边界画得比较清楚。

FaaS 与 BaaS 的组成关系

记住这个划分,第五章讲 COS 和数据库的时候还会用到它。

# 1.5 Serverless 开发流程

开发流程和传统模式最大的差别在于,没有「上线部署」这个独立环节,sls deploy 就是全部。

Serverless 开发流程图

图里从写代码到线上可访问只有几步,后面第三章会把每一步落到具体命令上。

# 1.6 为什么要学 Serverless

先看看当时的招聘信息,能感受到岗位需求已经开始把它写进 JD 了。

招聘信息中出现的 Serverless 要求

再看当时 GitHub 的 star 数量和 npm 周下载量走势,这几张是 2022 年抓的数据。

Serverless 相关仓库的 star 增长

serverless 包的 npm 周下载量

Serverless 生态的关注度趋势

同样提醒一下,这几张趋势图是 2022 年的截面,现在的数字肯定不一样了,看趋势就好,别把绝对值当结论。

下面是当时已经在用 Serverless 的大公司名单。

已采用 Serverless 的公司列表

# 1.7 Serverless 的能力

厂商宣传的能力可以拆成计算、系统运维、业务运维三块来看。

# 计算能力

  • 资源按需分配,无需申请资源
  • MicroVM 做租户级别强隔离,Docker 做进程级别隔离
  • MicroVM + Docker 的轻量级资源可以做到毫秒级启动
  • 实时扩容,阶梯缩容
  • 按需收费

# 系统运维能力

  • 性能保障,整个链路耗时在毫秒级内,并支持 VPC 内网访问
  • 安全保障
    • 资源对用户不可见,安全由云厂商提供专业的保障
    • 提供进程级和用户级安全隔离
    • 访问控制管理
  • 自动扩缩容
    • 根据 CPU、内存、网络 IO 自动扩容底层资源
    • 根据请求数自动扩缩容函数实例,业务高峰期扩容满足高并发需求,业务低峰期缩容释放资源、降低成本
  • 自愈能力,每一次请求都是一个健康的实例

这里必须单独拎出来讲一个概念,冷启动和热启动。这是 Serverless 和常驻进程最大的行为差异,也是最容易在线上咬你一口的地方。

Serverless 中云函数被第一次调用会执行冷启动,云函数被多次连续调用会执行热启动。

云函数冷启动与热启动示意

看这张图的时候重点看时间轴,冷启动那一条多出来的就是实例初始化的开销。

  • 冷启动是指在服务器中新开辟一块空间供一个函数实例运行。这个过程有点像你把函数放到虚拟机里跑,每次运行前都要先启动虚拟机加载这个函数。以前冷启动非常耗时,目前云厂商已经能做到毫秒级别,这个过程我们不需要关心。但要注意的是,使用 Session 的时候可能会导致 Session 丢失,所以 Session 建议保存到数据库或者 Redis 里。
  • 热启动则是说,如果一个云函数被持续触发,云端就先不释放这个实例,下次请求仍然由之前已经创建的实例来运行。就好比虚拟机运行完函数之后没有关机,而是待机等待下一次调用。好处是省掉了「开机」这个耗时环节,代价是要一直维持激活状态,系统开销会大一些。

这个我踩过。第一版代码里我把登录态放在内存里,本地跑得好好的,上云之后随机掉登录。排查了一下午才反应过来是实例被回收了,内存里那份 Session 根本不保证还在。所以在 Serverless 里,任何进程内状态都要当成随时会消失来设计。

# 业务运维能力

  • 工具建设,包括 VS Code 插件、WebIDE、命令行、云 API、SDK
  • 版本管理、操作管理等
  • 故障排查
  • 监控报警
  • 容灾处理

# 1.8 主流 Serverless 厂商

国内外能选的厂商不少,各家的函数模型大同小异,差别主要在生态、区域和计费细节上。本文全程用腾讯云演示,因为它的 Serverless Framework 中文生态最完整,但思路在别家也通用。

  • 亚马逊 AWS Lambda
  • 谷歌 Google Cloud Functions
  • 微软 Microsoft Azure
  • 阿里云函数计算
  • 腾讯云 云函数 SCF(Serverless Cloud Function)
  • 华为云 FunctionGraph

# 1.9 云函数和 Serverless 的区别

这是刚上手时最容易卡住的一个点。我一开始也是这么想的,以为云函数就是 Serverless 的另一个叫法。等到在控制台选「模板方式创建」,结果建出来的东西叫 Serverless 应用而不是云函数,才发现两者不是一回事。

通过前面的介绍,我们认识到了云函数和 serverless,但可能会困惑它们到底有什么区别、有什么联系,为什么在创建云函数的时候选择模板方式创建,最后创建出来的是 serverless 应用,而不是一个云函数呢。下面就来解答这个问题。

  • Serverless Framework 是 Serverless 公司推出的一个开源的 Serverless 应用开发框架
  • Serverless Framework 由 Serverless Framework Plugin 和 Serverless Framework Components 两部分组成
  • Serverless Framework Plugin 实际上是一个函数的管理工具,用它可以很轻松地部署函数、删除函数、触发函数、查看函数信息、查看函数日志、回滚函数、查看函数数据等

简单概括就是,Serverless 是云函数的集合体加上一整套编排能力。用了 Serverless Framework 之后,我们创建的云函数不需要手动去建触发器、配网关,这些都由组件帮你一次性拉起来。

打个不太严谨的比方,云函数相当于原生 DOM API,Serverless Framework 相当于 jQuery。前者能用,但每个细节都要你自己写;后者把常见的编排组合封装好了。

官方地址

fe
  • 一、Serverless 架构介绍与安装
    • 1.1 传统的开发模式与 Serverless 开发模式对比
    • 1.2 Serverless 和 ServerFul 架构的区别
      • 传统的 ServerFul 架构模式
      • Serverless 架构模式
    • 1.3 使用 Serverless 的优势
    • 1.4 Serverless 的组成
    • 1.5 Serverless 开发流程
    • 1.6 为什么要学 Serverless
    • 1.7 Serverless 的能力
      • 计算能力
      • 系统运维能力
      • 业务运维能力
    • 1.8 主流 Serverless 厂商
    • 1.9 云函数和 Serverless 的区别
    • 1.10 创建 Serverless 应用的两种方式
  • 二、脚手架安装、WebIDE 创建与 VS Code 配置
    • 2.1 脚手架安装,三分钟部署一个项目
    • 2.2 在 VS Code 中配置插件来开发 Serverless
    • 2.3 WebIDE 创建云函数实践
  • 三、用 Serverless Framework 部署后端项目实战
    • 3.1 Serverless Framework 简介及应用场景
      • Serverless Framework 应用场景
      • Serverless Framework 支持的平台
    • 3.2 Serverless Components 支持的组件列表
      • 基础组件
      • 高阶组件
    • 3.3 用 sls 部署 Egg 项目
      • 控制台创建部署,模板部署
      • 控制台创建部署,自定义部署(推荐)
      • HTTP 组件方式部署(推荐)
      • 用 Layer 来减小项目文件大小
      • 使用 Serverless Framework 的高阶 Egg 组件部署(不推荐)
    • 3.4 用 sls 部署 Nest.js 项目
      • 模板部署,部署 Nest.js 示例代码
      • 自定义模板部署 Nest(推荐)
      • 使用 HTTP 组件(推荐)
      • 用 Layer 来减小项目文件大小
      • 使用 Serverless Framework 的高阶 nestjs 组件部署(不推荐)
    • 3.5 用 sls 部署 Koa 项目
      • 控制台部署
      • 自定义模板部署
      • 使用 HTTP 组件部署
  • 四、部署静态网站
    • 4.1 用 sls 部署 Vue 项目
    • 4.2 用 sls 部署 React 项目
    • 4.3 用 sls 部署 VuePress 项目
  • 五、综合实战
    • 5.1 在 Serverless 中操作 MySQL、MongoDB 与配置 VPC 私有网络
      • 云函数接入数据库
      • 在 Node Serverless 中操作 MySQL
      • 在 Node Serverless 中操作 MongoDB
    • 5.2 对象存储 COS 介绍,用 Node 操作 COS 并实现图片上传
      • 对象云存储 COS 介绍
      • 用 Node 操作 COS
      • Express 在 Serverless 中实现图片上传到 COS
    • 5.3 配置自定义域名与 HTTPS 访问
      • Serverless 中配置域名访问
      • Serverless 中配置 HTTPS 访问
      • COS 中配置域名
  • 六、常见问题答疑
    • scf_bootstrap 启动文件与 sls.js 启动文件的区别
    • serverless.yml 到底该用哪种写法,是更推荐 HTTP 组件吗
    • 配额超限了怎么办
  • 七、官方文档速查
  • 总结
  • 参考

← 微信云托管入门与实践docker-compose/微信云托管/serverless之部署Nestjs项目 →