![Serverless工程实践:从入门到进阶](https://wfqqreader-1252317822.image.myqcloud.com/cover/285/39652285/b_39652285.jpg)
1.1 Serverless的定义
1.1.1 广义定义探索
云计算的十余年发展让整个互联网行业发生了翻天覆地的变化,而Serverless作为云计算的产物,或者说是云计算在某个时代的表现,被很多人认为是真正意义上的云计算,伯克利团队甚至断言Serverless将会引领云计算的下一个十年。那么Serverless到底是什么呢?是否有明确的定义或者规范呢?
关于“Serverless是什么”这个问题,其实是可以通过不同角度来分析的。Martin Fowler在“Serverless Architectures”一文中从Serverless组成角度给出了Serverless的定义,他认为Serverless实际上是BaaS与FaaS的组合,并针对BaaS和FaaS进行了详细的描述。
- Serverless最早用于描述那些大部分或者完全依赖于第三方(云端)应用或服务来管理服务器端逻辑和状态的应用,这些应用通常是富客户端应用(单页应用或者移动端App),建立在云服务生态之上,包括数据库(Parse、Firebase)、账号系统(Auth0、AWS Cognito)等。这些服务最早被称为Baas(Backend as a Service,后端即服务)。
- Serverless还可以指这种情况:应用的一部分服务端逻辑依然由开发者完成,但是和传统架构不同,它运行在一个无状态的计算容器中,由事件驱动,生命周期很短(甚至只有一次调用),完全由第三方管理。这种情况被称为FaaS(Functions as a service,函数即服务)。AWS Lambda是目前的热门FaaS实现之一。
通过Martin Fowler的描述可以总结出FaaS、BaaS以及Serverless之间的关系,如图1-1所示。
![031-01](https://epubservercos.yuewen.com/AF5B67/20697932108589606/epubprivate/OEBPS/Images/031-01.jpg?sign=1739144812-O1hSAaT3TgdmdF4avO36FQ26Zp77r8Qm-0-07610f717a97d252ad8a75749887aad8)
图1-1 Serverless架构的组成
云原生计算基金会(下文简称CNCF)则从Serverless的特征特性角度给出了Serverless的定义:Serverless是指构建和运行不需要服务器管理的应用程序。它描述了一种更细粒度的部署模型,即将应用程序打包为一个或多个功能,上传到平台,然后执行、扩展和计费,以响应当时确切的需求。
同时CNCF也强调了,Serverless所谓的“无服务器”并不是“没有服务器”,而是说Serverless的用户不再需要在服务器配置、维护、更新、扩展和容量规划上花费时间和资源,可以将更多的精力放到业务逻辑本身,至于服务器,则“把更专业的事情交给更专业的人”去做,即由云厂商来提供统一的运维。
在信通院云原生产业联盟所发布的《云原生发展白皮书(2020年)》中对Serverless也有相关的描述:Serverless是一种架构理念,其核心思想是将提供服务资源的基础设施抽象成各种服务,以API接口的方式供用户按需调用,真正做到按需伸缩、按使用收费。这种架构消除了对传统的海量持续在线服务器组件的需求,降低了开发和运维的复杂性,降低了运营成本并缩短了业务系统的交付周期,使得用户能够专注在价值密度更高的业务逻辑的开发上。
如图1-2所示,从Serverless的结构上来看,Serverless = FaaS + BaaS是一个被普遍认可的概念;从Serverless的特性上来看,Serverless运行在无状态的计算容器中,由事件触发,并且拥有弹性伸缩以及按量付费等能力,让使用者不用花费更多的精力在服务器上,而是更加关注业务本身。
![031-02](https://epubservercos.yuewen.com/AF5B67/20697932108589606/epubprivate/OEBPS/Images/031-02.jpg?sign=1739144812-cfW6ZKtXoUUuY89qjPOTWYNjHYT7WDql-0-e9e295b085a8897b020d104e3187057c)
图1-2 不同角度上的Serverless的定义
1.1.2 Serverless工作流程
在实际生产中,Serverless架构通常都是FaaS与BaaS的结合,并且具备弹性伸缩和按量付费的特性。如图1-3所示,当开发者想要开发一个项目的时候,通常只需要根据FaaS提供商所提供的Runtime,选择一个熟悉的编程语言,然后进行项目开发、测试(图中步骤1);完成之后将代码上传到FaaS平台(图中步骤2);上传完成之后,只需要通过API/SDK(图中步骤3)或者一些云端的事件源(图中步骤3)触发上传到FaaS平台的函数,FaaS平台就会根据触发的并发度等弹性执行对应的函数(图中步骤4),最后用户可以根据实际资源使用量进行按量付费(图中步骤5)。
![032-01](https://epubservercos.yuewen.com/AF5B67/20697932108589606/epubprivate/OEBPS/Images/032-01.jpg?sign=1739144812-RSzHUZtUmSQ50TPk5as3b9ao9xKm4Gcl-0-618daef782c77cf0180e15b24755696d)
图1-3 Serverless工作流程
我们来看一个Web应用的例子。如图1-4所示,通常情况下一些Web应用都是传统的三层C/S架构,例如一个常见的电子商务应用,假设它的服务端用Java,客户端用HTML/JavaScript。
![032-02](https://epubservercos.yuewen.com/AF5B67/20697932108589606/epubprivate/OEBPS/Images/032-02.jpg?sign=1739144812-UzrdGMmZv1lLxEG26m9RAZKdOfzPaGQ1-0-4a3cd1dd2393a8d8e151c202136dc725)
图1-4 传统Web应用三层C/S架构
在这个架构下,服务端仅为云服务器,其承载了大量业务功能和业务逻辑,例如,系统中的大部分逻辑(身份验证、页面导航、搜索、交易等)都在服务端实现。把它改造成Serverless应用形态,简图如图1-5所示。
![033-01](https://epubservercos.yuewen.com/AF5B67/20697932108589606/epubprivate/OEBPS/Images/033-01.jpg?sign=1739144812-mtKtW6CmoZNWmvFwnFBAPXtRSdiPIltz-0-521fbc616ae6a7767a61b7f388ce1f9e)
图1-5 Serverless应用形态简图
在Serverless应用形态下,移除了最初应用中的身份验证逻辑,换用一个第三方的BaaS服务(图中步骤1);允许客户端直接访问一部分数据库内容,这部分数据完全由第三方托管,会用一些安全配置来管理客户端访问相应数据的权限(图中步骤2);前面两点已经隐含了非常重要的第三点:先前服务端的部分逻辑已经转移到了客户端,如保持用户Session、理解应用的UX结构、获取数据并渲染出用户界面等。客户端实际上已经在逐步演变为单页应用(图中步骤3);还有一些任务需要保留在服务器上,比如繁重的计算任务或者需要访问大量数据的操作。这里以“搜索”为例,搜索功能可以从持续运行的服务端中拆分出来,以FaaS的方式实现,从API网关(后文做详细解释)接收请求并返回响应。这个服务端函数可以和客户端一样,从同一个数据库读取产品数据。原始的服务端是用Java写的,而AWS Lambda(假定用的这家FaaS平台)也支持Java,那么原先的搜索代码略作修改就能实现这个搜索函数(图中步骤4);还可以把“购买”功能改写为另一个FaaS函数,出于安全考虑,它需要在服务端而非客户端实现。它同样经由API网关暴露给外部使用(图中步骤5)。
在整个项目中,Serverless用户实际关心的也就只剩下函数中的业务逻辑,至于身份验证逻辑、API网关以及数据库等原先在服务端的一些产品/服务统统交给云厂商提供。在整个项目开发、上线以及维护的过程中,用户并不需要关注服务器层面的维护,也无须为流量的波峰波谷进行运维资源的投入,这一切的安全性、弹性能力以及运维工作都交给云厂商来统一处理/调度,用户所需要关注的就是自己的业务代码是否符合自己的业务要求,同时在Serverless架构下,用户也无需为资源闲置进行额外的支出,Serverless架构的按量付费模型以及弹性伸缩能力、服务端低运维/免运维能力,可以让Serverless用户的资源成本、人力成本、整体研发效能得到大幅度提升,让项目的性能、安全性、稳定性得到极大的保障。