FEDay会后-Serverless与云开发,可能是前端的下一站

  • 2019 年 10 月 3 日
  • 笔记

进化本身是生物体与环境之间持续不断的信息交换的具体表现。
—— 摘自《信息简史》

很荣幸在9月21号成都举办的第五届FEDay上作为讲师为大家分享腾讯云在近两年推出的云开发相关的技术和知识,成都是个非常好的城市,就是火锅太辣,费马桶~

我初次接触前端是读书期间的第一份实习工作,在SAP上海研究院TIP BI部门开发基于SVG的Charts库,99%的代码逻辑是将数据用SVG转化为可视化的UI。毕业后成为了一名传统的web前端开发者,期间还折腾过富本文编辑器。后来有近一年的时间研究效率工程,也就是大众口中的前端工程化。然后在加入腾讯之前的工作是地图,技术核心是WebGL。可以说除了音视频以外,5年多的经历基本涵盖了前端领域绝大部分的技术方向。不论是大众的web还是小众的SVG,不论是宏观到web整体的工程化还是微观到像素的图形编程。表面看上去似乎每一份新工作跟之前的工作都关联甚微,比如在使用WebGL期间积累的矩阵、向量、三角剖分等数学和图形学知识基本上在现阶段工作中得不到体现。我不知道各位前端开发者在生涯初期的几年内是否有过一些迷惘,我至今工作5年,但在加入到腾讯之前其实一直是比较茫然的状态。经常思考一些关于职业前景的问题,比如前端的核心价值是什么?前端的发展方向是什么?等等。我尝试在不同的工作内容中寻找这些问题的答案,而在FEDay的这次分享便是我个人认为最接近理想的答案:Serverless

我分享的主体是《从前端到全栈:依托云的Serverless落地实践》,需要说明的是这里的“全栈”指的是开发模式。通俗地说就是让前端开发者能够以很小的成本介入到前端以外的工作,具体来说就是服务和数据。进而从开发模式上,一个前端开发者可以掌控应用整体从前到后所有的功能。

云开发

首先简单介绍一下什么是云开发。云开发并不是Serverless,准确的说它不是Serverless的全部。目前业内对Serverless的普遍认知是FaaS+BaaS,腾讯云基于这种认知的具象实现包括两部分:

  • FaaS层:云函数SCF;
  • BaaS层:云数据库和云存储。

云开发其实是在FaaS和BaaS基础上针对应用端的一套完整的解决方案,包括两部分:

  • 端-SDK:目前小程序端和web端已经推向市场,Android和IOS端即将面世;
  • 云-接入层:本质上是一个API Gateway,与端SDK配合完成FaaS和BaaS的能力调用。

为何云开发可能会改变前端的开发模型?回答这个问题可以对比目前一种比较流行的架构模型:BFF(Backends for Frontend,为前端服务的后端)。

BFF

BFF简单来说就是在原有的一体化服务端基础上,针对不同的业务平台分别开发一层独有的、很薄的服务,见下图:

BFF承担了一部分的业务逻辑,这部分逻辑通常是平台独有的。举一个现实中的例子:在线视频提供商有多种平台,比如网站、app。由于版权限制有些影片只能在特定的平台播放。具化到技术层面,实现此类逻辑包含分平台鉴权、数据查询策略等等,这些便是典型的平台差异化业务逻辑。独立于核心业务逻辑之外的BFF层能够实现差异化逻辑的松耦合,进而令迭代和维护更高效和安全。

目前业内对BFF普遍实践模式是将BFF分发到负责各平台技术开发的团队,比如App团队负责Mobile BFF、前端团队负责PC web和H5 BFF等等。那么对于前端工程师来说,这种模式是否意味着前端兼顾BFF层?理想的场景是这样的,但现实工作中并非如此。BFF本质上仍然是服务层,除了编程语言之外,一名合格的服务端开发者还需要具备一些独有的领域知识以及服务管理、数据管理理念。所以目前大多数BFF仍然由传统前端之外的专人负责,即便是Node.js BFF。

而Serverless和云开发解决的便是编程语言以外的这些问题。

云开发与前端

以云开发体系提供的功能和服务为基础支撑,前端开发者的关注点除了UI和交互逻辑以外,能够以很小的成本介入以云函数为承载的业务逻辑层和以云数据库、云存储为支撑的数据存储层。简而言之,前端的关注点为:交互逻辑+业务逻辑(云函数)+数据(云数据库/云存储)

在云开发支撑的前端架构模型基础上,前端开发者与其他职能团队协作的工程模型也被彻底改变:

  • 业务逻辑由前端开发者负责,不再需要专职的后端开发者;
  • 服务保障和线上监控由云开发平台承担,不再需要专职的运维人员。
能力模型

具体到现实上手开发,开发者们需要了解三种角色:端、云和控制台。

  • 端的表现形式是对应各平台的SDK,是与前端开发者关系最紧密的一个角色;
  • 云指的是支撑Serverless体系的后台系统,这部分对于开发者来说是无感知的,与其对接的工作由端SDK承担。细化到子角色可以分为接入层和基础服务,接入层负责代理转发和用户鉴权等工作;基础服务提供基本的能力支撑,包括云函数、云数据库和云存储;
  • 控制台的功能分为两大类:一是管理功能,比如云函数的部署、数据和文件的管理等等;二是运营,控制台提供产品线上监控以及数据的统计和可视化,以辅助运营。
场景多样化支撑

任何一种新技术或者架构落地到具体的业务场景中都难免会遇到由于业务特殊性造成的迁移困难问题,所以在基础的开发生态之外,云开发为支撑多样化的业务场景建立了必要的策略以及对应的工具。比如对于数据私密性存在高要求的产品,可以通过控制台选择严格的CURD权限管理策略;并且可以使用wx-service-sdk在云函数中进行私密数据的CURD以保障安全性;再比如对实时性要求较高的场景,比如在线客服、多人游戏等,云数据库的实时推送功能可以保障此类功能的高效表现。

落地案例

现阶段云开发的落地场景有两个:小程序和web端(其他端的落地近期到来)。分享现场有一位观众提出了一个问题:云开发能支撑多大的用户量和请求量?如果对云开发和Serverless有基本了解的话,这个问题其实就相当于问1+1等于几一样。云开发最大的优势之一便是根据请求量进行动态的扩缩容,其背后是腾讯云庞大的计算能力做支撑。不过为了更具体的回答这个问题可以参考一个现实中的案例:腾讯相册。

2018年3月份推出腾讯相册小程序在9个月的时间里实现了用户量破亿的成绩,而这个爆款小程序的开发只占用了一个人力,在云开发基础上,一个人完成了从客户端到服务端到数据的全部工作。这个案例足以说明云开发的便利和强大,更多细节可以参考这篇文章

总结&展望

现阶段前端社区对于前端开发者的进化方向有两种较流行的认知:以Node.js为支撑包揽前后端的大前端和以ReactNative和Flutter为支撑的泛前端。云开发非常接近大前端,并且不仅限于服务端,更进一步地深入到数据和存储。小程序其实非常接近泛前端的概念,它是web和native的综合体,大部分场景下开发者均无需关注平台差异性。那么综合大前端和泛前端,在云+端的支撑下是否能够展望一下前端在未来会成为“全栈+全端”?我们拭目以待。