`
tjuking
  • 浏览: 193601 次
  • 性别: 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
4
0
分享到:
评论
1 楼 lvwenwen 2013-01-24  
good, learn from it,thanks

相关推荐

    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.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-v16.15.1.tar.gz 源码)

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

    Node.js Design Patterns Second Edition[July 2016]

    It also introduces the reader to some emerging design patterns that are specific only to JavaScript and Node.js. Chapter 7, Wiring Modules, analyzes the different solutions for linking the modules of...

    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 应用...

    Node.js.for.Embedded.Systems

    By bringing accessibility to embedded components such as sensors and microcontrollers, JavaScript and Node.js might shape the world of physical computing as they did for web browsers. This practical ...

    Node.js+MySQL开发的B2C商城系统源码(微信小程序端).zip

    Node.js+MySQL开发的B2C商城系统源码(微信小程序端)。Node.js+MySQL开发的B2C商城系统源码(微信小程序端)。Node.js+MySQL开发的B2C商城系统源码(微信小程序端)。Node.js+MySQL开发的B2C商城系统源码(微信小...

    node.js14.18.3版本下载

    node.js14.18.3安装包下载

    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(v16.16.0) 安装包

    node.js(v16.16.0) 安装包

    Node.js高级编程.pdf

    Node.js是一种主流框架,它允许你使用JavaScript快速构建具有高度可伸缩性的网络程序。可是,它有自己的学习曲线,这本较为深入的指南性图书首先介绍了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 应用...

    Node.js开发实战详解源代码

    书由浅入深,全面、系统地介绍了Node.js开发技术。书中提供了大量有针对性的实例,供读者实践学习,同时提供了大量的实践练习题及详尽的解答,帮助读者进一步巩固和提高。本书重在代码实践,阅读时应多注重实践编程...

    Node.js 开发指南.pdf

    第1章 Node.js简介 1 1.1 Node.js是什么 2 1.2 Node.js能做什么 3 1.3 异步式I/O与事件驱动 4 1.4 Node.js的性能 5 1.4.1 Node.js架构简介 5 1.4.2 Node.js与PHP+Nginx 6 1.5 JavaScript简史 6 ...

    Node.js Javascript运行环境(runtime environment)

    Node.js是一个Javascript运行环境(runtime environment),发布于2009年5月,由Ryan Dahl开发,实质是对Chrome V8引擎进行了封装。Node.js对一些特殊用例进行优化,提供替代的API,使得V8在非浏览器环境下运行得更好...

    Node.js.By.Example.1784395714.epub

    If you are a JavaScript developer with no experience with Node.js or server-side web development, this book is for you. It will lead you through creating a fairly complex social network. You will ...

    [Node.js] Node.js 开发者指南 (英文版)

    Since it’s creation in 2009, Node.js has grown into a powerful and increasingly popular asynchronous-development framework for creating highly-scalable network applications using JavaScript....

    Server Side development with Node.js and Koa.js

    Modern versions of JavaScript have made this possible in Node.js, and Koa is a Node.js framework that makes it easy. This book is the ideal introduction for JavaScript developers who want to create ...

Global site tag (gtag.js) - Google Analytics