关于Node.js

标签: node js | 发表时间:2013-01-23 23:04 | 作者:
出处:http://www.iteye.com

 

 

阅读说明:本文借鉴了后文末尾列出的学习资料的相关内容,鼠标指上某些文本会有一些提示。分享促进进步~

 

1 概述

1.1 定义

        Node.js 官方网站给出了如下定义:

Node.js is a platform built on Chrome's JavaScript runtime for easily  building fastscalable network applications. Node.js uses an  event-drivennon-blocking I/O model that makes it  lightweight and  efficient, perfect for  data-intensive real-time applications that run across  distributed devices.

       Node.js 是建立在 Chrome 的 JavaScript 运行时环境上的平台,目标是为能够简单地构建快速、可扩展的网络应用程序。 Node.js 利用事件驱动、非阻塞 I/O 模型的特点使得它能够轻量级、高效并且完美地应对分布式设备上运行的数据密集型实时应用程序。

1.2 特点

Node.js 最为关键的三个特点:

  • 非阻塞 I/O
  • 事件驱动
  • 单线程

1.2.1 非阻塞 I/O

       我们知道在操作系统中,程序运行的空间分为内核空间和用户空间。非阻塞 I/O 的实质是用户空间中的程序不用依赖内核空间中的 I/O 操作实际完成,就可以进行后续操作。

       关于阻塞 I/O 和非阻塞 I/O 的伪代码说明:

 

   // 阻塞 I/O
result = db.query('select * from user');
print(result);
print('next statement');

