理清 Serverless 要解决的问题其实很简单,我们可以从字面上把它拆开来看。

Server 这里指服务端,它是 Serverless 解决问题的边界;而 less 我们可以理解为较少关心,它是 Serverless 解决问题的目的。组合在一起就是“较少关心服务端”。

我们先看 Server,这里用 Web 应用经典的 MVC 架构来举例。

现代研发体系主要分为前端和后端,前端负责客户终端的体验,也就是 View 层;后端负责商业的业务逻辑和数据处理,也就是 Control 层和 Model 层。如果你有过一些开发经验,应该会了解自己的代码在本地开发和调试时的数据流。

浅谈 Serverless到底是什么_serverless

通常我们会在自己电脑上启动一个端口号,例如 127.0.0.1:3001。浏览器访问这个地址,就可以调用和调试自己的代码,但如果我们要将这个 Web 应用部署到互联网上,提供给互联网用户访问,就需要服务端的运维知识了。

浅谈 Serverless到底是什么_serverless_02

通常我部署运维一个应用时,由于要考虑容灾和容错,我都会保障异地多活,因此我会部署多个 Web 应用实例。每个 Web 应用实例跟我们在本地开发时是一样的,只是 IP 改为了私有网络 IP。

随着云服务商的兴起,现在已经很少有互联网企业还在自己维护物理机了。在云服务的运维体系中,各个环节都已经有了对应的成熟的云服务产品或解决方案。

为了使多个 Web 应用实例在容灾和容错的场景下稳定地切换流量,我就需要负载均衡服务和反向代理服务。负载均衡服务,正如其名是负责将流量均衡地分配到各个应用机器上;反向代理,常见的就是 Nginx,它的任务是从请求中解析出域名信息,并将请求转发到上游 upstream 的监听地址。

服务端的边界,就是上图中的整个蓝色部分,它是负责应用或代码的线上运维。Serverless 解决问题的边界,就是服务端的边界,即服务端运维。

Serverless 这个词包含的信息量太大,而且适用性很广,但总结来说 Serverless 的含义有这样两种。

第一种:狭义 Serverless(最常见)= Serverless computing 架构 = FaaS 架构 = Trigger(事件驱动)+ FaaS(函数即服务)+ BaaS(后端即服务,持久化或第三方服务)= FaaS + BaaS

第二种:广义 Serverless = 服务端免运维 = 具备 Serverless 特性的云服务

浅谈 Serverless到底是什么_serverless_03

先说 FaaS,函数即服务,它还有个名字叫作 Serverless Computing,它可以让我们随时随地创建、使用、销毁一个函数。

可以想一下通常函数的使用过程:它需要先从代码加载到内存,也就是实例化,然后被其它函数调用时执行。在 FaaS 中也是一样的,函数需要实例化,然后被触发器 Trigger 或者被其他的函数调用。二者最大的区别就是在 Runtime,也就是函数的上下文,函数执行时的语境。

FaaS 的 Runtime 是预先设置好的,Runtime 里面加载的函数和资源都是云服务商提供的,我们可以使用却无法控制。你可以理解为 FaaS 的 Runtime 是临时的,函数调用完后,这个临时 Runtime 和函数一起销毁。

FaaS 的函数调用完后,云服务商会销毁实例,回收资源,所以 FaaS 推荐无状态的函数。如果你是一位前端工程师的话,可能很好理解,就是函数不可改变 Immutable。简单解释一下,就是说一个函数只要参数固定,返回的结果也必须是固定的。

 MVC 架构的 Web 应用举例,View 层是客户端展现的内容,通常并不需要函数算力;Control 层,就是函数的典型使用场景。MVC 架构里面,一个 HTTP 的数据请求,就会对应一个 Control 函数,我们完全可以用 FaaS 函数来代替 Control 函数。在 HTTP 的数据请求量大的时候,FaaS 函数会自动扩容多实例同时运行;在 HTTP 的数据请求量小时,又会自动缩容;当没有 HTTP 数据请求时,还会缩容到 0 实例,节省开支。

浅谈 Serverless到底是什么_serverless_04

BaaS 其实是一个集合,是指具备高可用性和弹性,而且免运维的后端服务。说简单点,就是专门支撑 FaaS 的服务。FaaS 就像高铁的车头,如果我们的后端服务还是老旧的绿皮火车车厢,那肯定是要散架的,而 BaaS 就是专门为 FaaS 准备的高铁车厢。

MVC 架构中的 Model 层,就需要我们用 BaaS 来解决。Model 层我们以 MySQL 为例,后端服务最好是将 FaaS 操作的数据库的命令,封装成 HTTP 的 OpenAPI,提供给 FaaS 调用,自己控制这个 API 的请求频率以及限流降级。这个后端服务本身则可以通过连接池、MySQL 集群等方式去优化。各大云服务商自身也在改造自己的后端服务,BaaS 这个集合也在日渐壮大。

浅谈 Serverless到底是什么_serverless_05

基于 Serverless 架构,我们完全可以把传统的 MVC 架构转换为 BaaS+View+FaaS 的组合,重构或实现。

所以我们最常见的 Serverless 都是指 Serverless Computing 架构,也就是由 Trigger、FaaS 和 BaaS 架构组成的应用。这也是狭义 Serverless 的定义。

广义 Serverless,其实就是指服务端免运维,也是未来的主要趋势。

总结来说的话就是,我们日常谈 Serverless 的时候,基本都是指狭义的 Serverless,但当我们提到某个服务 Serverless 化的时候,往往都是指广义的 Serverless。我们后面的课程中也是如此。