概述
Serverless 是一种“无服务器架构”模式,它无需关心程序运行环境、资源及数量,只需要将精力聚焦到业务逻辑上的技术。基于 Serverless 开发 web 应用,架构师总是试图把传统的解决方案移植到 Serverless 上,虽然可以做到既拥有 Serverless 新技术带来的红利,又能维持住传统开发模式的开发体验。但是,Serverless 技术带来的改变可能不止这些,可能是碘伏整个传统 web 应用开发模式的革命性技术。
开发模式
业务应用的开发模式发展是从一体到分裂为前后端,再到前后端融合为一体过程。
注意:后面所说的后端特指后端业务逻辑。
早期,一体
没有前后端的概念,那时候的应用都是单机版,所有的业务逻辑都写一起,开发人员不需要关心网络请求,这个时期的工程师完全专注于业务代码的开发。随着业务规模的增长,也暴露了很多问题:
高并发问题高可用问题说明:业务应用升级困难等一些问题,不是本篇文章所关心,所以就不一一列举出来。
现在,分裂前端 高可用高并发运维裹挟着的后端业务逻辑:
说明:现在 Serverless 技术已经出现有一段时间了,不但没有解决开发体验的问题,反而带来更多开发体验问题,所以,在这里我并没有突出 Serverless 技术。
解决的问题:
解决一个问题,带来一堆问题:
这也是为什么创业小公司喜欢全栈开发工程师,因为在创业早期,高可用和高并发的需求不是那么迫切,因而运维也相对简单,使用全栈开发工程师,不仅缩短了项目交付周期,而且也降低了公司的运营成本,这对创业小公司是至关重要的。
未来,融合回到到一体前端 后端 Serverless 平台服务 => 业务应用 Serverless 平台服务:
说明:共享逻辑是前后端的共享逻辑,在过去,由于前后端分裂,是很难做到前后端层面的代码抽象的,前后端融合后,让这件事变得简单自然。
带来困惑:
前后端分工合作,不是很好吗?在过去,将一个复杂的问题分解成多个简单的子问题,高并发和高可用没法做到不侵入业务应用,这种确实是一种很好的解法,也是没办法中的办法。前后端分工合作带来的成本问题,越发凸显。现在 Serverless 透明的解决了高并发和高可用问题,那么我们为什么还需要从技术维度来划分,我们不是更加推荐按业务维度来划分吗? 后端依然很难,驾驭前后端的门槛依然很高?后端代码逻辑虽然没有了高并发和高可用的裹挟,还是会很难,比如 AI。我相信类似这种很难的业务,现在可能有,未来一定会有相关的开发工具包或者平台服务为我们解决,让这些很难的技术平民化。难的技术交给专业的人解决。找回初心:
回归业务,前后端一体化。随着 Serverless 技术的出现,解决了高可用、高并发和运维问题,作为工程师的我们是不是应该回头看看,找回初心:专注于业务代码。让原本在一起的后端业务代码与前端代码再次融合。因此,前后端一体化难道不是我们失去已久的应用开发终极解决方案吗?现状
Serverless 已经做到了以下两点:
工程师只需要关心业务逻辑上的技术拥有接近于传统应用开发体验(解决历史遗留问题,可能还有些距离)传统应用框架,食之无味,弃之可惜:
目前,很多用户已经感知到了 Serverless 带来的高可用、高并发和免运维的好处,用户能够很自然的想到如果能将现有的开发框架移植到 Serverless 上,那就太好不过了。Serverless 平台很自然会提供现有框架的移植方案。解决的问题是将传统的解决方案移植到 Serverless 上,让用户在 Serverless 上拥有传统的开发体验应用框架找回初心:
前后端业务逻辑代码的融合,即前后端一体化前后端一体化解决了什么问题:
解决了第二阶段开发模式中间出现的问题,具体请参考:“解决一个问题,带来一堆问题”。实现前后端一体化,欠缺如下:
基于Serverless 的前后端一体化框架工具其中,基于 Serverless 的前后端一体化框架解决前后端一体化问题;工具屏蔽掉 Serverless 平台细节,提供一致的部署运维体验。
未来
未来,开源社区会涌现大量的基于 Serverless 的前后端一体化的框架和工具,webassembly 让前后端一体化打破了开发语言的限制,可以用任意开发语言开发前后端,如 ja va、go 等等。由于 ja vascript 是为前端而生,typescript 是目前做活的前端开发语言,前后端统一用 typescript,其他语言可以通过 webassembly 技术让 typescript 语言来调用可能是最好的选择。
想要成为一个流行的基于 Serverless 的前后端一体化框架,需要具备这么几个特质:
开源不绑定社区化运营形成标准模型简单结语
Serverless 技术让我们向新世界大门迈出了左脚,请让基于 Serverless 的前后一体化框架帮我们迈出右脚。同时,请别再叫我前端开发工程师,我是业务应用开发工程师。
Q&A
Q:前后端一体化需要将前后端代码发布到同一个地方吗?
A:不需要,分开发布,通过统一的工具负责前后端发布任务,前端可以发到 CDN,后端可以发布到 Serverless 平台,如:阿里云函数计算。
Q:未来是不是没有后端工程师?
A:有的。前端工程师只是把前端和后端的业务逻辑代码给做了,后端工程师去做真正的后端,那时候的后端工程师将会更加专业,前端工程师可能会变成应用开发工程师(暂且这么称呼)。对于中小型企业,可能大部分是应用开发工程,有少量甚至没有专业的后端工程师。
Q:为什么不直接做一个像 expressjs 那样的 Web 应用框架?
A:原因其实很明确。expressjs 这类框架诞生时,并不存在 Serverless 这样的技术背景,所以它本身并没有围绕 Serverless 带来的架构变化来设计。换句话说,如果业务确实需要一套类似 expressjs 的框架能力,完全可以把 expressjs 迁移到 Serverless 环境里运行,没必要再从头重做一套。
Q:为什么选择 nodejs 框架?
A:核心原因在于,nodejs 和前端 js 用的是同一套语言,这让前后端一体化这件事更容易做到、更容易做深。webassembly 的确也能让各种语言在前端跑起来,从这个角度看,同样可以实现前后端语言统一;但问题在于,js 本身就是为前端诞生的,天然更贴近这个场景,用起来也更顺手一些。再往下看,其他语言通常需要先通过 webassembly 编译成中间语言,而 nodejs 则可以借助 vm 去调用其他语言提供的能力。当然,未来也不是没有变化的可能,不排除会出现一种新的运行环境替代 nodejs,在多语言支持以及 Serverless 这类场景里,表现得更合适。
Q:前后端一体化的极致是一种什么感觉?
A:前后端代码都在一个项目中用同一种语言来写,在本地定义一个后端接口方法,前端就像调用本地方法一样调用后端方法(不是在本地定义的后端接口也是一样,比如跨组件、外部服务),前后端可以抽象更多的公共逻辑,比如工具类等等,一个开发人员就能维护好整个项目,没有了多项目多语言的切换痛苦。
