在大家的印象中,相当长一段时间里,JavaScript是一门脚本语言,一般不能成为某个项目的担纲主角,作用只是在浏览器里帮忙校验校验输入是不是正确,响应一下鼠标、键盘事件,或者让某个HTML元素动起来,搞点特效等等,相当于在剧组中帮忙递递毛巾,打打开水。

后来,AJAX这种数据交互模式的出现,催生了Web2.0的繁荣,让Web页面也能实现像桌面程序一样的效果,用户体验大大提升,但是,它想发挥价值,还必须和另外一个主角(浏览器)一起出场,如果和浏览器的关系搞得不好(不兼容),那么,后果会是非常糟糕的。这时候的JavaScript至少可以认为可以跑跑龙套,偶尔也当一下配角。

而NodeJS的出现,则让JavaScript重新焕发了生机,让它可以离开浏览器,离开Web前端,来到了广阔的网络服务器的新天地,可以在Windows,Linux,Mac OS上运行,成为业务的绝对主角,再也不用低声下气地跟别人谈兼容性,而为它搭台的是大名鼎鼎的Google V8引擎,于是各种好戏轮番上演,精彩不断。

NodeJS是什么,它的历史来源,如何安装,如何测试....已经有很多人谈论了,本文想从业务架构的角度来谈谈NodeJS的特点,这样,当你拿到一个具体的业务的时候, 就知道如何优雅地实现这些业务逻辑,看看NodeJS是否适合你的业务诉求。

特点1:异步I/O,事件驱动模式

我们通过一个故事来感知一下异步业务流程。光明小区的王大姐和李阿姨在“玉湖”网上生鲜超市预订了几只大闸蟹,收到的提示消信息是:今天早上10:30送到光明小区门口。王大姐和李阿姨10:20就来到了小区门口,但是到了10:35,玉湖生鲜超市的送货小哥还没有送到,请问:王大姐和李阿姨可以怎么做?

同步模式:一直在小区门口等,等到11:00终于等到送货的小哥,然后拿着大闸蟹回家做午饭去。

异步模式:两位估计一时半会儿大闸蟹是不会送到了,于是跟守门的张大爷说:“我们先去那边跳一会儿广场舞,如果你看到‘玉湖’生鲜超市的车到了,给我们打个电话,谢谢。”于是两位就高兴地去跳广场舞了。到了11:00,‘玉湖’生鲜超市的送货车来到小区门口,张大爷给李阿姨打了个电话,两位大妈来到小区门口收了大闸蟹回去做午饭了。

无所事事的等待总是让人厌烦的,生活中到处都是异步调度例子,也符合人们的处理习惯,尤其是有多件事情要处理时。

回到JavaScript语言本身,在前端开发的过程中,我们对异步模式并不陌生:

l  当DOM树解析完的时候,我们可以做xxx。

l  当所有资源加载完毕的时候,我们可以做xxx。

l  当用户单击了这个按钮的时候,我们可以做xxx。

l  …..

到了NodeJS,我们开发后端网络服务器程序的时候,依旧可以采用这样的模式:

l  当有客户端发送请求连接的时候,我们可以做xxx。

l  当有客户端有数据提交上来的时候,我们可以做xxx。

l  当网络连接断开的时候,我们可以做xxx。

从某种意义上说,当要处理一大堆并发的业务时,异步的基于事件驱动的编程模式比同步的阻塞模式效率要高的多。当然了,NodeJS也提供了一些同步处理的机制,用于在某些特定的场合使用,例如:要等条件A,条件B,条件C都满足的时候,才去做D这件事。

特点2:小而美,各司其职

NodeJS的整个框架是基于单线程事件驱动的异步式I/O,相比于Java,C++等多线程的机制,省去了维护线程的运行时环境的开销,当然,也迫使你在进行业务分析、模型架构的时候将大任务分解为一些小任务,体现了UNIX 系统中的专注做好一件事,小而美,各司其职的特点。因为是一个单线程,如果某个地方的处理出现了异常,那么整个程序就崩溃了,所以,对异常的处理要特别谨慎,时刻想到这里可能会发生什么异常。

特点3:云端管控模式npm

NodeJS基于功能的划分单位是模块,在程序设计时可以根据需要加载相关的模块,功能相近的模块可以组成一个包,从业务上看,跟Java的类库以及VC中的lib文件等类似,但是,包有一个重要的特性是:自解释的(之前只搞过Windows平台编程的我,第一次见到这种包的机制,内心还是有点小激动的,各位大牛轻拍)。什么意思呢?每个包都有一个package.json的包说明文件,里面说明了:这个包是用来干什么的?包含哪些部分?作者是谁?当前版本是什么?如何使用这个包?这个包依赖哪些包?测试用例是什么?…..等信息,CommonJS规范的体现,有了这种特性,再加上各个包可以在云端通过npm(NodeJS Package Manage)服务器来管理,这样在发布、调用、升级、维护起来的时候就非常方便,相关的程序读懂了这个包描述文件,就知道该怎么做了。

