Node.js与Golang使用感受与小结【二】
发布于 11 年前 作者 niannian2013 22174 次浏览 最后一次编辑是 8 年前

五、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的粉丝~~

==========================================================

2 回复

标题党。内容和 Golang 一点关系也没有。

帅哥 ,是分开来写的。不是一次写完

回到顶部