// 非阻塞 I/O
db.query('select * from user', function(result){
    print(result);
});
print('next statement');

       非阻塞 I/O 在分布式环境中非常重要,这也是为什么有很多云计算厂商对 Node.js 青睐的根本原因。(参见  3 企业级应用

1.2.2 事件驱动

       事件驱动是 Node.js 的核心设计思想,Node.js 提供的绝大多数 API 都是基于事件的、异步的风格。

       关于事件驱动的代码片段说明:

 

   request.on('connect', function(res, socket, head){
    var allData = '';
    socket.on('data', function(chunk){
        allData += chunk.toString();
    });
    socket.on('end', function(){
        console.log(allData);
    })
});

       磁盘 I/O 、网络通信、数据库查询等操作都会产生相对应的事件,可以将事件绑定上需要处理的回调函数。

 

       Node.js 的 libev 会不断检查是否有活动的、可供检测的事件监听器,直到检测不到时才退出事件循环。Node.js 凭借事件驱动搞定大规模的 http 请求。

       编程风格?瓶颈?

1.2.3 单线程

       Node.js 进程在同一时刻只会处理一个事件,完成后立即进入事件循环检查并处理后面的事件。Node.js 通过内部单线程高效率地维护事件循环队列来实现的,没有多线程的资源占用和上下文切换。

       单线程单进程的方案(和 JavaScript 的运行方式一致)显然不能充分利用上多核CPU硬件。创始人Ryan Dahl建议,运行多个Node.js进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布。

       我们可以看看国内工程师 Snoopyxd 做的一次 Node.js 与 PHP 的性能对比测试: http://snoopyxdy.blog.163.com/blog/static/60117440201183101319257/

1.3 发展历史

       Node.js 最初是由 Ryan Dahl 发起的开源项目,后来被 Joyent 公司(云计算服务商)注意到:Joyent 公司将 Ryan Dahl 招入旗下, Node.js 也交由 Joyent 公司管理并维护。尽管 Node.js 诞生的时间(2009年)还不长, 在2011年 Node.js 在 github 的访问量就已经超越了 Rails,并且在它的周围形成了一个庞大的生态系统。Node.js 第一个企业级应用是由 VMware 公司建立的云计算平台 Cloud Foundry。

2 架构

       我们知道使用 C/C++ 可以编写网络相关的 Server,前端工程师通常所说的在 Node.js 里可以用 JavaScript 编写 Server ,实际上调用的就是 C/C++ 封装好的接口。实际上最快的 JavaScript 引擎—— V8 也是用 C++ 编写的。


       Libeio 和 Libev 分别支持的是 Linux 、 Unix 、 Mac 等 POSIX 的异步式 I/O 和事件触发, IOCP 是 Windows 下的相关库, Libuv 对以上三者进行了一层封装。

2.1 核心API

      见名知意,了解 Node.js 的开发者的关注点:

  • Assertion Testing
  • Buffer
  • C/C++ Addons
  • Child Processes
  • Cluster
  • Crypto
  • Debugger
  • DNS
  • Domain
  • Events
  • File System
  • Globals
  • HTTP
  • HTTPS
  • Modules
  • Net
  • OS
  • Path
  • Process
  • Punycode
  • Query Strings
  • Readline
  • REPL
  • STDIO
  • Stream
  • String Decoder
  • Timers
  • TLS/SSL
  • TTY
  • UDP/Datagram
  • URL
  • Utilities
  • VM
  • ZLIB

2.2 第三方模块

       Node.js 有着强大而灵活的包管理器( node package manager ,  npm ),目前已经有20000+个第三方模块。其中有网站开发框架,有 MySQL、PostgreSQL、MongoDB 数据库接口,有模板语言解析、CSS 生成工具、邮件、加密、图形、调试支持,甚至还有图形用户界面和操作系统 API 工具。

3 企业级应用

3.1 LinkedIn

       LinkedIn 是全球最大的职业社交网站(用户两亿以上)。其采用 Node 替代 Rails:减少了27台服务器,速度提升20倍。其移动开发主管Kiran Prasad如是说:

        LinkedIn内部使用了大量的技术,但是在移动服务器这一块,我们完全基于Node。

      (使用它的原因)第一,是因为其 灵活性。第二,如果你了解Node,就会发现它最擅长的事情是 与其他服务通信。移动应用必须与我们的平台API和数据库交互。我们没有做太多数据分析。相比之前采用的Ruby on Rails技术,开发团队发现Node在性能方面提高很多。他们在每台物理机上跑了15个虚拟服务器(15个实例),其中4个实例即可处理双倍流量。容量评估基于负载测试的结果。

3.2 Node Club

       Node Club是用 Node.js 和 MongoDB 开发的新型社区软件,界面优雅,功能丰富,小巧迅速, 已在 Node.js 中文技术社区——  CNode 得到应用,但你完全可以用它搭建自己的社区。

3.3 Trello

       Trello是团队流程协作和列表管理平台。

       以下是 Trello 核心看开发者对 nodejs 的评论:

       服务器端我们使用 Node.js 。我们知道我们需要将 client 端的更新即时传播出去。 这就意味着我们需要 保持大量连接。因此,我们需要寻找一个事件驱动且无阻塞服务器。同时, Node 对于单页面应用也是个非常好的原型设计工具。最开始的 Trello Server基本上就是一个包含了一些函数的库。它们运行在一个单个的 Node.js 进程里,操作在内存中的一组 Model 对象。同时,客户端通过一个非 常轻的 WebSocket 封装接口可以直接调用这些函数。这让我们做 demo 的速度非常快,并且可以保证我们始终工作在正确的方向上。我们开始使用还在原 型中 Trello 去管理 Trello 和 Frog Creek 里其他项目的开发。

       当我们完成原型之后,我们已经可以熟练的使用 Node 了。使用 Node 写程序的过程非常欢乐,而且我们也非常满意它的功能与性能。唔,是时候将 Trello 变成一个真正意义上的应用了。为了做到这一点,我们需要:

  • 一个真实 DB 和 Schema
  • 一个基本的 server, 支持分发和 cookie.
  • 多个服务器进程与零宕机重启
  • 通过 Redis 实现进程间 pubsub 和结构化数据的共享

       Node 非常棒。同时,因为有活跃的开发社区大量推出新鲜实用的库, Node 将变得越来越好。我们使用了一个非常棒的异步库( async library ) 来保证我们的代码可控。

3.4 淘宝

       淘宝是国内企业使用 Node.js 的主力,

  • http://cnodejs.org 就是淘宝程序猿志愿搭建的国内最大的Node.js社区。
  • 淘宝前端应用框架也有对应的 node 版本 nodejs-kissy
  • 淘宝建设有 mysql 分布式集群的查询系统 node-myfox 。

       node-myfox 是一个数据处理中间件,负责从一个MySQL集群中提取数据、计算并输出统计结果。用户提交一段SQL语句,node-myfox 根据该 SQL 命令的语义,生成各个数据库分片所需要执行的查询语句,并发送至各个分片,再将结果进行汇总和计算。 node-myfox 的特点是 CPU 密集,无文件 IO ,并只处理只读数据。node-myfox 应用于  淘宝指数 中。

3.5 Microsoft

       微软也在 Node.js 上大作文章,Windows Azure(基于云计算的操作系统) 、 Skype 都在利用 Node.js 为其服务。

       一向不喜欢开源软件微软与开源社区开展合作,建立一个 Node.js 的核心团队,为 Windows 打造 Node.js (2011年7月Node.js在微软的支持下发布Windows版本),并且在积极招聘全职的 Node.js 程序员。

       

       ... ...(游戏服务器、静态文件分发器)

4 动手实践

4.1 安装

       Windows、*nix 以及 Mac OS X等都支持 Node.js,

  • Windows下安装Node.js非常简单,直接从官网上( http://nodejs.org/download/)下载安装 .msi 文件即可。
  • Linux下的安装依赖于C++编译器、Python_V[2.6,3.0)、libssl-dev。Ubuntu 下 直接输入  sudo apt-get install nodejs 命令即可完成安装。
  • 无Mac,无真像。

       Node.js的安装都会附带着安装包管理器 —— npm ,利用 npm 可以安装第三方包。

 

npm install [-g] xxxxx

4.2 Hello World

       直接进入第一个 Demo(由 Node.js 官网提供),Programing 领域中著名的 Hello World 程序:

 

   var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n');
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/'); 

       将以上代码保存为 demo.js,开启命令终端输入:node demo.js,然后在浏览器中输入:http://127.0.0.1:1337/,你就完成了所谓的 Javascript 编写 WebServer 的整个过程。

4.3 文件管理器

现在我们要进一步深入,做一个带有实质功能的 Web 程序。该文件管理应用程序的功能点包括: Linux 操作系统下的文件列表展示、下载查看文件以及删除文件。

       代码明天附上。

       编写 Web 应用的缺点?

4.4 微博

       绝大多数的 Web 程序是离不开数据库的。在这个微博项目里我们要较多的利用第三方包,包括 Web 框架 Express 、数据库 MongoDB以及ejs模版等。同时将前端框架 Bootstrap 整合进来减少开发量。

       代码明天附上。

5 其他

5.1 待深入

       Node.js 还有很多需要去学习和考虑的领域:

  • CommonJS 规范
  • Node.js 调试
  • 编写模块和发布包
  • 与其它 Server 的性能测试对比
  • 后台工程师利用其进行云计算

5.2 学习资料

  • 官方网站 —— http://nodejs.org
  • CNode社区 —— http://cnodejs.org
  • 深入浅出 Node.js 系列 —— InfoQ
  • 《Node.js开发指南》

5.3 结束语

       Node.js 不仅可以是前端工程师和后台开发工程师的有利工具,也可以是两者相互接触了解的一个桥梁。

       路漫漫其修远兮,吾将上下而求索!

 

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [node js] 推荐:

node js 断点调试

- - Web前端 - ITeye博客
大部分基于 Node.js 的应用都是运行在浏览器中的,. 例如强大的调试工具 node-inspector. node-inspector 是一个完全基于 Node.js 的开源在线调试工具,提供了强大的调试功能和友好. 的用户界面,它的使用方法十分简便. 首先,使用 npm install -g node-inspector 命令安装 node-inspector,然后在终.

什么是Node?

- We_Get - 博客园新闻频道
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料.   译文全文:http://jayli.github.com/whatisnode/index.html.   作者:Brett McLaughlin ,原文:What is Node?.

Node入门

- - CSDN博客编程语言推荐文章
作者:  Manuel Kiessling. 翻译:  goddyzhao &  GrayZhang &  MondayChen. 本书致力于教会你如何用Node.js来开发应用,过程中会传授你所有所需的“高级”JavaScript知识. 本书绝不是一本“Hello World”的教程. 你正在阅读的已经是本书的最终版.

浅析Hadoop Secondary NameNode,CheckPoint Node,Backup Node

- - CSDN博客云计算推荐文章
Hadoop SecondaryNameNode并不是Hadoop 第二个NameNode,它不提供NameNode服务,而仅仅是NameNode的一个工具. 这个工具帮助NameNode管理Metadata数据. NameNode的HDFS文件信息(即Metadata)记录在内存中,client的文件写操作直接修改内存中的Metadata,同时也会记录到硬盘的Edits文件,这是一个Log文件.

[译]什么是Node?

- blacktulip - Taobao UED Team
译者按:前不久Oreilly出了一本小册子“What is Node?”,扼要的讲解了Node的身世和所适用的场景,作者文笔轻松流畅、内容充实,是非常难得的学习资料. 译文全文:http://jayli.github.com/whatisnode/index.html. 作者:Brett McLaughlin ,原文:What is Node?.

用node作桌面开发

- InterMa - CNode社区
node的定位是,server-side javascript. 但程序员最爱做的事,就是把一个东西用在不该用的地方. 那么,可以把node用在桌面开发上吗. 把Javascript用在桌面开发上,早有先例,比如GTK+的gjs,还有Qt的QML(顺带一提,QML代表着桌面开发的另一个方向,a promising way),GNOME3中,也用javascript作为桌面插件的开发语言.

Vercel 部署 Node 服务

- - 掘金 前端
之前在写 面试常客:HTTP 缓存时,曾经就强缓存和协商缓存写过两个demo,但缓存要在服务端做,只能贴上代码,不能在网页上感受(虽然我贴了gif). 笔者的所有 demo 例子都放在 github page 上,其特点是不需要服务器即可部署静态资源,但它不具备部署服务端应用能力. 最近笔者在了解 CI/CD 方面的知识点,想起了 Vercel,就想着能否将服务端应用架在 vercel 上呢.

WebView JS 交互

- - ITeye博客
WebView加jquery做页面会怎么样呢. // 创建WebView对象. // 把programList添加到js的全局对象window中,. // 这样就可以使用window.programList来获取数据. * 定义js回调java函数. // 绑定键盘的向上,向下按钮事件触发相应的js事件.

無痛安裝 NodeJS 和 Node Framework Express

- Hming - 小惡魔 - 電腦技術 - 工作筆記 - AppleBOY
直接到官網下載 Stable 的版本吧,目前是 node-v0.4.10.tar.gz,也可以先看看 API Document. 安裝 Ububtu 相關套件. 下面會使用最原始的編譯方式,所以必須安裝 g++ 套件,否則下 ./configure 的時候,會吐出來沒有安裝過的套件. 兩種方法:1.用 apt-get install nodejs 2.