这么说有点抽象,那咱们就举个栗子吧。

如果你要在Windows上安装一个PHP服务器来玩玩,那么,你就要先安装一个Web服务器(例如:Apache),然后再安装PHP服务器,然后再在Apache里面配置相关的模块。如果遇到版本不匹配,配置信息错误,整了半天还是没能看到那句经典的Hello World!你的心情是崩溃的。(当然,现在也出了很多一键安装的集成软件包,咱这里主要是对比两种机制)

而来到NodeJS世界,你想搞一个Web服务器玩玩,你要做的就是打开命令行工具,然后输入:

npm install express                 //安装express框架

//安装完express框架之后执行

express –t ejs myWebSite             //选用ejs模板引擎建立网站

//进入到目录myWebSite,执行

npm install                         //实现网站的安装

//安装完毕之后,执行

node app.js                         //启动Web服务器

每一步都是明确的,结构是清晰的,npm客户端工具与npm服务器之间基于包描述文件来沟通,依赖其他什么包?如何下载?版本如何匹配?都不用用户操心。

这种机制在Linux世界里貌似很常见,npm也传承了Linux社区的共享、共生的理念,是一个自由新世界。

特点4:基于底层的API,专为网络而来

既然是开发网络服务器,那么性能始终是一个重要的话题,如果单从JavaScript的语言性能,当然无法与C语言等编译型语言相比。但是,NodeJS牛X的地方在于,它把常见的网络功能模块,用C语言实现了,抽象成模块给JavaScript调用(具体怎么整的得问那些大神哈,我也不清楚其中的缘由,所以就不展开说了),这样就兼顾了性能和易用性,据说,整体的测评结果还非常不错,所以,核心模块用高效的语言来实现是NodeJS能够在服务器领域风靡开来的一个重要原因。

另外,一个方面,NodeJS提供的API接口都非常底层,也就说,不仅可以构建基于socket的网络服务,也可以实现HTTP服务器,如果你想搞一个基于浏览器的及时通讯平台,还可以用它来实现一个WebSocket服务器。

熟悉TCP/IP网络协议的朋友都知道,网络协议中的报文,往往是用Bit位来描述特性的,例如:第2位为0代表什么意思,第2位如果为1,又代表另外一个意思,要实现网络协议,不管是封装报文,还是解析报文,对“位”来操作都是绕不过去的。但是,JavaScript语言,对“位”操作的能力是极其有限的,效率底下,记得:JavaScript的大师级人物老道(Douglas Crockford)还忠告过大家,不要用JavaScript来执行“位”运算。面对各种各样的网络报文,该如何处理呢?这就又出现了NodeJS的精妙之处,引入了Buffer数据类型,专门用来处理二进制数据。

所以说,核心模块用C语言实现、提供了底层的API、引入了Buffer数据类型,是NodeJS非常适合开发网络服务器的重要原因。

当然啦,关于NodeJS的知识还有很多,也有一些非常知名的NodeJS框架,关于JavaScript的内容也有很多,更深入的了解,推荐大家看看诸位大牛写的文章和专著。下一篇开始,我们将以爱莲(iLinkIT)这个业务场景为起点,看看如何用NodeJS来达成我们的目标。

-----------------------爱莲(iLinkIT)系列文章------------------------------------------

缘起爱莲:我要的,现在就要!

爱莲(iLinkIT)的架构与原理

遇见NodeJS:JavaScript的贵人

NodeJS服务器:一行代码 = 一个的HTTP服务器

NodeJS文件读取:感恩常在--抓把糖果,愉悦客人

NodeJS缓存机制:畅销货,就多囤一点呗

NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红

NodeJS服务器退出:完成任务,优雅退出

