serverless 字面翻译过来是“无服务器”。
问题:
- 这听着和后端有关,和我们前端有什么关系呢?
- 它真的代表不需要服务器了吗?
为什么出现了BFF?
自微服务架构出现后,后端追求服务下沉和解耦,获取的数据不在一个接口中,前端就需要调用好几个接口获取自己想要的数据进行重组后渲染页面,这用户体验就很差,所有就有了BFF层(服务于前端的后端)
微服务:一种用于构建应用的架构方案,可将应用拆分成多个核心功能
? 大概就是这样吧

所以BFF主要做的就是进行API聚合(对后端接口服务进行组合,处理,聚合),避免在前端页面调多个接口
BFF的缺点
- 运维困难(需要关心应用的负载均衡,监控报警等)
- 增加开发成本(一般由前端负责开发)
- 资源成本高(需要提供服务器去运行)
? Serverless就能完美解决上面问题,代替BFF层!!
后端架构的演进
- 物理机
- 体力活
- 容易出错
- 各种硬件设备管理麻烦
- 多台虚拟机(云厂商负责硬件管理,但随着业务复杂,用户变多,每天有大量的读写操作,导致数据库性能瓶颈;很多图片存入磁盘,磁盘不够等;可以数据库迁移到云厂商提供的云数据库(
这就是之后要说到的BaaS型云产品),性能更好,图片存储存入对象存储,服务器只负责请求。)- 扩容时服务器需要初始化软件,运行环境,并且要保证环境一致,运维困难
- 集群管理很复杂
- 容器技术(代码和虚拟环境打包在一起,解决扩容时保持运行环境一致)
- 容器多很难管理
- serverless
- 不用管运行环境,服务器扩容,资源调度
Serverless
基本概念
Serverless可以理解为后端架构的理念,思想或者概念。它不代表不需要服务器,而是代表开发者不需要关心服务器了,将服务器的相关工作交给云平台做。开发者可以不用关心服务器的状态,资源调度(CPU、内存,磁盘等,不限于日志监控,负载均衡,弹性伸缩,数据/文件存储等),只需要关注业务逻辑本身,前面提到的这些与业务无关的基础设施都可以交给云厂商去做,云平台会进行统一的调度,管理和运维。
传统架构可以统称为serverful,指服务器的一切需要人工干预。
serverful 计算,开发者需要分配或找到可用的资源,然后加载代码和数据,执行计算,将计算结果存储起来,最后还要管理资源的释放,
就像使用较为低级的汇编语言,而serverless就如运用高级的python进行编程。
简单来说:serverless架构是采用BaaS(后端即服务:Backend as a Service)和FaaS(函数即服务:Function as a Service)服务解决问题的一种设计。
什么是BaaS?
BaaS(负责存储):开发者通过向BaaS平台申请所需要的服务(不限于云数据库,身份验证,对象存储等)进行消费,而不需要关心这些服务的具体运维。它其实已经出现很久了,后端即服务,这里的“后端”指的就是云厂商提供的云产品和云服务。
什么是FaaS?
FaaS(函数运行平台,负责计算):开发人员直接编写运行在云上的函数、功能、服务。由云服务厂商提供操作系统、运行环境、网关等一系列的基础环境,并且支持多种主流编程语言。大多数Faas平台基于事件驱动的思想,其内部集成了许多触发器,在指定的条件下才会执行函数。
– 工作模式为事件触发,利用云产品和云服务实现函数自动触发
– 无状态:缓存,日志,数据库等通过BaaS型云产品进行支持
其中AWS Lambda是目前最佳的FaaS实现之一,它是一项计算服务。而国内有阿里云,腾讯云也提供了计算服务。
Serverless听着好像很好的亚子,他有什么缺点呢??
Serverless的优点与缺点
优点:
– 无运维
– 事件驱动(集成许多触发器)
– 按量付费(只需要为每次函数的运行付费。函数不运行,则不花钱,也不会浪费服务器资源)
– 弹性伸缩(根据访问量能进行弹性扩容和收缩)
缺点:
– 可移植性(过于依赖云厂商,每个云厂商细微有差别,迁移困难)
– 开发调试困难
– 没有提供底层是什么硬件的选项
– 冷启动(大多数情况下函数“睡眠”的,如果突然触发,首次启动需要经历一段过程,这可能需要一定的时间)
AWS Lambda
介绍
它是一项计算服务,可以运行后端代码以响应。上传到代码到Lambda,这项服务能处理容量,伸缩,修补和基础设施管理的问题以帮助你运行代码,还可以通过向Amazon Cloud Watch发布实时指标和日志来提供对性能的可见性。
? 下图展示了一些能和Lambda配合的服务

例如上传文件到Amazon S3存储桶,更新Amazon DynamoDB数据表、Amazon Kinesis数据流,应用内活动等。
官网案例

- 将图片上传文件到Amazon S3存储桶
- 这个上传事件就会触发Lambda运行代码
- Lambda上有我们之前上传的用于处理图片缩略图的代码,可以将缩略图展示在不同设备上
大概的过程
– 创建两个S3 存储桶用于存放原图和处理后的图
– 创建函数
– 从头开始制作 ?
– 取函数名
– 选择函数运行环境
– 创建函数
– 添加触发器
– 选择触发器 –> S3
– 存储桶:选择用于存放原图的存储桶
– 事件类型:选择对象创建就触发的事件
– 编写函数,其中有个主函数handler,接收event和context,这里的event就是上传到S3上文件的事件,可以获取到文件信息进行处理
– 对函数进行基本设置
– 设置处理程序(重要)
– 设置超时时间
– 使用蓝图(里面提供了许多模板)
最后进行测试 ?。。。