之前一直听说node.js在处理网站大规模并发上十分有用,所以有一定规模的公司都在使用node。我在工作中只用过jquery,属于那种边做功能边学习的那一种。甚至连原生的js都不太会写,只是知道语法差不多吧。于是诚惶诚恐的购买了一本《node.js权威指南》,先看再说吧,边看边学习语法和一些api,遇到不懂的就直接百度。从这两天学习的进程来说,对于我这个将近两年工作经验的.net程序员来说还不算困难。
本文章将会总结我这两天的学习心得,并在一些地方,比如语法等地方对比C#,使大家更容易去理解,给想学习node.js的人一点帮助,也可以共同学习。
node.js的优势
在常规的后台语言搭建的服务器环境里面,客户端每建立一个链接就得去创建一个新线程。一台8G内存服务器可以同时承担的最大连接数也就4000。所以,当用户数量上去的时候,一台服务器的资源就捉襟见肘了。重构又麻烦伤神,而且也不会有多大的改进,只能来堆硬件了,造成成本的增加。
node.js则修改了客户端到服务器的连接方法,解决了高并发的问题。因为它不去为每个客户端创建一个新的线程,而是为每个客户端连接触发一个在node.js内部进行处理的事件(使我想到了写页面jquery的时候各种事件)。如果使用node.js,可以同时处理多达几万个用户的客户端连接,优势显而易见。
node.js为何能搭建服务器
node.js使用的语言就是javascript,在我看来这个只是运行在浏览器的脚本语言而已,为什么会用它去做一些后台语言的事情?
node.js是一个用于开发各种Web服务器的开发工具。在node.js服务器中,运行的是高性能的V8 Javascript脚本语言,这是一个可以运行在服务器端的Javascript脚本语言。该语言是一种被V8 Javascript引擎所解释并执行的脚本语言。V8 Javascript引擎是由Google使用C++开发的一种高性能Javascript引擎,这个引擎不限于在浏览器中运行。node.js将其用在了服务器中,并且为其添加了许多不同功能的API。最重要的是V8 Javascript引擎使用了一种全新的编译技术,使其有非常高的执行效率,可以说跟C比较接近了。
node.js实现高性能所采用的机制
1.非阻塞型I/O
众所周知,Javascript是单线程的,V8 Javascript也是如此,所以不用担心其争夺资源而造成死锁现象。但与客户端脚本语言不同的是,node.js中为V8 Javascript提供了非阻塞型I/O机制。在传统的单线程处理机制中,在访问数据库的时候,整个线程都处于等待状态,等待数据返回的结果,才能继续执行后面的代码。也就是说I/O操作阻塞了代码的执行,极大的降低了运行效率。由于node.js采用了非阻塞行型I/O机制,因此在执行了访问数据库的代码之后将立即转而其后面的代码,把数据库返回的结果放在了回调函数中运行。
2.事件环
在node.js中,在一个时刻只能执行一个事件的回调函数,但是在执行一个事件回调函数的中途可以转而去处理其他事件。包括触发新的事件、声明该事件的回调函数等。然后返回继续执行原事件的回调函数,这种处理机制成为事件环机制。
node.js的使用背景
上面已经有涉及,当应用程序需要处理大量并发的输入/输出,而在向客户端发出响应之前,应用程序内部并不需要进行非常复杂的处理的时候,我们就应该考虑使用node.js来进行该应用的开发,比如聊天服务器和服务类网站或电子商务网站。
node.js安装
我在这儿就阐述windows下的安装,安装就很简单了,直接上官网https://nodejs.org/下载(家里突然就打不开,就没截图了),基数版本是算是beta版本,偶数版本是稳定版本。下载下来就直接双击打开,点击下一步安装就行了。想看是否安装成功或者是版本,打开cmd命令行工具,输入node -v 就可以查看机器下的node.js版本了。如下图:
node.js的简单实例程序
我在D盘下建立了一个文件夹nodejs,然后在里面新建两个js文件,function.js和entrance.js。
function.js代码如下:
var add=function(a,b){ console.log("a+b=%s",a+b); } exports.add=add;
entrance.js代码如下:
var object=require('./function'); object.add(3,4);
代码很容易理解,在node.js中,文件相当于模块。我的理解是,这一个单独的文件相当于C#里面一个cs文件,一个cs文件里面可以写一个类。然后供其他的类去调用。exports.add=add;的意思是将这个方法暴露给外面,然后entrance.js就可以调用function.js暴露的方法了。这个可以理解,相当于C#里面,public声明的方法,其他没有给exports对象的方法,相当于私有方法。var object=require('./function');相当于C#里面的引用吧。
node.js运行代码
打开命令行工具,默认在C盘某个路径。因为我的代码放在D盘,所以我得先切换到D盘。输入d: 切换到D盘。
执行entrance.js