前端Serverless:面向全栈的无服务器架构实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 CNCF Serverless白皮书

在介绍 Serverless 白皮书之前,先介绍一下 CNCF(Cloud Native Computing Foundation,云原生计算基金会)。

在 2014 年,Google 开源了一个在公司内部用于容器编排的项目——代号 Seven。并且在随后的 2015 年,Google 采用 Go 语言对该项目进行了重构,同时给它起了一个更正式的名称,这就是现在大名鼎鼎的 Kubernetes。

随着Kubernetes 1.0 版的发布,谷歌与 Linux 基金会合作成立了 CNCF 这一技术虚拟小组,并将 Kubernetes 作为该小组的第一个技术产品进行支持。

最初云原生(Cloud Native)技术主要包含微服务、容器及容器编排三大能力;但随着云计算的发展,CNCF 于 2018 年重新定义了云原生技术。目前其官方描述如下:

云原生技术有利于各组织在公有云、私有云和混合云等新型动态环境中,构建和运行可弹性扩展的应用。云原生的代表技术包括容器、服务网格、微服务、不可变基础设施和声明式API。

这些技术能够构建容错性好、易于管理和便于观察的松耦合系统。结合可靠的自动化手段,云原生技术使得工程师能够轻松地对系统做出频繁和可预测的重大变更。

云原生计算基金会(CNCF)致力于培育和维护一个厂商中立的开源生态系统,以推广云原生技术。我们通过将最前沿的模式民主化,让这些创新为大众所用。

随后,云原生技术以前所未有的速度席卷了整个云计算产业。目前全球主要的云计算供应商,包括 Amazon、Google、Microsoft、阿里巴巴、华为等在内的数百家公司已加入了该组织。该组织的主要职责是推广标准化的云原生技术。

CNCF 作为一个对云计算供应商中立的基金会,一直致力于相关开源技术的应用和推广,借此让研发人员能更便捷、高效地构建出优秀的产品。本书的重点虽不在于探讨云原生(Cloud Native)技术,但作为研发人员,我们应当关注云计算的趋势,理解云原生技术的相关设计理念及开源项目。CNCF 目前已包含 1000 余个开源项目,除 Kubernetes 外,里面不乏 Prometheus、gRPC 这样的明星项目。

而本书的主题 Serverless,则是云原生下的一个重要方向。因此,CNCF 在 2018 年发布了 Serverless 白皮书,探讨了关于 Serverless 的理念、定义及其价值。它做出了如下描述:

Serverless指的是无论在应用的构建环节还是运行环节,都无须对服务器进行维护和管理。

从 CNCF 对 Serverless 的描述可以看出,它与我们上面讲到的理念基本一致,即Serverless 指的是构建和运行应用程序,无须通过人工的方式来管理服务器。但如果仅仅是这样的,那么这和我们上面提到的 Serverless 并没有太大区别,它仍然只是一种理念。CNCF 在白皮书里紧接着对 Serverless 所应该提供的能力,进行了更进一步的阐述。

Serverless 计算平台应该包含以下一种或者两种能力:

(1)函数即服务(FaaS,Functions as a Service),提供基于事件驱动的计算服务。开发者以函数片段的方式来管理应用代码,这些函数通过事件或 HTTP请求来触发。和传统应用相比,其以更细粒度的函数方式来进行部署,这样计算资源就可以实现更精细的调度和管理,且这些操作都将自动化完成,无须开发者参与。

(2)后端即服务(BaaS,Backend as a Service),指的是可以用来替换应用程序中的一些核心能力,且直接通过 API 的方式提供的第三方服务。由于这些服务自身实现了自动扩容/缩容的能力,因此开发者无须了解与服务器相关的信息。

在这里,CNCF 对 Serverless 应该具备的能力进行了清晰的定义。作为 Serverless 平台,至少需要提供 FaaS 和 BaaS 这两种能力中的一种。

关于什么是FaaS和BaaS,以及作为前端人员如何利用它们提高生产力,则是本书接下来的两个部分将要介绍的重点内容。本章先介绍一些基础知识,以便让大家对此有一个初步的认识。

FaaS(Functions as a Service),译为“函数即服务”。它基于事件驱动的理念,提供了让开发者以函数为基本粒度的代码,且具有像HTTP或其他事件一样被触发并被执行的能力。开发者只需编写业务代码,无须关注服务器资源。这样一来,它完全改变了云计算资源的交付和计费模式,从以往租一台虚拟机来实现通用计算的包月付费,变为了按调度消耗计费。这降低了运维成本,也大幅度降低了服务器的租赁费用。不仅如此,应用的发布效率也得到了提升。以往我们购买虚拟机后,需要选择操作系统,安装对应的软件,还需要考虑集群的负载容量和负载均衡等问题;而在 FaaS 下面,它们都将由云计算供应商的调度系统自动完成。

BaaS(Backend as a Service),译为“后端即服务”,指的是一些通过 API 的方式提供的第三方服务,这些第三方服务通常是我们使用的各个中间件服务,比如数据库、缓存、消息队列等,并且这些第三方服务的可用性由它们的提供者自行管理,使用它们的开发者无须关心这些服务背后的部署情况。也就是说,开发者无须了解这些服务在哪里、如何分布,也无须事先预估自己的使用量,这些都将由该服务的提供者动态调配和调度。

通过上述 FaaS 和 BaaS 的定义,我们能将前面提到的各种 Serverless 服务进行一个大致分类:

◎ FaaS(Functions as a Service,函数即服务):

—Amazon AWS Lambda

—Google Cloud Functions

—Microsoft Azure Functions

—IBM OpenWhisk

—阿里云 Function Compute

◎ BaaS(Backend as a Service,后端即服务):

—GitHub Pages

—CDN(Content Delivery Network,内容分发网络)

—OSS(Object Storage Service,对象存储服务)

—RDS(Relational Database Service,关系型数据库服务)

—MQS(Message Queue Service,消息队列服务)

需要指出的是,这里面并没有包含 GAE(Google App Engine)。这是因为 GAE 其实是一种“Applicationless”,从本质上来说它是一个 PaaS(Platform as a Service)。关于什么是 PaaS,我们将在之后的章节中详细介绍,这里只需要知道它与上面定义的 FaaS 不是同一种类型即可。在 FaaS 中的重要理念是按调用付费,而 GAE 仍然是按实例包月计费的模式。在 GAE 中,开发者对服务的运行实例是有感知的,开发者知道当它的应用发布、部署之后,会有一个服务实例启动,等待处理 HTTP 请求。这样一来,就需要这个应用的进程长期地占用服务器资源。而 FaaS 通过毫秒级的自动扩容/缩容能力,使得在没有请求时就没有对应的服务进程,从而实现不消耗服务器资源的目的。因此,GAE 并不是 Serverless服务。