这个系列文章会介绍Serverless概念,用实际的例子演示如何使用Serverless开发web应用,并介绍一个实际项目的实践:这个网站从开始使用Serverless搭建,到后面遇到问题和优化,以及最后为什么放弃Serverless方案。
一、serverless是什么
serverless和涉及到的一些概念业界没有标准定义,这里用简单语言介绍,可能会忽略一些细节,但力求让读者有个直观的认识。
一句话介绍serverless:serverless是一种系统架构,使用serverless开发引用可以让开发者专注于业务,不需要关心服务治理。serverless并非指没有服务器,而是指不需要服务治理。
最直观能够感受到的好处是:
- 不用考虑高并发
- 动态伸缩,按量付费,节省成本(节省成本并不是绝对的,也要看业务形态)
用户不需要考虑的,就是serverless服务商要考虑和支持的,“复杂留给自己,简单留给用户”。
举个例子,有这么一个业务需求:当用户上传一张图片,服务器监听到图片上传,给这个图片打水印,再把加了水印的图片传到oss上,保存了原图和加了水印的图。
如果用传统的开发方式,需要
- 购买服务器,选择合适的型号,搭建环境。
- 写代码监听图片上传的事件,拉取图片,打水印,再上传到oss,然后把代码上传到服务器。
- 还要考虑动态伸缩以应对用户并发请求高峰。
- 在一天中的晚上时段基本没有请求,要考虑在什么时候缩减服务器,缩减多少,什么时候扩充,扩充多少。
使用serverless,你只需要
- 选择合适的运行时
- 然后上传你写好的代码就行了。
serverless会根据并发请求量实时调整实例(可以理解成提供服务的机器)数量,请求多的时候启动多个实例提供服务,没有请求时候则关闭所有实例。serverless服务按量付费,没有用户上传图片时候不会产生服务器租金。
这个例子介绍了serverless的一种云计算的形式:FaaS。
目前普遍认为serverless = FaaS + BaaS。
要搞清楚FaaS和BaaS,先要了解服务治理包含哪些内容。
从是否有状态这个角度,后端有两类服务:stateless无状态、stateful(有状态)。
像我们刚刚提到的图片加水印的服务,就没有状态,它只是读图片、加水印,然后再上传图片,操作都是计算。
还有像一般的API server,如果不在内存中保存多个请求公用的数据,也算是stateless。
而数据库就是典型的stateful的服务。
stateless和stateful这两种类型的服务,需要的服务治理工作并不相同。
对于stateless,服务治理工作有服务器采购规模、单台服务器的规格、网络配置和操作系统、环境部署、负载均衡、宕机和故障处理、监控报警、请求洪峰、动态伸缩等。
对于stateless,服务治理包括软硬件预置、配置、故障、集群扩展、安全等问题。
serverless做了这些通用的服务治理工作,对外暴露接口给用户,就形成了serverless产品。其中stateless现在基本都以函数形式提供服务,即FaaS。FaaS典型应用,如视频、图片转码,不存储数据,只计算,另外API Server也可以使用FaaS,本身处理计算,需要连接一个数据库来进行数据的读写。
以阿里云FC为例:
通常应用归根结底就是对数据的增删改查,以及在此基础之上建立的、在服务器实现的业务逻辑。而stateful的服务,以HTTP API暴露数据增删改查的接口,使用这种服务,业务逻辑迁移到客户端,就不需要服务器了,这就是另一种意义上的serverless,这种有状态的后端服务称为BaaS。(当然由于是通过HTTP API提供的数据存储服务,那么也可以API Server调用)。
以firebase为例:
广义的BaaS不限于数据存储,还有如推送服务,身份验证、数据存储,文件存储等。
下面举几个有名的serverless产品
FaaS:
- 亚马逊AWS Lambda(2014,是最早的FaaS产品)
- 阿里FC
- 腾讯云SCF(Serverless Cloud Function)
- 华为FunctionStage
BaaS:
- 谷歌firebase
- leancloud
- bmob
二、serverless和IaaS、PaaS、SaaS
serverless其实是互联网基础设施发展一个新的形式,是云计算遵循“复杂留给自己,简单留给用户”原则的进一步增强。
我们可以通过云计算的各个层面的服务看出,serverless的出现的必然性。
如果不使用云计算,自己搭建数据中心本地部署,那么需要管理硬件环境、然后在此基础上搭建操作系统和软件环境,然后让数据和引用运行在软件环境上。专业性很强,CDN巨头网宿就是提供搭建IDC出身。
IaaS(Infrastructure as a Service):这时云计算的一种形式,提供虚拟化的硬件基础设施,如cpu、gpu、内存、磁盘、网络。用户不需要关心硬件环境的维护,只需在IaaS基础上管理软件运行环境并搭建应用。
PaaS(Platform as a Service):提供现成的软件环境,如操作系统、数据库、中间件,运行库等,用户可以直接使用,进一步降低了运维成本。
SaaS(Software as a Service):特定领域的软件,用户不需要开发,直接使用。
网上有一个很有意思的比喻:吃披萨,可以形象地说明这几个云计算服务的概念
1、自己去必胜客或 自己去必胜客或 Papa John 店里买披萨 店里买披萨 。
2、在家里用美团或者饿了么 在家里用美团或者饿了么 app 叫一个外卖 叫一个外卖 。
3、买成品回家自己烤 。
4、所有的事情都自己做,连面团都自己和。
其实在很多领域,都是一步一步对底层细节进行封装,简化接口,最终目标都是让用户“专注于业务”,就像JQuery封装了原生的DOM操作,让用户更方便地操作DOM,React则进一步封装,让用户只要通过声明式渲染就可以开发应用,而不需要手动操作DOM;TCP/IP协议提供了网络传输数据的能力,HTTP协议则在此基础上实现了超文本内容的传输。
一个普遍规律是底层越来越透明,但灵活程度会相应降低,因此还是需要根据业务情况进行选型。
是有层级递进的关系,每一层都在上一层的基础上做了一些通用性的工作,减少了使用者的一些工作。它们的目标都是让用户“只专注于业务”即可。
说了半天云计算的各种形式的服务,我们看到serverless和PaaS描述有点像,都是对用户提供了简单接口,降低运维成本。其实serverless是一种系统架构,而PaaS是云计算的一种服务形式,两者不太好放到一起比较。
不过我们可以比较FaaS、BaaS和PaaS,通过上面介绍可以知道,FaaS和BaaS在特定的场景提供了比PaaS更简单的接口,并且更少的运维成本,而PaaS概念更广泛,一些中间件没办法用FaaS或者BaaS代替。
三、总结
- serverless是一种服务系统架构,用户无需关心服务治理,专注业务。
- serverless = FaaS(stateless) + BaaS(stateful)。
- serverless体现了“复杂留给自己,简单留给用户”,在特定场景让用户开发应用变得更容易,但无法完全代替PaaS。