Node.js与Golang使用感受与小结【二】
五、Node.js简介
Node.js是一个基于谷歌V8引擎的平台,通过利用V8引擎并遵守COMMONJS标准实现了一个高效稳定的平台。Node.js做web编程是基于数据流的方式,可以直接操控http流,正由于这样的特性,我们可以方便的去定制发送给客户端的数据,同时由于使用了Javascript并且由于它的异步性,更适合于现代应用程序的开发。目前全世界已经有多家公司在使用,著名的用户如linkin,TaoBao,Myspace等。
六、是前端选择,还是后端的福音?
Node.js发布之后,在国内外都引起了不小的讨论风暴。甚至国内有很大一批前端工程师认为这个为前端工程师准备的平台,也有一些后端工程师不习惯于Node.js的编程风格。
Javascript是一门饱受争议的语言,它从设计到投入使用只花了很短的一段时间。它借鉴了很多语言的特性,当然也存在了很多语言有的缺点。由于历史的原因,Javascript早期是没有包的根据,类的话也只是去通过prototype去模拟实现。不过Javascript 却是世界上最为自由的语言之一,你可以天马行空的利用语法糖去模拟你熟悉的语言。一般情况下不建议去模拟其它语言,当你使用什么语言的时候,最好去思想在这门语言中去解决同样的问题会怎么做,而不是用另一种语言的思维去做 Javascript早期似乎成为了前端开发者的必备工具,可随着时代的发展大家发现原来JS也是可以写服务器端程序的。
事实上,它只是一个高效http服务器的解决方案之一。并非特别的为前端还是后端工程师准备,如果你想,你就可以用。但是是否能用好,就在于你自己。纵观软件发展,我们已经很难以分清什么是前端或后端工程师,以操作系统而言,我们现在都是在应用层上面作开发(有些书中称为用户态模式),那么相对于那些内核工程师,我们是前端还是后端昵?
七、Node.js与传统php-fpm模式之间的对比
传统PHP的运行模式(非libevent之类的运行方式):
大部份PHP运行的环境,基本上都会有一个中间件角色的服务器,它负责与PHP的端口进行通信(默认是9000端口),如Apache、Nginx都可以作为这样的中间件。当一个http请求从客户端发起后,服务器一般做以下几件事情:
1、根据用户发送的请求报文,判断是哪种HTTP方法,是POST 还是GET,然后在根据服务器软件的实现进行下一步处理。
2、判断用户请求的资源是否是静态还是动态脚本,这一步特别是一些nginx之类的中间件会去处理。如果请求的是静态文件,在权限都符合并且资源存在的情况下会直接发送给浏览器,当然有些已经请求过的文件可能会直接返回一个304状态码,这样浏览器就会利用缓存里面的内容给用户。如果是动态文件,那么中间件就会去判断应该怎么去处理。这也是为什么大多数类似于nginx之类的服务器,需要对php之类的脚本在配置文件中进行配置的原因。
3、如果是php,那么中间件会把请求先转发给php解释器,然后由php解释器运算完成之后,在把结果返回给中间件,中间件在把结果返回给浏览器。中间件在这里作了代理的功能,事实上它做的工作由php通过libevent之类的模块也可以做,但是实现成本过高,所以大部份企业还是选择nginx或apache去实现这些基础功能,而把精力用于业务的开发上。
Node.js的运行模式---基于数据流的现代编程
对于现代程序开发来说,最为直接的方式便是对于数据流进行直接控制。这样你可以决定哪些东西返回给用户,哪些东西是你需要隐藏的。一个Node.js的应用接到一个http请求之后会做以下事情:
1、路由器分发处理规则:因为应用本身就是服务器,所以不用转发,不用代理,直接通过自定义的规则去处理请求。
2、具体业务可以按队列形式处理,也可以按异步形式处理。简单来说,传统的web开发之中,我们需要做一件事情的时候,一般会等待上一个事情做完,然后才会去处理新的事情。但是在node.js中,你可以同时处理多件事情。而且当它们完成后,会将各自的结果返回给用户。
(图为以前所做PPT中所截取)
平台风格 |
Node.js |
PHP |
安装方式 |
可源码或直接安装二进制安装包 |
通过源码编译安装或使用第三方绿色包等 |
编程风格 |
异步风格且基于数据操作 |
同步风格 |
处理用户请求方式 |
应用本身即是HTTP服务器 |
需要借助如Nginx之类的服务器 |
扩展安装方式 |
npm |
Phpize或在初始安装时配置 |
实时运行模式 |
每次更改需要重启应用,但是也可以参考Java中Play框架去热加载,但是会影响性能。因为热加载的一般原因是实时对文件改动进行监控。 |
修改文件后直接保存,即时生效,但程序会每次去读取新的php文件,有一定的I/O损耗。 |
语言规则 |
类C风格 |
类C风格 |
性能对比 |
----请自行使用http_load之类工具对比 |
----请自行使用http_load之类工具对比 |
八、安装Node.js
先登录 http://nodejs.org/download/ 然后下载适合你的平台版本,建议初学者下载二进制安装包,但熟悉之后还是用源码方式编译安装好。编译安装的好处在于,编译器会根据用户所工作的平台环境进行优化。
假设我们此时下载了二进制包,那么
一路Next下去就可以了。
要检测是否安装成功,在你的控制台中输入 node -v (windows用户可以在开始菜单中的运行中输入cmd进行,由于文章在windows平台写的,以windows版本为例)
九、让浏览器读懂你的心--Content-Type
写Node.js程序,你只需要一个编辑器,一个运行环境就好~
var http = require(‘http’);
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': "text/plain; charset=utf-8"});
res.write('世界你好~!\n');
res.end();
}).listen(3000, '127.0.0.1');
console.log('Server running at http://127.0.0.1:3000/');
将里面的代码内容保存为hello.js,然后通过控制台运行 node <你保存的目录>/hello.js 。做完这一切之后,打开你的浏览器输入http://127.0.0.1:3000 按下回车看看效果吧。
通过这个DEMO,你应该能看到一个简单的http服务器的成功产生了吧。当然要做一个功能齐全的服务器还有很多东西需要做,这里只是一个简单的DEMO.在这个DEMO中,大家应该会发现Content-Type这个东东,前面讲进Content-Type这个东东是告诉浏览器要做些什么事情。比如有的时候你发给用户的是不是文本文件而是视频或是图片,那么就需要告诉浏览器调用系统的某些程序来运行或是显示它。
十、向浏览器发送文件
还是先上代码吧,一切以代码为先。
var server,
ip = "127.0.0.1", port = 3000,http = require('http'), fs = require("fs"), folderPath = "static",//存放文件夹
url = require('url'),
path=require('path'),
urlpath,//请求路径
filePath;//文件路径
var types = {
"css": "text/css",
"gif": "image/gif",
"html": "text/html",
"ico": "image/x-icon",
"jpeg": "image/jpeg",
"jpg": "image/jpeg",
"js": "text/javascript",
"png": "image/png",
"tiff": "image/tiff",
"txt": "text/plain"
};
server = http.createServer(function (req, res) {
urlpath = url.parse(req.url);
filePath = folderPath + urlpath.pathname;
var content_type= types[path.extname(urlpath.pathname).substr(1)]||'text/plain';
fs.readFile(filePath, function(err, file) {
if (err) {
res.writeHead(404, {'Content-Type': 'text/plain'});
res.end();
return;
}
res.writeHead(200, {'Content-Type': content_type});
res.write(file);
res.end();
});
});
server.listen(port, ip);
console.log("Server running at http://" + ip + ":" + port);
发送文件当然存在读取的文件的这一过程,所以需要用到fs包。这个DEMO应该比较简单,只要你有前面的基础,相信很快能明白这个DEMO的意图。这一部份不打算具体说明,因为已经有很多前期的说明,而且网络上也有很多文章,我们着重需要讲的是Node.js异步流程控制,这一部份中文资料较少,而现在业内据我所知大多是用AsyncJS或step之类的node库来实现,并不是说他们的实现不好,而是中间的原理需要搞懂才能掌握某些被认为的关键技术。
未来完,,,待续
==========================================================
关于作者:
网名:念念之间 现居:深圳
Email:jinfei121@qq.com
QQ:490821193
从03年开始玩论坛,但正式写代码是前几年的事情。刚工作前两主要写php程序,目前主要专职写
Javascript.平时喜欢研究各种新鲜技术~~
Node与Golang的粉丝~~
==========================================================