天下大势,分久必合,合久必分。其实,技术的发展也遵循此规律。以Web应用的前后端为例,从前后端一体化到前后端分离,是为了解决高可用、高并发的问题;从前后端分离到前后端一体化,则是在Serverless架构的支持下,自然地解决了高可用、高并发等问题,同时使业务逻辑变得更具整体性,更易于开发,让开发者可以更专注于业务逻辑,提高整体的效率。
1 前后端一体化的发展
早些时候,一些业务的开发没有前后端概念,或者说是前后端是一体化的,工程师更多关注的是业务逻辑的开发;但是随着时间的推移、技术的进步和业务需求的变更,高可用、高并发逐渐成了前后端一体化项目的瓶颈。为了更好地解决前后端一体化中高可用、高并发的问题,前后端逐渐分离,也逐渐有了更加明确的分工。前后端分离后的Web结构简图如下所示。
前后端项目分离
前后端分离的最大好处是可以解决高可用、高并发的问题;同时,前端工程师可以更好地关注页面的还原,以及页面的逻辑,后端工程师可以更关注后端接口的稳定性,运维人员则可以更关注整体业务的稳定性。
但是,事实并非如此。前后端的分离,虽然在一定程度上解决了高并发、高可用的问题,却带来了更严重的问题:原本一体化的应用逻辑从此划分为前端逻辑和后端逻辑,产生了割裂,过去,前后端之间的界限往往是模糊的,分离之后开发联调的成本提高了,业务上线周期也因此进一步延长了;另外,前后端技术发展速度可能不均衡,这也给整个业务的迭代带来了极大的负面影响,前后端的代码抽象程度也随之提高,后期维护的复杂度也变得更高,因此运维成本也因前后端的分离而进一步增加了。
前后端的分离解决了一个问题,却带来了更多问题。而这些额外带来的问题,往往也是当今许多Web项目面临的问题。
随着Serverless架构的不断演进,其逐渐对前后端一体化的发展起到了促进作用。从前后端一体化到前后端分离是为了解决高可用、高并发的问题,而Serverless架构凭借着函数计算的弹性自然地解决了这些问题。同时,函数计算本身可以让业务开发者更关注业务逻辑,按量付费模式使函数计算具有成本更低的优势。因此,前后端一体化再次被人所关注。随着Serverless技术的不断发展,前后端一体化技术也再次成了众多开发者,尤其是前端开发者关注的焦点。基于Serverless架构的前后端一体化如下所示。
基于Serverless架构的前后端一体化
在基于Serverless架构的前后端一体化项目中,业务应用层主要包括前端、后端和共享逻辑三个部分:
- 前端即用户的页面,一些静态资源部分;
- 后端即一些业务逻辑的接口,可以对数据库进行增删改查操作,也可以处理一些计算任务;
- 所谓共享逻辑,是指前后端的共享逻辑,过去由于前后端分裂,很难做到前后端层面的代码抽象,在前后端融合后,这件事变得简单且自然。
基于Serverless架构的前后端一体化项目在享用Serverless架构的技术红利的同时,也进一步推动了前端技术的发展,同时也逐渐引导前端角色向全栈开发角色转型。阿里巴巴Midway FaaS项目以前后端一体化为核心,在其Mydway Serverless2.0的发布会上,曾以“全栈”为题,讲述基于Serverless架构的Midway Serverless前后端一体化的全栈解决方案,如下所示。
基于Serverless架构的Midway FaaS前后端一体化的全栈解决方案
在Midway Serverless方案中,我们可以明显看到三个核心点:
- 同仓库、同依赖、同命令;
- 共享src、类型、代码;
- 一起开发、一起部署。
Serverless架构下的前后端一体化项目发展至今,不仅局限于从前端到后端,也为打通从前端到后端再到数据库的全链路而不断努力,从而实现全链路类型的安全方案。
例如Prisma可以实现数据库中的一个user表通过TypeScirpt映射到后端和前端的类型校验上,如下所示。
从前端到后端再到数据库的全链路打通
2 Serverless与前后端一体化
基于Serverless架构的前后端一体化项目,可以根据业务需求的不同而组合使用不同的产品来完成,例如依靠函数计算和存储产品实现业务需求,如下所示。
基于Serverless架构的前后端一体化服务端结构简图
这种架构非常简单,只需要将函数计算与对应的存储产品结合,即可实现前后端一体化的部署。
但是,通过函数计算建设Proxy层存在一定的不合理性:通过对象存储、CDN等暴露的静态资源产生的流量费用,要比通过函数计算暴露产生的流量费用低很多;函数计算在当前环境下存在冷启动的情况,因此通过函数计算建设Proxy层会产生性能问题。
如果需要对上述架构进行优化,我们可以加入API网关或者CDN等产品,如下所示。
基于Serverless架构的前后端一体化服务端结构简图
通过API网关或CDN建设Proxy可以实现分流,在一定程度上保证了性能。部分厂商的CDN具有边缘FaaS能力,如果可以在部分节点进行后端服务的运行反馈,整体性能将进一步提高。
当基于Serverless架构的前后端一体化项目实现时,我们不需要自己建设整体的后端服务架构,也不需要自己制定客户端资源描述规范,因为目前已经有相当数量的基于Serverless架构的前后端一体化项目工具(包括脚手架、项目开发、项目部署、后期运维等全生命周期的功能支持)帮助我们一键部署前后端一体化应用。阿里巴巴开源的Midway Serverless项目就是一个比较典型的例子。接下来我们以Midway Serverless工具为例,部署一个前后端一体化应用。
在使用Midway Serverless工具之前,首先需要安装工具:
npm install @midwayjs/cli -g --registry=https://registry.npm.taobao.org
安装命令行工具之后,可以创建一个前后端一体化应用:
mw new my-app
创建时,可以选择:
faas-hooks-react - A serverless boilerplate with react and use hooks
完成上述操作后显示如下所示。
Midway Serverless初始化前后端一体化项目
完成之后,进入项目,并将其部署到云端:
cd my-app && npm run deploy
稍等片刻,可以看到系统输出“Deploy success”,即该项目已完成部署,如下所示。
Midway Serverless部署前后端一体化项目
此时,打开浏览器,输入系统生成的地址,如下所示。
预览基于Midway Serverless部署的前后端一体化项目
可以看到,一个前后端一体化的项目已经完成了部署:
- /src路径,将会被路由到静态资源(前端资源);
- /apis路径,将会被路由到函数计算(后端服务)。
至此,使用Midway Serverless工具快速实现了一个基于Serverless架构的前后端一体化项目。
3 总结
随着Serverless架构的不断发展,以及前端技术的不断演进,Serverless架构和前端技术的结合也越来越紧密。通过Serverless架构可以快速部署一个SSR应用,也可以实现一个前后端一体化项目,Serverless架构凭借其弹性伸缩能力和分布式架构,让很多传统架构下较难实现的前端技术变得更加简单与便捷。与此同时,Serverless架构的按量付费模式和设计理念,使项目开发者能够在业务逻辑的实现上投入更多精力,并大幅度降本提效。
标签:Serverless,架构,前端,前后,一体化,Midway From: https://www.cnblogs.com/muzinan110/p/17067612.html