zoukankan      html  css  js  c++  java
  • Node.js与Golang使用感受与小结【二】

    五、Node.js简介

       Node.js是一个基于谷歌V8引擎的平台,通过利用V8引擎并遵守COMMONJS标准实现了一个高效稳定的平台。Node.jsweb编程是基于数据流的方式,可以直接操控http流,正由于这样的特性,我们可以方便的去定制发送给客户端的数据,同时由于使用了Javascript并且由于它的异步性,更适合于现代应用程序的开发。目前全世界已经有多家公司在使用,著名的用户如linkin,TaoBaoMyspace等。

    六、是前端选择,还是后端的福音?

       Node.js发布之后,在国内外都引起了不小的讨论风暴。甚至国内有很大一批前端工程师认为这个为前端工程师准备的平台,也有一些后端工程师不习惯于Node.js的编程风格。

         Javascript是一门饱受争议的语言,它从设计到投入使用只花了很短的一段时间。它借鉴了很多语言的特性,当然也存在了很多语言有的缺点。由于历史的原因,Javascript早期是没有包的根据,类的话也只是去通过prototype去模拟实现。不过Javascript 却是世界上最为自由的语言之一,你可以天马行空的利用语法糖去模拟你熟悉的语言。一般情况下不建议去模拟其它语言,当你使用什么语言的时候,最好去思想在这门语言中去解决同样的问题会怎么做,而不是用另一种语言的思维去做 Javascript早期似乎成为了前端开发者的必备工具,可随着时代的发展大家发现原来JS也是可以写服务器端程序的。

       事实上,它只是一个高效http服务器的解决方案之一。并非特别的为前端还是后端工程师准备,如果你想,你就可以用。但是是否能用好,就在于你自己。纵观软件发展,我们已经很难以分清什么是前端或后端工程师,以操作系统而言,我们现在都是在应用层上面作开发(有些书中称为用户态模式),那么相对于那些内核工程师,我们是前端还是后端昵?

      

    七、Node.js与传统php-fpm模式之间的对比

         传统PHP的运行模式(非libevent之类的运行方式):

         大部份PHP运行的环境,基本上都会有一个中间件角色的服务器,它负责与PHP的端口进行通信(默认是9000端口),如ApacheNginx都可以作为这样的中间件。当一个http请求从客户端发起后,服务器一般做以下几件事情:

          1、根据用户发送的请求报文,判断是哪种HTTP方法,是POST 还是GET,然后在根据服务器软件的实现进行下一步处理。

          2、判断用户请求的资源是否是静态还是动态脚本,这一步特别是一些nginx之类的中间件会去处理。如果请求的是静态文件,在权限都符合并且资源存在的情况下会直接发送给浏览器,当然有些已经请求过的文件可能会直接返回一个304状态码,这样浏览器就会利用缓存里面的内容给用户。如果是动态文件,那么中间件就会去判断应该怎么去处理。这也是为什么大多数类似于nginx之类的服务器,需要对php之类的脚本在配置文件中进行配置的原因。

         3、如果是php,那么中间件会把请求先转发给php解释器,然后由php解释器运算完成之后,在把结果返回给中间件,中间件在把结果返回给浏览器。中间件在这里作了代理的功能,事实上它做的工作由php通过libevent之类的模块也可以做,但是实现成本过高,所以大部份企业还是选择nginxapache去实现这些基础功能,而把精力用于业务的开发上。

       Node.js的运行模式---基于数据流的现代编程

       对于现代程序开发来说,最为直接的方式便是对于数据流进行直接控制。这样你可以决定哪些东西返回给用户,哪些东西是你需要隐藏的。一个Node.js的应用接到一个http请求之后会做以下事情:

        1、路由器分发处理规则:因为应用本身就是服务器,所以不用转发,不用代理,直接通过自定义的规则去处理请求。

        2、具体业务可以按队列形式处理,也可以按异步形式处理。简单来说,传统的web开发之中,我们需要做一件事情的时候,一般会等待上一个事情做完,然后才会去处理新的事情。但是在node.js中,你可以同时处理多件事情。而且当它们完成后,会将各自的结果返回给用户。

     

      

    (图为以前所做PPT中所截取)

        平台风格

    Node.js

      PHP

    安装方式

    可源码或直接安装二进制安装包

     通过源码编译安装或使用第三方绿色包等

        编程风格

    异步风格且基于数据操作

    同步风格

        处理用户请求方式

    应用本身即是HTTP服务器

    需要借助如Nginx之类的服务器

        扩展安装方式

    npm

    Phpize或在初始安装时配置

        实时运行模式

    每次更改需要重启应用,但是也可以参考JavaPlay框架去热加载,但是会影响性能。因为热加载的一般原因是实时对文件改动进行监控。

    修改文件后直接保存,即时生效,但程序会每次去读取新的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异步流程控制,这一部份中文资料较少,而现在业内据我所知大多是用AsyncJSstep之类的node库来实现,并不是说他们的实现不好,而是中间的原理需要搞懂才能掌握某些被认为的关键技术。

    未来完,,,待续

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

    关于作者:

    网名:念念之间    现居:深圳

    Email:jinfei121@qq.com

    QQ:490821193

      从03年开始玩论坛,但正式写代码是前几年的事情。刚工作前两主要写php程序,目前主要专职写

    Javascript.平时喜欢研究各种新鲜技术~~ 

      Node与Golang的粉丝~~

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

    作者:念念之间 智慧星球群号:281151953
  • 相关阅读:
    Python 多线程,文件io
    Python map/reduce函数式编程
    LeetCode 77 组合
    LeetCode 198 打家劫舍
    LeetCode 138 复制带随机指针的链表
    LeetCode 445 两数相加 II
    LeetCode 2 两数相加
    LeetCode 215 数组中的第K个最大元素
    和为S的两个数字
    数组中重复的数字
  • 原文地址:https://www.cnblogs.com/tdyz/p/3116932.html
Copyright © 2011-2022 走看看