基于node.js在互联网软件开发中实现前后端分离

•1 node.js简介                                                                                             原创者:文思

node.js:js版本的jvm

是一个基于Chrome JavaScript运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。 node.js使用事件驱动, 非阻塞I/O 模型而得以轻量和高效,非常适合在分布式设备上运行数据密集型的实时应用。

node.js与java都是服务器语言,但是两者存在很大区别:

(1)node.js比Java更快 : node.js开发快,运行的效率也算比较高,但是如果项目大了就容易乱,而且javascript不是静态类型的语言,要到运行时才知道类型错误,java开发慢,但是如果项目大、复杂的话,用java就不容易乱,管理起来比node.js省

(2) node.js 前后端都采用Javascript

(3) node.js和Java EE——一种是解释语言,一种是编译语言

优点:

node真正的亮点在于建设高性能,高扩展性的互联网应用——因为它能够处理庞大的并且高吞吐量的并发连接,Node.js从来不是用于解决大规模计算问题而创建的。它的出现是为了解决大规模I/O的问题,项目需求中不包含CPU密集型操作,也不需要访问任何阻塞的资源,那么你就可以利用的node.js的优点:

RESTfulAPI

单线程:node.js可以在不新增额外线程的情况下,依然可以对任务进行并发处理(node.js是单线程的)。它通过事件轮询(event loop)来实现并发操作,我们应该要充分利用这一点(尽可能的避免阻塞操作,取而代之,多使用非阻塞操作)

非阻塞IO:阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。

(你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了,当然你也要偶尔过几分钟check一下老板有没有返回结果)

事件驱动:所谓事件驱动,简单地说就是你点什么按钮(即产生什么事件),电脑执行什么操作(即调用什么函数)

传统的网络服务技术,是每个新增一个连接(请求)便生成一个新的线程,这个新的线程会占用系统内存,最终会占掉所有的可用内存。而node.js仅仅只运行在一个单线程中,使用非阻塞的异步I/O调用,所有连接都由该线程处理,在libuv的加分下,可以允许其支持数万并发连接(全部挂在该线程的事件循环中)



node.js的应用:


•2 基于nodeJS技术的前后端分离方案

对为何前后端分离的思考:

1 现有开发模式的适用场景?

2 前后端职责不清?

3 开发效率问题?

4 对前端发挥的局限?

5 更多...

在此之前,你需要知道什么是前后端分离?

传统的物理层面前后端分离


此架构是不是觉得很熟悉?

1、所有用到的展现数据都是后端通过异步接口(AJAX/JSONP)的方式提供的,前端只管展现。WEB服务中,SPA(Single-page application)类占的比例很少。很多场景下还有同步/同步+异步混合的模式,SPA不能作为一种通用的解决方案。

2、现阶段的SPA开发模式,接口通常是按照展现逻辑来提供的,有时候为了提高效率,后端会帮我们处理一些展现逻辑,这就意味着后端还是涉足了View层的工作,不是真正的前后端分离。


业务与职责层面的前后端分离

前端:负责View和Controller层。

后端:只负责Model层,业务处理/数据等。

非node.js中间层的架构方案(比如采用Backbone,EmberJS, KnockoutJS, Angular框架):


但是,世上就怕但是二字:


各层职责重叠:

Client-side Model是Server-side Model的加工

Client-side View跟Server-side是 不同层次的东西

Client-side的Controller跟Sever-side的Controller各搞各的

Client-side的Route但是Server-side可能没有

性能问题:

渲染,取值都在客户端进行,有性能的问题

在移动设备低速网路的体验奇差无比

重用问题:

模版无法重用,造成维护上的麻烦与不一致

逻辑无法重用,前端的校验后端仍须在做一次

路由无法重用,前端的路由在后端未必存在

跨终端问题:

业务太靠前,导致不同端重复实现

逻辑太靠前,造成维护上的不易


node.js在哪里,职责清晰的架構 + 前端范围的扩展 =重新定义前后端基于node.js中间层分离方案