遇见NodeJS:JavaScript的贵人的更多相关文章

  1. 开始学习NodeJs, javascript, 算法

    我的技术路线是C.C++.C#.PHP,什么都做过,很杂,总想着该怎么继续下去. 最近突然发现了NodeJs,觉得很适合我. 学习环境定在了Ubuntu下,编辑软件选择了WebStorm7. 经过几天 ...

  2. nodejs javascript微信开发

    1.当从第三方软件需要分享到微信的时候 需要给授权处理才能获得微信信息 比如 nickname 等昵称图像等 从第三方登陆跳转到微信分享页需要 shareurl = http://open.weixi ...

  3. Sublime Text3搭建完美开发环境(Python+PHP+Javascript+nodejs+C++)

    一.Sublime配置(如已安装Package Control可跳过) sublime下载地址:http://www.sublimetext.com/3 安装Package Control插件: 直接 ...

  4. NodeJS服务器:一行代码 = 一个的HTTP服务器

    从这一篇开始,我们进入技术讲解的话题,逐步实现用NodeJS实现文件的传送共享服务. 前文我们讲过,NodeJS是最擅长做网络服务器的,今天我们就来用NodeJS做一个最简单的服务器. 先看一幅图: ...

  5. NodeJS文件读取:感恩常在--抓把糖果,愉悦客人

    通过上一篇文章“NodeJS服务器:一行代码 = 一个的HTTP服务器”,我们已经开启了NodeJS之旅,开发了一个监听在8000端口的HTTP服务器,虽然功能很简单,但是,已经让我们感受到用Node ...

  6. NodeJS缓存机制:畅销货,就多囤一点呗

    上一篇文章,我们已经实现了客户端向NodeJS服务器发出请求时,服务器从磁盘读取文件内容后,向客户端返回文件的数据.而对于爱莲(iLinkIT)的1对n的场景,即将文件共享出来之后,让多个用户同时下载 ...

  7. NodeJS安全设计:好吃的草莓味糖果,只给好朋友小红

    上一篇文章中,我们已经建立了一个有缓冲机制的文件服务器,能给客户端响应附件类型的文件,其实,就爱莲(iLinkIT)而言,NodeJS的模块做到这样也就已经可以了,因为使用的场景就是电脑和手机之间,与 ...

  8. NodeJS服务器退出:完成任务,优雅退出

    上一篇文章,我们通过一个简单的例子,学习了NodeJS中对客户端的请求(request)对象的解析和处理,整个文件共享的功能已经完成.但是,纵观整个过程,还有两个地方明显需要改进: 首先,不能共享完毕 ...

  9. nodejs上传图片并显示的例子

    目标 1. 在浏览器地址栏输入“http://demos/start”,进入欢迎页面,页面有一个文件上传表单: 2. 选择一张图片并提交表单,文件被上传到"http://demos/uplo ...

随机推荐

  1. 分布式存储系统sheepdog

    Sheepdog,是由NTT的3名日本研究员开发的开源项目,主要用来为虚拟机提供块设备. 其架构例如以下: 以下,我们将从架构.模块等几个方面来介绍下: 一.架构图 如上图: 採用无中心节点的全对称架 ...

  2. jackson使用示例

    Jackson可以轻松的将Java对象转换成json对象和xml文档,同样也可以将json.xml转换成Java对象. Jackson 2.x版提供了三个JAR包供下载: 1. Core库:strea ...

  3. ubuntu 设置IP,设置网关

    1. 检验是否可以连通,就使用ping命令ping 网关 开始的时候总是现实unreachable 2. 设置IP sudo ifconfig eth0 133.133.133.190 netmask ...

  4. C# 自定义重绘DataGridView

    using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; using Syste ...

  5. iOS 应用首次开启 出现引导页面

    关于引导页面 ,可以是独立的一个视图控制器控制的滚动视图. 重点是处理 如何判断app是首次开启 而调用这个视图控制器得方法. 逻辑如下: -(BOOL)isFirstLoad { if(!标记第一次 ...

  6. MySQL(22):事务管理之 事务回滚

    1. 在操作事务的时候,如果发现当前事务操作是不合理的,此时只要还没有提交事务,就可以通过回滚取消当前事务,接下来就针对事务的回滚进行详细讲解. 2. 为了演示回滚操作,在上一个笔记案例基础之上,此时 ...

  7. 使用手机模拟器与android操作系统

    创建手机模拟器: 1. 点击Eclipse中新增的按钮,打开"Android Virtual Device Manager"(不同版本的ADT可能打开路径不同),如下图: 2. 点 ...

  8. css+div网页设计(二)--布局与定位

    在网页设计中,能否控制好各个模块中在页面中的位置是非常关键的,与传统的表格定位不同,css+div定位方式更加的灵活,本篇博客将为大家介绍css+div的布局与定位. 一.盒子模型 由图可以看出 盒子 ...

  9. What are definitions of ​Model, Inference and Algorithm and its associations ?

    1.拿初中的二元一次方程来说明: 1.1)说model就好比一元二次方程,它是个方程模型: 1.2)再说inference是求解该方程的某种方法--加减消元法(重在推理): 1.3)最后说algori ...

  10. xe5 android tts(Text To Speech)

    xe5 android  tts(Text To Speech) TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话. 以下代码实现xe5 开发的文本转 ...