`
lvwenwen
  • 浏览: 958494 次
  • 性别: Icon_minigender_1
  • 来自: 魔都
社区版块
存档分类
最新评论

关于Node.js

阅读更多

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

 

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 不仅可以是前端工程师和后台开发工程师的有利工具,也可以是两者相互接触了解的一个桥梁。

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

 

 

  • 大小: 9.9 KB
  • 大小: 34.2 KB
分享到:
评论

相关推荐

    Node.js英文书籍2015出版共9本(一次下载)

    Full Stack Javascript - Learn Backbone.js, Node.js and MongoDB (APress 2015).epub Learning Node.js for Mobile Application Development (Packt 2015).pdf Microsoft Press Node.js for .NET Developers (2015...

    Node.js(node-v16.15.1-win-x64.zip)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

    Node.js(node-v16.15.1-win-x86.zip)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

    node.js14.18.3版本下载

    Node.js 是一个开源、跨平台的 JavaScript 运行环境,它允许开发者在服务器端执行 JavaScript 代码。Node.js 使用 V8 引擎,这是 Google 为 Chrome 浏览器开发的高性能 JavaScript 和 WebAssembly 引擎。Node.js 的...

    Node.js开发-Node.js入门.pdf

    Node.js 是一个基于 JavaScript 的服务器端运行平台,允许开发者使用 JavaScript 语言来编写服务器端应用程序。 Node.js 的出现使得 JavaScript 成为服务器端脚本语言。 Node.js 的主要特点是非阻塞 I/O 和事件驱动...

    node.js(v16.16.0) 安装包

    Node.js 是一个开源、跨平台的 JavaScript 运行环境,它让开发者可以在服务器端执行 JavaScript 代码。Node.js 使用了 Google V8 引擎,这个引擎是为 Chrome 浏览器设计的,因此 Node.js 具有高性能和高效性的特点。...

    Node.js(node-v16.15.1.pkg)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

    Node.js-Node.jsforMobileApps是用于Android和iOS的完整版Node.js运行时

    总的来说,这个项目为移动开发者提供了一种新的可能性,即使用熟悉的JavaScript和Node.js工具链开发原生移动应用,这将降低跨平台开发的门槛,提高开发效率,并促进JavaScript生态系统在移动领域的进一步发展。

    Node.js(node-v16.15.1.tar.gz 源码)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

    Node.js官方工具14.17.3版本windows系统x64安装包

    Node.js是一种开源、跨平台的JavaScript运行环境,它允许开发者在服务器端运行JavaScript代码,极大地扩展了JavaScript的应用领域。Node.js基于Chrome V8引擎,因此它具有高性能和高效的特性。标题提到的是Node.js的...

    Node.js(node-v16.15.1-x64.msi)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

    Node.js资料包,5本电子书籍

    这个资料包包含了五本关于Node.js的电子书籍,涵盖了从基础到进阶的各个层面,对于学习和提升Node.js技术能力非常有帮助。 1. 《Node.js Web开发》 这本书全面介绍了使用Node.js构建Web应用程序的方法,包括Express...

    Node.js(node-v16.15.1-linux-arm64.tar.xz)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

    packt Node.JS Cookbook 2nd with source code

    《Node.JS Cookbook 2nd with source code》是由PACKT出版社出版的一本关于Node.js的实战指南,旨在帮助开发者深入理解和高效使用Node.js这一强大的服务器端JavaScript运行环境。本书是第二版,相较于第一版,应该...

    Node.js(node-v21.6.0.tar.xz)

    Node.js是一个基于V8引擎的开源、跨平台的JavaScript运行环境,用于执行JavaScript代码。它允许开发者使用JavaScript编写服务器端应用程序,使得前后端语言统一,提高开发效率。Node.js提供了一个非阻塞I/O模型,使...

    pdf版,Node.js开发实战详解

    Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它让JavaScript开发者可以在服务器端执行代码,打破了传统的JavaScript只能在浏览器端运行的限制。这本《Node.js开发实战详解》电子书,显然是为了帮助那些...

    Node.js(node-v16.15.1-linux-x64.tar.xz)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

    Beginning Node.js

    From this book you will learn how to write maintainable server-side JavaScript using Node.js, how to test your code and deploy it on the internet. Table of Contents Chapter 1: Setting up for Node.js...

    Node.js(node-v16.15.1-aix-ppc64.tar.gz)

    Node.js 应用程序是用 JavaScript 编写的,可以在 Mac OS X、Windows 和 Linux 上的 Node.js 运行时中运行而无需更改。 Node.js 应用程序旨在最大限度地提高吞吐量和效率,使用非阻塞 I/O 和异步事件。Node.js 应用...

Global site tag (gtag.js) - Google Analytics