nodeJS作为中间层开发方的优势:

前端可以更加专注于视图层,而让更多的数据逻辑放在Node层处理

转发数据,串接服务

路由设计,控制逻辑

渲染页面,体验优化

中间层带来的性能问题,

在异步ajax转成同步渲染过程中得到

平衡

更多的可能

node.js角色:中转和前端控制


node.js作为中间层开发方案职责划分:

钉是钉,卯是卯,清晰,层次分明有没有

还有疑惑?1为什么要多加NodeJS这一层?2多加一层,性能怎么样?3多加一层,前端的工作量是不是增加了?4多加一层就多一层风险,怎么破?5 nodeJS什么都能做,为什么还要JAVA

1 (传统MVC的模式进行开发,这种模式严重阻碍了前端开发效率,也让后端不能专注于业务开发),解决方案是让前端能控制Controller层,但是如果在现有技术体系下很难做到,因为不可能让所有前端都学java,nodeJS就能很好的解决这个问题

2 分层就涉及每层之间的通讯,肯定会有一定的性能损耗。但是合理的分层能让职责清晰、也方便协作,会大大提高开发效率。分层带来的损失,一定能在其他方面的收益弥补回来

3 相对于只切页面/做demo,肯定是增加了一点,但是总体开发效率会提升很多

4 读者自己思考吧,不要忘了百度

5 JAVA的基础架构已经非常强大而且稳定,而且更适合做现在架构的事情


让我们来看看先行者是怎么做的,淘宝基于nodeJS的前后端分离方案(引用自百度淘宝):

最上端是服务端,就是我们常说的后端。后端对于我们来说,就是一个接口的集合,

服务端提供各种各样的接口供我们使用。因为有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的首页前后端分离优化:

需求:

静态资料展示,方便运营管理。更好的承载密集且庞大的流量

解决方案:

页面缓存与定时刷新,返回缓存资料。nodeJS产出静态页面到CDN,定时刷新


淘宝基于node的详情页前后端分离优化:

需求:

单日四亿PV,页面数据来自各个不同接口。为了不影响体验,先产生页面框架后。在发起多个异步请求取数据更新页面。这些多出来的请求带来的影响不小,尤其在无线端。

解决方案:

在nodeJS端使用Bigpiper技术,合并请求,降低负担,分批输出,不影响体验

接口性能优化:

拆分大接口为独立小接口,并发请求,串行=>并行,大幅缩短请求时间

部属优化:

一台NodeJS对多台JAVA服务器,合理的分配服务器带来最大的产出

页面渲染优化:

前后端共享模版,首屏服务器渲染,次屏浏览器渲染,局部刷新浏览器渲染

单页面应用优化:

前后端共享路由与模版。前端换页,浏览器端渲染。直接输入网址,服务器渲染

可靠性优化:

单元测试,页面测试,回归测试,持续集成

开发过程中的设计思考点:

接口服务化

代码模块化

功能组件化

待续...

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,376评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,126评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,966评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,432评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,519评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,792评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,933评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,701评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,143评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,488评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,626评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,292评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,896评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,324评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,494评论 2 348

推荐阅读更多精彩内容

  • 总结一: [node.js总结](http://www.cnblogs.com/Darren_code/archi...
    xiumeiii阅读 1,886评论 0 14
  • “你为什么总是如此开朗?但是你却有一种无法言喻的理智。” “你觉得理智的人快乐吗?一般人想象不出我的狂野。” 其实...
    废狗李子阅读 572评论 0 0
  • 盘山险路心有悸,立夏一候独登山。 薄雾轻寒微带雨,鸟鸣水涧别有禅。 欲将桃源收眼底,一山放过一山拦。 才拙学疏对此...
    黔来客阅读 346评论 2 2
  • 今天看电影《从你的全世界路过》里面的猪头对燕子死心塌地全心全意付出八年,最后还是被抛弃。她回来说分手只是人性中的一...
    b2803ce2a1d8阅读 268评论 0 0