基于NodeJS的前后端分离
前⾔
为了解决传统Web开发模式带来的各种问题,我们进⾏了许多尝试,但由于前/后端的物理鸿沟,尝试的⽅案都⼤同⼩异。痛定思痛,今天我们重新思考了“前后端”的定义,引⼊前端同学都熟悉的NodeJS,试图探索⼀条全新的前后端分离模式。
随着不同终端(Pad/Mobile/PC)的兴起,对开发⼈员的要求越来越⾼,纯浏览器端的响应式已经不能满⾜⽤户体验的⾼要求,我们往往需要针对不同的终端开发定制的版本。为了提升开发效率,前后端分离的需求越来越被重视,后端负责业务/数据接⼝,前端负责展现/交互逻辑,同⼀份数据接⼝,我们可以定制开发多个版本。
这个话题最近被讨论得⽐较多,阿⾥有些BU也在进⾏⼀些尝试。讨论了很久之后,我们团队决定探索⼀套基于NodeJS的前后端分离⽅案,过程中有⼀些不断变化的认识以及思考,记录在这⾥,也希望看到的同学参与讨论,帮我们完善。
⼀、什么是前后端分离?
最开始组内讨论的过程中我发现,每个⼈对前后端分离的理解不⼀样,为了保证能在同⼀个频道讨论,先
就什么是”前后端分离”达成⼀致。
⼤家⼀致认同的前后端分离的例⼦就是SPA(Single-page application),所有⽤到的展现数据都是后端通过异步接⼝(AJAX/JSONP)的⽅式提供的,前端只管展现。从某种意义上来说,SPA确实做到了前后端分离,但这种⽅式存在两个问题:
WEB服务中,SPA类占的⽐例很少。很多场景下还有同步/同步+异步混合的模式,SPA不能作为⼀种通⽤的解决⽅案。
现阶段的SPA开发模式,接⼝通常是按照展现逻辑来提供的,有时候为了提⾼效率,后端会帮我们处理⼀些展现逻辑,这就意味着后端还是涉⾜了View层的⼯作,不是真正的前后端分离。
SPA式的前后端分离,是从物理层做区分(认为只要是客户端的就是前端,服务器端的就是后端),这种分法已经⽆法满⾜我们前后端分离的需求,我们认为从职责上划分才能满⾜⽬前我们的使⽤场景:
前端:负责View和Controller层。
后端:只负责Model层,业务处理/数据等。
MVC分
试想⼀下,如果前端掌握了Controller,我们可以做url design,我们可以根据场景决定在服务端同步渲染,还是根据view层数据输出json数据,我们还可以根据表现层需求很容易的做Bigpipe,Comet,Socket等等,完全是需求决定使⽤⽅式。
3.1 基于NodeJS“全栈”式开发
如果想实现上图的分层,就必然需要⼀种web服务帮我们实现以前后端做的事情,于是就有了标题提到的“基于NodeJS的全栈式开发”
Node 带来的全栈时代
这张图看起来简单⽽且很好理解,但没尝试过,会有很多疑问。
SPA模式中,后端已供了所需的数据接⼝,view前端已经可以控制,为什么要多加NodeJS这⼀层?
多加⼀层,性能怎么样?
多加⼀层,前端的⼯作量是不是增加了?
多加⼀层就多⼀层风险,怎么破?
NodeJS什么都能做,为什么还要JAVA?
淘宝基于NodeJS的前后端分离
上图是我理解的淘宝基于Node的前后端分离分层,以及Node的职责范围。简单解释下:
最上端是服务端,就是我们常说的后端。后端对于我们来说,就是⼀个接⼝的集合,服务端提供各种各样的接⼝供我们使⽤。因为有Node层,也不⽤局限是什么形式的服务。对于后端开发来说,他们只⽤关⼼业务代码的接⼝实现。
服务端下⾯是Node应⽤。
Node应⽤中有⼀层Model Proxy与服务端进⾏通讯。这⼀层主要⽬前是抹平我们对不同接⼝的调⽤⽅式,封装⼀些view层需要的Model。Node层还能轻松实现原来vmcommon,tms(引⽤淘宝内容管理系统)等需求。
Node层要使⽤什么框架由开发者⾃⼰决定。不过推荐使⽤express+xTemplate的组合,xTemplate能做到前后端公⽤。
怎么⽤Node⼤家⾃⼰决定,但是令⼈兴奋的是,我们终于可以使⽤Node轻松实现我们想要的输出⽅
式:JSON/JSONP/RESTful/HTML/BigPipe/Comet/Socket/同步、异步,想怎么整就怎么整,完全根据你的场景决定。
浏览器层在我们这个架构中没有变化,也不希望因为引⼊Node改变你以前在浏览器中开发的认知。
引⼊Node,只是把本该就前端控制的部分交由前端掌控。
这种模式我们已经有两个项⽬在开发中,虽然还没上线,但是⽆论是在开发效率,还是在性能优化⽅⾯,我们都已经尝到了甜头。
五、我们还需要要做什么?
把Node的开发流程集成到淘宝现有的SCM流程中。
基础设施建设,⽐如session,logger等通⽤模块。
前端跟后端哪个就业难
最佳开发实践
线上成功案例
⼤家对Node前后端分离概念的认识
安全
性能
技术上不会有太多需要去创新和研究的,已经有⾮常多现成的积累。其实关键是⼀些流程的打通和通⽤解决⽅案的积累,相信随着更多的项⽬实践,这块慢慢会变成⼀个稳定的流程。
六、“中途岛”
虽然“基于NodeJS的全栈式开发”模式很让⼈兴奋,但是把基于Node的全栈开发变成⼀个稳定,让⼤家都能接受的东西还有很多路要⾛,我们正在进⾏的“中途岛”项⽬就是为了解决这个问题。虽然我们起步不久,但是离⽬标已经越来越近!!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。