设为首页 收藏本站
查看: 754|回复: 0

[经验分享] node.js初体验

[复制链接]

尚未签到

发表于 2017-2-23 08:39:45 | 显示全部楼层 |阅读模式

  node.js是由Ryan Dahl编写的服务器端js framework,其初衷是为了编写更为高效的web服务器。它的亮点在于
  1. 使用当前最快的google v8 js engine
  2. 单线程。因为不需要考虑并发,所以也就没有了锁和阻塞的概念,大大简化编程。
  3. 事件回调模型。所有的异步操作,比如数据库访问都是通过事件触发的。
  4. 完全发挥javascript作为动态解释语言的强大威力。开发人员可以自由的使用一切特性比如closure,并且不需要担心跨浏览器支持(因为是服务端)
  你可能会问单线程怎么处理多用户请求呢?事实上Ryan观察到web访问的一个事实:每次web请求服务周期最耗费时间的往往是IO操作,包括读写文件、数据库操作、开启网络连接访问某个rest api等等。真正web server内部的运算只占很小的比例。比如浏览器访问一个页面,几乎大部分时间都花在IO的读写上了,从读文件一直到向socket写数据,花在页面后端代码的计算量则微乎其微。
  举个不很恰当的例子来说明单线程和回调的作用。假设web server是一个银行,每个浏览器的访问相当于客户去窗口取一笔钱。客户在某个窗口办理业务相当于服务器从本地硬盘读写文件。这个操作会花很长时间(相信大家深有体会),由于窗口数有限所以需要一个排队叫号系统就是我们的nodejs线程(相当于apache不过是单线程的)。当窗口有空时营业员就通知排号系统请叫下一位,但是喇叭一次只播放一个叫号的声音,所以所有通知都存放在了一个事件队列中,排号系统报完一个号再处理下一个直到队列空为止,然后就处于idle状态。如果把叫号类比后端代码执行(如.aspx的页面生命周期),他的速度要比处理银行业务快的多,所以只需要一个喇叭就足够了。由于没有多线程的切换消耗,所有计算都作用在了实际的计算上从而提高了处理量。


  • 视频1  视频2。 作者Ryan亲自讲述node.js的开发哲学,和一些并发问题的探讨。
  • 实验证明nodejs有着相当不错的速度和并发能力,据说是apache的40倍。实验1  实验2
  • 关于安装请参考:官方安装  不错的中文介绍。推荐在linux系统下安装。windows安装请看这篇。这篇介绍如何将nodejs做成windows service
  • javascript单线程的介绍
  • v8快的邪门的秘密
  • nodejs是一个遵循CommonJs的框架和基础设施,相当于jdk和.net framework。它当然可以胜任web以外的其他编程,比如IO。不过最大的亮点还是web编程。
  • 已经有大量的nodejs插件。比如类似ror的mvc框架express,支持多种template engines,比较受欢迎的有ejs,jade和haml(nodejs是非常底层的它甚至不封装session和cookie,都留给插件去完成)。示例教程
  • 淘宝工程师发起的国内nodejs社区
  接下来介绍如何用不到40行编写一个显示最新sina微博的server app(假设你已经对js和事件模型非常熟悉)
  首先我们需要导入一些库文件,相当于java的import和.net的using。




var http=require('http'),
    tweets = null,
    template =
'<p>\
   <em>@user.screen_name</em>\
   <img src="@user.profile_image_url" />\
   <span>@text</span>\
<p>';
  http是nodejs提供的类库
  tweets是最新一次提取的sina微博的JSON对象,初始化为null。格式请参考sina api的Statuses/public timeline。
  template是我们每行微博的格式包括:名字,头像和内容。@user.screen_name其实是JSON对象的访问路径,下面会介绍如何使用这个trick。
  接下来我们设置一个每5秒执行一次的程序,从sina那里访问最新的微博。




(function(){
  http.createClient(80, 'api.t.sina.com.cn')
      .request('GET', '/statuses/public_timeline.json?source=3243248798', {'host': 'api.t.sina.com.cn'})
      .addListener('response', function(response){
         var result = ''
         response.addListener('data',function(data){
            result += data
         })
         .addListener('end',function(){
            tweets = JSON.parse(result)
         })
      })
      .end()
  setTimeout(arguments.callee, 5000)
} )()
  这里用匿名方法定义后马上调用,在结束后setTimeout5秒钟再调用自己一次,也可以用setInterval实现,推荐这种方式。
  http.createClient创建web client对象用来访问sina的rest api,紧接着调用request生成一个clientrequest对象。之后通过对自己的级联操作添加事件和发起访问,类似jquery的chaining风格。
  注意httpClient.response是一个异步事件,通知nodejs微博访问有反应了请处理。
  从IO读取数据又是事件风格的。data事件是每次读取的批量数据,如果数据量很大会分几次读完。end事件说明全部返回的json都读取完毕,我们就可以将其解析成对象,用到了JSON.parse。
  最后需要编写监听端口的服务器,用来处理每次http请求。




http.createServer(function(req,res){
  res.writeHeader(200, {'Content-Type':'text/html; charset=utf-8'})
  res.write('<!docytype html><html><body>')
  if(tweets && tweets.length){
     for(var i = 0; i<tweets.length; i++){        
        var itm = template.replace(/@([\w\.]+)/g, function(){ return eval('tweets.'+arguments[1]) })
        res.write(itm)
     }
  }  
  res.end('</body></html>')
}).listen(8080)
  对就是这么简单。
  http.createServer创建一个web server对象并监听8080端口。然后又是事件响应,每当有访问,就调用方法生成最终的html,其中传入了req和res(封装了‘请求’和‘响应’的逻辑)
  由于不需要处理什么form或者cookie,request对象几乎没有用武之地。
  返回响应头200和格式编码。
  然后是html头。
  如果tweets存在,根据之前定义的模板显示每一条微博。这里用到eval来访问json对象,模板中@之后的内容就是对象的路径,拼接以后形如tweets.screen_name。
  最后关闭html结束http response。
  结束语:现在迅猛增加的node.js插件证明了它的成功,相信随着更好的调试器和monitoring的出现,nodejs会在web app领域占据重要的位置。相比ruby他速度更快,相比c#,javascript更灵活,并且可以和网页javascript有很好的互动。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-345896-1-1.html 上篇帖子: 可以考虑使用SublimeText编辑器替代notepad++了 下篇帖子: Electron安装
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表