一个只有几十个日活的小后台,为了它长期挂着一台 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 改变的是整个软件交付的节奏,不只是省了几台机器。

# 1.2 Serverless 和 ServerFul 架构的区别
# 传统的 ServerFul 架构模式
ServerFul 架构就是 n 台 Server 通过网络通信的方式协作在一起。也可以说,ServerFul 架构是基于 Server 和网络通信(分布式计算)的软件实现架构,这里的 Server 可以是虚拟机、物理机,以及基于硬件实现的云服务器。
下面这张图画的就是这种结构,注意每个节点都需要你自己扩容和容灾。

看图的时候留意一点,节点之间的连线越多,你要维护的运维复杂度就越高。
# Serverless 架构模式
Serverless 的核心特点就是实现自动弹性伸缩和按量付费。同样一张架构图,画出来会干净很多。

这张图里你能看到的只剩函数和触发器,机器那一层被完全抹掉了。
# 1.3 使用 Serverless 的优势
优势主要落在三件事上,资源分配、计费方式和弹性伸缩。
- 资源分配:在
Serverless架构中,你不用关心应用运行的资源(比如服务配置、磁盘大小),只提供一份代码就行。 - 计费方式:在
Serverless架构中,计费方式按实际使用量计费(比如函数调用次数、运行时长),不按传统的执行代码所需的资源计费(比如固定CPU)。计费精确到了毫秒级,而不是传统的小时级别。个别云厂商推出了每个月的免费额度,比如腾讯云当时提供了每个月 40 万 GBs 的资源使用额度和 100 万次调用次数的免费额度。中小企业的网站访问量不是特别大的话完全可以免费使用。
下面这张是当时控制台里的计费说明截图,可以对照着看单价构成。

这里补一句时效性的话,这篇写于 2022 年,文中所有额度和价格都是当时的行情。这几年各家的免费额度、计费单位和控制台界面都调整过好几轮,具体数字请以你打开控制台时看到的官方计费页为准,我不敢拿旧数字给你打包票。
- 弹性伸缩:
Serverless架构的弹性伸缩更自动化、更精确,可以快速根据业务并发扩容更多的实例,甚至允许缩容到零实例状态来实现零费用,对用户来说是完全无感知的。而传统架构对服务器(虚拟机)进行扩容,虚拟机的启动速度也比较慢,需要几分钟甚至更久。
缩容到零这一条是最容易被低估的。一个内部工具站半夜没人访问,实例数就是 0,账单也是 0。
# 1.4 Serverless 的组成
这个词在不同语境下指的东西不一样,分开看会清楚很多。
- 广义的 Serverless 更多是指一种技术理念,Serverless 是构建和运行软件时不需要关心服务器的一种架构思想。刚开始学 Serverless,你可以把它理解为虚拟主机的升级版本。
- 狭义的 Serverless 是指现阶段主流的技术实现,由
FaaS和BaaS两部分组成。
FaaS 就是云函数那一层,BaaS 是对象存储、数据库这些托管后端服务。下面这张图把两者的边界画得比较清楚。

记住这个划分,第五章讲 COS 和数据库的时候还会用到它。
# 1.5 Serverless 开发流程
开发流程和传统模式最大的差别在于,没有「上线部署」这个独立环节,sls deploy 就是全部。

图里从写代码到线上可访问只有几步,后面第三章会把每一步落到具体命令上。
# 1.6 为什么要学 Serverless
先看看当时的招聘信息,能感受到岗位需求已经开始把它写进 JD 了。

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



同样提醒一下,这几张趋势图是 2022 年的截面,现在的数字肯定不一样了,看趋势就好,别把绝对值当结论。
下面是当时已经在用 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。前者能用,但每个细节都要你自己写;后者把常见的编排组合封装好了。
官方地址