`

有关NodeJs

 
阅读更多

Metamarket的CTO Mike Driscoll最近发表了一篇略带煽动性的帖子,讨论了Web应用的架构。他认为Node.js框架预示着LAMP的终结。

三个月前,我们决定废弃仪表盘选用的框架:Python的Django,并用Node.js(服务器端的Javascript)重新构建了框架。鉴于LAMP堆栈已经死亡,我们才做出了这个决定。

Mike认为Web有三个阶段:

  • 1991-1999:HTML时代——这是个文档的时代。
  • 2000-2009:LAMP时代——使用数据库的时代。
  • 2010-??:Javascript时代。Javascript时代是事件流的时代。

现代的Web页面已经不再是页面了,它们都是事件驱动的应用,信息会通过这些应用流转。

他解释道:

LAMP架构已经死了,因为对于响应里的Mashup,很少有应用愿意把全部的有效负载转移到很小的事件上去;他们只想用Javascript更新DOM的一个片段。AJAX做到了这一点,但如果服务器端的LAMP模板有10%的HTML和90%的Javascript,这么做显然是不对的……

Mike认为,服务器的主要作用就是带着数据(JSON)把应用发送到客户端(Javascript),并让客户端从中构造UI。服务器的次要作用则是监听处理事件的流,并有效地把响应推回客户端,这些事件可能是一次新的编辑、一条消息、或是Ticker发生了变化。

一些人对此发表了评论:

Bruce Atherton赞成Mike的观点,但他认为事件并不会通过HTTP来流转:

Websockets和SPDY将会接管这方面的处理,因为和HTTP相比,它们更合适这个任务。

Chase Sechrist已经在很多地方使用了Node.js,即便如此,他仍然列举了一些对Node.js的担忧:

你还需要知道一些高级知识,比如竞态条件的调试方法、事件循环的工作原理,甚至在递归回调导致栈溢出时,调用堆栈的处理方式。正因为如此,对那些写了二十年C的人、还有刚开始编程的初级工程师来说,控制流还是非常奇怪、令人费解的。

“Jorjun”指出,以现在的变化速度来看,即使Javascript这个新的架构是合理的,它也不会太持久:

两年之内会有一种更高效的方式对宝贵的IP进行编码。需要注意的是,新的方式正在出现,Java对它们没有任何意义——这些方式在九十年代末还没有出现。Javascript的愚蠢名副其实。它有大括号、奇怪的Fudgery、极其恼人的Artefact,对我这样的老学究来说,Javascript看起来轻率、讨厌、太复杂而容易混淆。

NOLOH的联合创始人Asher Snyder认同帖子的前提条件:“Web应该、也正在转向事件。”但并不相信Javascript能引领方向。他认为“我们正在走向一个平台或统一语言的时代,因为只有平台或统一语言才能让快速开发真正处理好Web的疯狂”。

Subbu Allamaraju最近发布了Node.js和Play的一些性能对比数据,InfoQ和他简单讨论了一下:

就个人而言,我发现Node.js和Play等框架让Web开发人员觉得很兴奋,因为它们带来了一些新的思想。在Web框架领域,特别是在Java端,这样的简单性已经很久违了。尤其是Play,它在Netty之上,而不是传统的Servlet框架,是一个很不错的选择。

Web应用架构的演进确实很快。由于Web应用变得越来越“厚重”,特别是在事件驱动的世界里,人们只能思考REST还剩下什么,看来我们要回到最初开始的地方了。最近我们确实没怎么听说有关REST及其统一接口的消息,还有它怎样成功改变Web应用架构的相关内容。你对Web应用架构的未来持什么观点呢?你怎么看Javascript成为主流的编程语言?

 

开始使用NodeJs

 

开始使用node.js

2011-02-13

node.js是由Ryan Dahl编写的服务器端js framework,其初衷是为了编写更为高效的web服务器。它的亮点在于:

  1. 使用当前最快的google v8 js engine
  2. 单线程。因为不需要考虑并发,所以也就没有了锁和阻塞的概念,大大简化编程。
  3. 事件回调模型。所有的异步操作,比如数据库访问都是通过事件触发的。
  4. 完全发挥javascript作为动态解释语言的强大威力。开发人员可以自由的使用一切特性比如closure,并且不需要担心跨浏览器支持(因为是服务端)。

你可能会问单线程怎么处理多用户请求呢?事实上Ryan观察到web访问的一个事实:每次web请求服务周期最耗费时间的往往是IO操作,包括读写文件、数据库操作、开启网络连接访问某个rest api等等。真正web server内部的运算只占很小的比例。比如浏览器访问一个页面,几乎大部分时间都花在IO的读写上了,从读文件一直到向socket写数据,花在页面后端代码的计算量则微乎其微。

举个不很恰当的例子来说明单线程和回调的作用。假设web server是一个银行,每个浏览器的访问相当于客户去窗口取一笔钱。客户在某个窗口办理业务相当于服务器从本地硬盘读写文件。这个操作会花很长时间(相信大家深有体会),由于窗口数有限所以需要一个排队叫号系统就是我们的nodejs线程(相当于apache不过是单线程的)。当窗口有空时营业员就通知排号系统请叫下一位,但是喇叭一次只播放一个叫号的声音,所以所有通知都存放在了一个事件队列中,排号系统报完一个号再处理下一个直到队列空为止,然后就处于idle状态。如果把叫号类比后端代码执行(如.aspx的页面生命周期),他的速度要比处理银行业务快的多,所以只需要一个喇叭就足够了。由于没有多线程的切换消耗,所有计算都作用在了实际的计算上从而提高了处理量。

  1. 视频1  视频2。 作者Ryan亲自讲述node.js的开发哲学,和一些并发问题的探讨。
  2. 实验证明nodejs有着相当不错的速度和并发能力,据说是apache的40倍。实验1  实验2
  3. 关于安装请参考:官方安装  不错的中文介绍。推荐在linux系统下安装。windows安装请看这篇这篇介绍如何将nodejs做成windows service
  4. javascript单线程的介绍
  5. v8快的邪门的秘密
  6. nodejs是一个遵循CommonJs的框架和基础设施,相当于jdk和.net framework。它当然可以胜任web以外的其他编程,比如IO。不过最大的亮点还是web编程。
  7. 已经有大量的nodejs插件。比如类似ror的mvc框架express,支持多种template engines,比较受欢迎的有ejs,jade和haml(nodejs是非常底层的它甚至不封装session和cookie,都留给插件去完成)。示例教程
  8. 淘宝工程师发起的国内nodejs社区

接下来介绍如何用不到40行编写一个显示最新sina微博的server app(假设你已经对js和事件模型非常熟悉)。

首先我们需要导入一些库文件,相当于java的import和.net的using。

1 var http=require('http'),
2     tweets = null,
3     template =
4 '<p>\
5    <em>@user.screen_name</em>\
6    <img src="@user.profile_image_url" />\
7    <span>@text</span>\
8 <p>';

http是nodejs提供的类库。tweets是最新一次提取的sina微博的JSON对象,初始化为null。格式请参考sina api的Statuses/public timeline。

template是我们每行微博的格式包括:名字,头像和内容。@user.screen_name其实是JSON对象的访问路径,下面会介绍如何使用这个trick。

接下来我们设置一个每5秒执行一次的程序,从sina那里访问最新的微博。

01 (function(){
02   http.createClient(80, 'api.t.sina.com.cn')
03       .request('GET''/statuses/public_timeline.json?source=3243248798', {'host':'api.t.sina.com.cn'})
04       .addListener('response'function(response){
05          var result = ''
06          response.addListener('data',function(data){
07             result += data
08          })
09          .addListener('end',function(){
10             tweets = JSON.parse(result)
11          })
12       })
13       .end()
14   setTimeout(arguments.callee, 5000)
15 } )()

这里用匿名方法定义后马上调用,在结束后setTimeout5秒钟再调用自己一次,也可以用setInterval实现,推荐这种方式。

http.createClient创建web client对象用来访问sina的rest api,紧接着调用request生成一个clientrequest对象。之后通过对自己的级联操作添加事件和发起访问,类似jquery的chaining风格。

注意httpClient.response是一个异步事件,通知nodejs微博访问有反应了请处理。从IO读取数据又是事件风格的。data事件是每次读取的批量数据,如果数据量很大会分几次读完。end事件说明全部返回的json都读取完毕,我们就可以将其解析成对象,用到了JSON.parse。

最后需要编写监听端口的服务器,用来处理每次http请求。

01 http.createServer(function(req,res){
02   res.writeHeader(200, {'Content-Type':'text/html; charset=utf-8'})
03   res.write('<!docytype html><html><body>')
04   if(tweets && tweets.length){
05      for(var i = 0; i<tweets.length; i++){       
06         var itm = template.replace(/@([\w\.]+)/g, function(){ returneval('tweets[i].'+arguments[1]) })
07         res.write(itm)
08      }
09   
10   res.end('</body></html>')
11 }).listen(8080)

对就是这么简单。http.createServer创建一个web server对象并监听8080端口。然后又是事件响应,每当有访问,就调用方法生成最终的html,其中传入了req和res(封装了'请求'和'响应'的逻辑)

由于不需要处理什么form或者cookie,request对象几乎没有用武之地。返回响应头200和格式编码。然后是html头。

如果tweets存在,根据之前定义的模板显示每一条微博。这里用到eval来访问json对象,模板中@之后的内容就是对象的路径,拼接以后形如tweets[i].screen_name。最后关闭html结束http response。

结束语:现在迅猛增加的node.js插件证明了它的成功,相信随着更好的调试器和monitoring的出现,nodejs会在web app领域占据重要的位置。相比ruby他速度更快,相比c#,javascript更灵活,并且可以和网页javascript有很好的互动。

分享到:
评论

相关推荐

    nodejs.pdf nodejs初级教程 nodejs初级教程

    nodejs初级教程

    nodejs14.9.0

    nodejs14.9.0

    NodeJS学习笔记和代码

    NodeJS是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程。这个"NodeJS学习笔记和代码"的压缩包显然包含了帮助初学者掌握NodeJS基础知识和实践技能的所有必要资料。 ...

    Idea 配置前端web nodejs项目

    Idea 配置前端 Web Nodejs 项目 Idea 配置前端 Web Nodejs 项目是指在 IntelliJ IDEA 集成开发环境中配置 Nodejs 项目的步骤。下面我们将详细讲解配置的步骤和相关知识点。 Idea 配置 Nodejs 项目 首先,我们需要...

    NodeJS开发指南_nodejs开发指南_

    NodeJS是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者使用JavaScript进行服务器端编程,打破了JavaScript只能在浏览器中运行的传统。本指南将深入探讨NodeJS的核心概念、开发工具、模块系统、网络编程...

    nodejs:NodeJS示例项目

    节点js NodeJS示例项目

    NodeJS中文文档精编.pdf 全文免费

    NodeJS中文文档精编.pdf 全文免费 NodeJS是 JavaScript 运行时环境,可以让 JavaScript 代码在服务器端执行。NodeJS 实际上是对 ES 标准的一个实现,同时 Node 也是一个 JS 引擎。 Node 只对 ES 标准进行了实现,...

    NodeJS整理手册文档

    NodeJS是一种基于Chrome V8引擎的JavaScript运行环境,它允许开发者在服务器端使用JavaScript进行编程,从而打破了JavaScript只能在浏览器中运行的传统。本"NodeJS整理手册文档"旨在为对NodeJS感兴趣的朋友们提供一...

    NodeJs技术经典文档

    资源名称:NodeJs技术经典文档资源目录:【】Node.js开发指南_中文正版【】nodejs开发指南pdf及源码及win安装程序【】nodejs手册中文【】NodeJs教程【】umav4simple【】七天学会NodeJS【】七天学会NodeJS【】深入浅...

    nodejs视频教程百度网盘

    nodejs视频教程,可以快速帮助你入门nodejs开发中,nodejs不错哦

    Nodejs基础知识

    在Nodejs中,http模块是创建Web服务器及处理http相关任务的模块。http.createServer(req,res)通过createServer来创建一个Web服务器,然后通过listen让服务器在某个端口监听请求,这样服务器就在运行状态了。 在...

    nodejs11.zip

    nodejs11安装文件,解决win7操作系统nodeJs环境搭建失败问题:Node.js is only supported on Windows 8.1, Windows Server 2012 R2, or higher

    liunx nodejs+nginx配置收藏版

    liunx nodejs+nginx配置收藏版liunx nodejs+nginx配置收藏版

    NodeJS 安装包

    NodeJS 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它让开发者能够在服务器端使用 JavaScript 进行编程,极大地推动了全栈开发的流行。NodeJS 的设计思想是事件驱动、非阻塞 I/O 模型,这使得它在处理高并发...

    基于nodejs的西餐外卖系统和微信小程序源码

    基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码基于nodejs的西餐外卖系统和微信小程序源码...

    NodeJS示例

    NodeJS 是一个基于 Chrome V8 引擎的 JavaScript 运行环境,它允许开发者在服务器端使用 JavaScript 进行编程,极大地提升了开发效率。在 Windows 环境下配置和使用 NodeJS,主要涉及以下几个步骤: 一、安装 ...

    nodeJs 12.22.12-x64-windows版本

    nodeJs 12.22.12-x64-windows版本 nodeJs 12.22.12-x64-windows版本 nodeJs 12.22.12-x64-windows版本 nodeJs 12.22.12-x64-windows版本 nodeJs 12.22.12-x64-windows版本

    nodeJS学习笔记.html

    nodejs 学习笔记 nodejs 学习笔记 nodejs 学习笔记

    NodeJs思维导图总结

    NodeJs思维导图总结

    NodeJS数据库模型建模工具源码.zip

    NodeJS数据库模型建模工具源码 NodeJS数据库模型建模工具源码 NodeJS数据库模型建模工具源码 NodeJS数据库模型建模工具源码 NodeJS数据库模型建模工具源码 NodeJS数据库模型建模工具源码 NodeJS数据库模型...

Global site tag (gtag.js) - Google Analytics