1、serverless

image.png

国外:AWS Lambda、Azure Functions (微软)、Google Cloud Functions
国内:腾讯云SCF、 阿里云函数计算FC

顺丰云还未布局serverless

广义上的serverless

广义上来说,Serverless 是一种后端架构理念,或者说是一种思想、概念,直接翻译过来叫做 “无服务”,但是不要被字面意思误导,这并不代表着应用运行不需要服务器
serverless简单来说就是研发团队只要关心业务代码实现就行了,开发者用代码去支撑业务逻辑,开发者不用关心服务器,将服务器相关的工作交给云平台来做。

serverless的less是指关于服务器相关的东西我们可以更少的关注,交给云平台处理,而不是“无服务器”。Server(服务器)是不可能真正消失的。Serverless 所希望的,是开发者用代码去支撑业务逻辑,而对于资源的管理交给工具和云。

serverful传统开发模式
serverful: 关于服务器的一切,我们都需要人工干预
在 Serverful 的架构下,我们需要关心的问题非常多,比如:根据业务流量大小等指标,响应式地调整服务规模,实现自动弹性伸缩。再比如异地容灾、负载均衡、日志监控、文件存储等等,解决这些复杂的问题需要投入大量的人力、物力, 而在 Serverless 架构下,开发者只专注于开发业务逻辑,所有的这些与业务无关的基础设施,全部交给云平台负责,由云平台统一调度、运维。

狭义上的serverless

在这样的理念指导下,各家云平台厂商,都有不同实现方案,每家云平台提供的 Serverless 服务,都或多或少的存在差异,但是,按照 CNCF (云原生计算基金会) 对Serverless 计算的定义,Serverless 架构应该是采用 FaaS(函数即服务)和 BaaS(后端即服务)服务来解决问题的一种设计
总纲 - 图2

2、FaaS和BaaS

BaaS 是 Backend as a Service 的缩写, “后端即服务”
FaaS 是 Function as a Service 的缩写, “函数即服务”

之前提到Serverless 把后端架构的工作全部包揽下来,硬件的维护、集群的管理、运行环境的搭建、全部由云平台完成,除此之外,像缓存、数据库、文件存储、消息中间件等,也全部由云平台帮我们做好,封装起来,以接口的形式提供服务,这就是 BaaS,所谓后端即服务。对于开发者,BaaS 就是一个黑盒,你不用知道我怎么做,更不需要关心我如何做,你需要什么过来拿就行了

但是,我需要向数据库存一条数据,用户上传的照片我需要裁剪以后存到文件存储中,这是需要我们编写业务逻辑代码完成的功能,假设我现在已经把这些逻辑代码写好,用的是 Node.js ,前面说所有的服务器及运行环境都放在了 BaaS 这个黑盒子中,我怎么让这些代码运行呢?换句话说就是,我现在写的逻辑代码,是需要 Node.js 这个运行环境的,怎么办?我们只需要将写好的代码,交个 Serverless 就行了,Serverless 中有专门运行我们的逻辑代码的地方,这个地方就是 FaaS,FaaS 是以函数的方式运行我们的代码的,本质上 FaaS 就是一个函数运行平台,大多数的 Serverless 云平台提供的 FaaS ,都支持 Node.js、Python、Java、PHP 等编程语言,你可以选择你喜欢的编程语言编写函数并运行。

对于开发者老说,使用 FaaS 几乎就是使用 Serverless 的一切了,在 FaaS 中,我们能够体会到 Serverless 全部的特性。

FaaS的特点

1、无运维
FaaS 函数运行时,开发者对底层的服务器是无感知的,FaaS 产品会负责服务器资源的调度和运维,这些就是我们前面说的 BaaS,这也是 Serverless 最大的特点,无运维。

2、事件驱动
FaaS 中的函数也不是持续运行的,而是通过一定的条件进行触发,比如 HTTP 事件、消息事件、定时器事件等,产生事件的源头叫触发器,FaaS 平台会集成这些触发器,我们直接用就行,这是 FaaS的第二个特点,事件驱动。

3、按量收费
再者就是 Serverless 的付费方式了,与其他云产品不同的是,Serverless 的付费方式是按量付费,是按照 FaaS 函数执行次数和执行时消耗的 CPU、内存等资源进行计费的,用多少付多少,不用不付费,

4、弹性收缩
FaaS 会根据并发量自动生成多个函数实例,BaaS 会根据函数运行所需要的资源量自动调配服务器资源,理论上的资源调用量没有上限,这也就实现了不同访问量的弹性伸缩了,而且是实时的弹性伸缩。

image.png

基于 FaaS 和 BaaS 的架构,是一种计算和存储分离的架构。 计算由 FaaS 负责,存储由 BaaS 负责,计算和存储也被分开部署和收费。这使应用的存储不再是应用本身的一部分,而是演变成了独立的云服
务,降低了数据丢失的风险。而应用本身也变成了无状态的应用,更容易进行调度和扩缩容。
基于 FaaS 和 BaaS ,应用就实现了自动弹性伸缩、按量付费、不用关心服务器,这正是 Serverless架构的必要因素。所以说狭义的 Serverless 是 FaaS 和 BaaS 的组合。

腾讯云云开发CloudBase Framework

腾讯也做得非常的不错,在整个的serverless服务中给用户提供了一个云开发CloudBase的功能,其包含了在应用时所需要的所有服务,其中包含了用户验证、存储、数据库、缓存等等。所以我们在serverless开发的时候直接使用CloudBase就可以了。

云函数

image.png

image.png
上面这个主函数main接受到了两个参数,event和context。event对象是触发函数的事件,比如小程序端调用时,event是小程序调用云函数时传入的参数;在使用http形式去调用云函数时,event就是一个集成的请求体。context包含此次的调用信息和函数的运行状态,通过context可以知道服务运行的情况。

serverless的缺点

1、唯云厂商命是从,对其严重依赖
Serverless 的能力是云厂商打包提供的,所以 Serverless 产品一定是和云厂商绑定的,又因为Serverless 理念和具体实现之间并没有统一的标准,比如 A 厂商认为 Serverless 的数据库必须使用标准SQL 规范,而B 厂商则认为数库可以使用 SQL 规范也可以使用 JSON 文件的存储方案,这就出现了不同的云厂商实现了不同的 FaaS 接口,我们的同一套代码,是无法在不同的 Serverless 产品上运行的,要想从一个云平台迁移到另一个云平台,成本非常高。

2、开发调试困难
Serverless 应用依赖的云服务,难以在本地环境搭建,要想在本地开发调试非常复杂。同时,Serverless 架构正处于飞速发展的阶段,其开发、调试、部署工具链并不完善