什么是 serverless
Serverless:无服务器技术,是继虚拟机、容器之后的云计算第三代通用计算技术 BFF(Backend For Frontend):在微服务和前端中间的 BFF 层,可对接口进行聚合、裁剪后再输出给前端。作为当前 Node.js 在服务端较为广泛的应用
Serverless 是一种构建和管理基于微服务架构的完整流程,不需服务器管理应用部署。对其可以有广义和狭义两种理解方式:
广义的 Serverless
广义的 Serverless是指:构建和运行软件时不需要关心服务器的一种架构思想。 虽然 Serverless 翻译过来是 “无服务器”,但这并不代表着应用运行不需要服务器,而是开发者不需要关心服务器,而基于 Serverless 思想实现的软件架构就是 Serverless 架构。
在原来虚拟机、容器时代的架构下,目前行业可能更多处在容器 Docker+Kubernetes, 利用 IaaS、PaaS 和 SaaS 来快速搭建部署应用,而在这种架构下,如果要保证网站持续稳定运行,就需要解决很多问题:
- 备份容灾: 要实现服务器、数据库的备份容灾机制,使一台服务器出故障不影响整个系统
- 弹性伸缩: 系统能根据业务流量大小等指标,响应式地调整服务规模,实现自动弹性伸缩
- 日志监控: 需要记录详细的日志,方便排查问题和观察系统运行情况,并且实现实时的系统监控和业务监控
解决这些复杂的问题需要投入大量的人力、物力,小公司几乎无法自己去解决。而 Serverless 就是为了解决这些问题诞生的, 它可以把底层的硬件、存储等基础资源隐藏起来,由平台统一调度、运维。并将常用的基础技术抽象、封装(比如数据库、消息队列等)以服务的方式提供给开发者。开发者只专注于开发业务逻辑,所有业务无关的基础设施,都交给 Serverless 平台
那么说到底,serverless 它的主要特点到底是什么呢?和 PaaS 这些区别在哪?
- 资源分配: 在 Serverless 架构中,你不用关心应用运行的资源(比如服务配置、磁盘大小)只提供一份代码就行
- 计费方式: 在 Serverless 架构中,计费方式按实际使用量计费(比如函数调用次数、运行时长),不按传统的执行代码所需的资源计费(比如固定 CPU)。计费粒度也精确到了毫秒级,而不是传统的小时级别
- 弹性伸缩: Serverless 架构的弹性伸缩更自动化、更精确,可以快速根据业务并发扩容更多的实例,甚至允许缩容到零实例状态来实现零费用,对用户来说是完全无感知的。而传统架构对服务器(虚拟机)进行扩容,虚拟机的启动速度也比较慢,需要几分钟甚至更久
狭义的 Serverless
广义的 Serverless 更多是指一种技术理念,狭义的 Serverless 则是现阶段主流的技术实现。之所以说是狭义的,是因为 Serverless 架构正在持续发展中,未来可能有更好的技术方案。目前狭义的 Serverless 是 FaaS 和 BaaS 的组合,整体的架构图大致如下:
其中最底层就是实现复杂业务的后端微服务(Backend)。然后 FaaS 层通过一系列函数实现业务逻辑,并为前端直接提供服务。对于前端开发者来说,前端可以通过编写函数的方式来实现服务端的逻辑。
同时不管是在后端、FaaS 还是前端,我们都可以去调用云计算平台提供的 BaaS 服务,大大降低开发难度、减少开发成本。小程序云开发,就是直接在前端调用 BaaS 服务的例子。具体 FaaS 和 BaaS 介绍如下:
FaaS: Function as a Service,函数即服务平台。触发器与平台自己的后端服务相关,使用相应的 SDK 或 API 来连接和调用 BaaS,实现业务逻辑层
- BFF 实现:前端向 BFF 发起的请求是 FaaS 的一个 HTTP 触发器,触发函数的执行,实现针对该请求的业务逻辑,然后将处理结果返回给前端
- SSR 实现:每个请求的 path 都对应服务端的每个路由,将路由都拆分为一个个函数,再在 FaaS 上部署。请求 path 对应的就是每个单独的函数
BaaS: Backend as a Service,后端即服务平台。后端、FaaS、前端都可通过对应 SDK/API 调用 BaaS 服务。如小程序云开发
- CDB:云数据库
- COS:云对象存储
- CMQ:云消息队列
- API:API 接口
- Credis:云缓存
- Log、Monito & Alert:日志、监控报警