什么是 Serverless
Serverless 指的是,包括服务器的资源、部署情况、操作系统以及依赖软件等均有平台提供。开发者无须关注这些细节,只需要专注于业务实现。
- 广义上:开发者无须关注计算资源就可以直接使用的服务。
- 狭义上:提供给开发者标准化的能力,即:FaaS 和 BaaS。
Serverless 的价值
- 帮助开发者进一步屏蔽了服务器、操作系统、系统软件等概念,让开发者无须关心服务器的负载均衡、节点部署等技术细节,从而能聚焦于本质工作:实现业务逻辑。
- Serverless 只有当对应的任务被触发时才进行计费,这一模式使得用户不用为没有使用的计算资源买单,更进一步,不需要预付费就可以快速上线业务。
Serverless 与前端架构
- 静态内容展示: 最初的 Web 形态,前端只编写简单的 HTML 页面,用户主要以科研人员为主。
- 可交互页面: ASP、PHP、JSP 等技术编写动态网站并结合 JavaScript。
- Web 2.0: Ajax 大规模应用。主要前端框架为 jQuery。
- 单页面应用: Backbone 等。
- 前后端分离:基于 Node.js 的 BFF 中间层。
- 基于 Serverless 的前后端分离:函数取代 BFF 中间层。
前端到全栈:Serverless 通过云原生技术,使得前端工程师能够更容易掌握服务端研发技术。这就导师了前端工程师转变为全栈工程师,后端工程师专注基础设施研究。
Serverless 的服务端应用场景
- 多媒体处理:用户上传视频之后使用不同的函数处理不同的码率,转码只有存储并同步到 CDN。
- IoT:不同设备提交的数据使用不同的函数分别处理之后存储到数据库。
- 聊天机器人:不同的技能使用不同的函数处理。
- 计划任务:特定时间执行预定的函数,基于弹性伸缩的能力,这些函数可以在比较短的时间执行完毕,闲置时无需付费。
Serverless 的前端应用场景
- Web 应用:Web API 使用不同的函数实现,每一个 API 可以独立评估,同事服务也可以自动伸缩、独立计费,资源管理和利用更加精细化。
- SSR: 将页面划分为若干个区域,这些区域对应着不同的组件,而这些组件则使用 FaaS 函数进行服务端渲染。
- 小程序:微信和支付宝小程序通过 Serverless 的架构直接使用云平台提供的 BaaS 来访问云计算服务(数据库、文件存储、账户等)能够降低研发成本。
Serverless 与服务端架构
应用分层架构
这种架构所有的业务代码都在同一个系统中组织,又称为单体应用。
经典的 3 层架构:表现层、业务逻辑层、数据访问层
从应用分层架构迁移到 Serverless 成本比较高,但是可以考虑分模块逐步进行迁移。可以从最耗费资源,请求量最大的模块开始。
微服务架构
由分布式架构发展演变而来,通过将一个大型的单体应用按照功能模块划分成若干独立的小型服务来实现以达到更轻量更可控的研发管理。
这些小型服务通常采用不同的语言、不同的数据库已经不同的依赖来完成相应的功能。同时,服务之间主要通过 RPC 来互相通信。
微服务架构能够更方便的转换成 Serverless 架构,但是两者并不是取代关系,在 Serverless 架构模式下也能使用微服务架构。
云计算
- IaaS: 根据需求向云计算厂商租赁虚拟服务器,用户无需管理物理资源但仍需要选择操作系统、安装软件和部署应用。
- PaaS: 只需要选择云计算厂商提供的产品即可,例如 Google App Engine、OpenShift 等。
- SaaS: 订阅服务,例如 Google Workspace、Dropbox 等。
无论是 IaaS 还是 PaaS 都没有从根本上改变应用的研发模式。都需要进行代码的开发、管理、部署和运维,但是 Serverless 可以彻底改变这样的模式。开发人员只需要将各个业务编写成函数。
容器化
容器化较之硬件虚拟化更进一步实现了操作系统级别的虚拟化。利用了 Linux Kernel 的 Control Groups 和 Name Space 的特性,实现了系统资源的隔离使得在一同个操作系统上可以部署不同的应用,且应用之间互不影响。因此极大地降低了服务器资源的消耗。
FaaS 则在容器化基础上实现了对于应用框架的虚拟化,使得开发人员无需关心软件的依赖,只需要进行业务逻辑的开发。
NoOps
基于持续集成、持续交付、持续部署的理念诞生了 DevOps 的软件开发模式,软件开发人员同时负责开发和运维工作降低了沟通成本,使得产品交付的效率大幅提升。
NoOps 是 DevOps 的下一阶段。在这一阶段下、一切都交给了云计算厂商。NoOps
一旦实现,可以大幅度减少研发人员在运维方面的投入,这样就可以将更多的精力放在实现业务逻辑上,提高效率。
Serverless 是 NoOps 理念的实现方式,除了业务逻辑的实现,其它的一切都由平台提供。
从 IaaS、PaaS、SaaS 到 DevOps 再到 Serverless 架构下的 NoOps,底层技术架构更深远地影响了研发模式。研发工作将变得更智能化和简化,业务的迭代和交付将变得更为迅速。
Serverless 与前端技术
Backend For Frontend
BFF 是服务于前端的后端,主要是在前端和后端之间加一层胶水层,用聚合接口,转换字段名称,移出不需要的字段等。对于前端研发人员,通常采用的是Node.js。
将 Node.js 实现的 BFF 转换成 Serverless 架构则是低成本高收益的架构变更,同时也便于了解和学习 BaaS,进一步实现大范围的探索和尝试。
Node.js
- Node.js 不像 Java 那样依赖虚拟机 JVM,因此服务启动比较快。
- Node.js 基于事件驱动,采用了非阻塞的设计、提高了并发能力,相对容易编写高性能的服务端应用
- Node.js 的单线程设计避开了多线程中的资源竞争、死锁等问题。
这些特性满足了 Serverless 对于服务启动时间的苛刻要求,因为 Serverless 的核心是按需付费,需要十分灵活的弹性需求即自动扩容,而自动扩容的关键指标就是实例的启动时间。
Serverless 的目标就是屏蔽服务端的概念,因此采用 Node.js 更能让前端开发人员规避服务端技术栈的差异。
FaaS
什么是 FaaS?
函数即服务基于事件驱动的理念,提供了让开发者以函数为基本粒度的代码,具有像 HTTP 者其它事件一样被触发并执行的能力。与传统应用相比,以更细粒度的函数方式进行部署,这样计算资源就可以以更精细的调度和管理,这些操作都是自动化完成的,开发者无需参与。
FaaS 的特性
- 函数由事件驱动:FaaS 函数通过事件源调用,这些事件源统称为触发器。常见的触发器有 HTTP,在使用 FaaS 时,需要对触发器进行监听。
- 无状态:与 HTTP 的无状态类似,函数自身不会保存上下文信息,数据的保存依赖于 BaaS。
- 函数足够简单:当函数足够轻量并能快速执行返回时,才能实现资源占用的最小化,这就服务 Serverless 的理念。
FaaS 的优点
- 更高的研发效率:与 IaaS 和 PaaS 相比,FaaS 为用户提供了运行环境,同时在应用层面明确了函数的调用方式,因此开发人员只需要聚焦业务函数而无需关注底层。
- 更低的部署成本:无论是传统的部署方式(Node.js, Nginx, PM2 等)和容器化的部署方式都需要开发人员具备相应的知识能力,而 Serverless 只需要开发人员在平台中进行简单地操作即可完成部署。
- 更低的费用
- 更灵活的部署方案
- 更高的安全性
FaaS 的缺点
- 平台学习成本
- 不便调试
- 潜在的性能问题:冷启动时间
- 供应商锁定
BaaS
什么是 BaaS
后端即服务指的是可以用来替换应用程序中的一些核心能力,且直接通过 API 的方式提供的第三方服务,由于这些服务自身实现了自动伸缩的能力,因此开发者无需了解服务器相关信息。
BaaS 的应用
- 数据存储
- 身份验证 Auth0
- 文件存储与分发