Nodejs介绍

1.javascript

  浏览器给网站发请求的过程一直没怎么变过。当浏览器给网站发了请求。服务器收到了请求,而后开始搜寻被请求的资源。若是有须要,服务器还会查询一下数据库,最后把响应结果传回浏览器。不过,在传统的web服务器中(好比Apache),每个请求都会让服务器建立一个新的进程来处理这个请求。html

  后来有了Ajax。有了Ajax,咱们就不用每次都请求一个完整的新页面了,取而代之的是,每次只请求须要的部分页面信息就能够了。这显然是一个进步。可是好比你要建一个FriendFeed这样的社交网站(相似人人网那样的刷朋友新鲜事的网站),你的好友会随时的推送新的状态,而后你的新鲜事会实时自动刷新。要达成这个需求,咱们须要让用户一直与服务器保持一个有效链接目前最简单的实现方法,就是让用户和服务器之间保持长轮询(long polling)。前端

  HTTP请求不是持续的链接,你请求一次,服务器响应一次,而后就完了长轮训是一种利用HTTP模拟持续链接的技巧。具体来讲,只要页面载入了,无论你需不须要服务器给你响应信息,你都会给服务器发一个Ajax请求。这个请求不一样于通常的Ajax请求,服务器不会直接给你返回信息,而是它要等着,直到服务器以为该给你发信息了,它才会响应。好比,你的好友发了一条新鲜事,服务器就会把这个新鲜事当作响应发给你的浏览器,而后你的浏览器就刷新页面了。浏览器收到响应刷新完以后,再发送一条新的请求给服务器,这个请求依然不会当即被响应。因而就开始重复以上步骤。利用这个方法,可让浏览器始终保持等待响应的状态。虽然以上过程依然只有非持续的Http参与,可是咱们模拟出了一个看似持续的链接状态java

  咱们再看传统的服务器(好比Apache)。每次一个新用户连到你的网站上,你的服务器就得开一个链接。每一个链接都须要占一个进程,这些进程大部分时间都是闲着的(好比等着你好友发新鲜事,好友发完才给用户响应信息。或者等着数据库返回查询结果什么的)。虽然这些进程闲着,可是照样占用内存。这意味着,若是用户链接数的增加到必定规模,你服务器没准就要耗光内存直接瘫了。node

  这种状况怎么解决?解决方法就是刚才上边说的:非阻塞事件驱动。这些概念在咱们谈的这个情景里面其实没那么难理解。你把非阻塞的服务器想象成一个loop循环,这个loop会一直跑下去。一个新请求来了,这个loop就接了这个请求,把这个请求传给其余的进程(好比传给一个搞数据库查询的进程),而后响应一个回调(callback)。完事了这loop就接着跑,接其余的请求。这样下来。服务器就不会像以前那样傻等着数据库返回结果了。c++

  若是数据库把结果返回来了,loop就把结果传回用户的浏览器,接着继续跑。在这种方式下,你的服务器的进程就不会闲着等着。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事件发生的时候才响应,这就是事件驱动。git

  FriendFeed是用基于Python的非阻塞框架Tornado (知乎也用了这个框架) 来实现上面说的新鲜事功能的。不过,Node.js就比前者更妙了。Node.js的应用是经过javascript开发的,而后直接在Google的变态V8引擎上跑。用了Node.js,你就不用担忧用户端的请求会在服务器里跑了一段可以形成阻塞的代码了。由于javascript自己就是事件驱动的脚本语言。你回想一下,在给前端写javascript的时候,更多时候你都是在搞事件处理和回调函数。javascript自己就是给事件处理量身定制的语言。github

  Node.js仍是处于初期阶段。若是你想开发一个基于Node.js的应用,你应该会须要写一些很底层代码。可是下一代浏览器很快就要采用WebSocket技术了,从而长轮询也会消失。在Web开发里,Node.js这种类型的技术只会变得愈来愈重要。web

 2.数据库

首先要了解Node.js,咱们能够先要了解什么是v8引擎,能够说Node.js的诞生很大程度上归功于v8引擎的出现。
咱们都知道计算机处理器智能识别机器语言,而 JavaScript是一门高级语言,计算机并不能直接读懂因此咱们须要所谓的引擎来将其转化成计算机所能理解的语言。v8引擎是由Google推出的,为其浏览器Chrome所设计的开源JavaScript引擎。得益于JIT,编译模式的改变与编译阶段的优化,JavaScript的性能获得了一个飞跃。其源代码是用c++写的,感兴趣的能够点 GitHub - v8/v8: The official mirror of the V8 git repository
除了对JavaScript性能的大幅提高,v8引擎也提供了“嵌入”的功能,使得开发者也能够在本身的c++程序中使用“嵌入”的v8引擎,从而高效地编译JavaScript,并加入c++的feature。要知道,做为一个底层得多的语言,c++能够实现的feature可要比JavaScript多得多。举例说明, JavaScript自己并无read这么一个function。然而经过v8,咱们能够将其绑定到一个用c++写的read callback上,从而经过JavaScript咱们也能够直接加载文件了。

因而,借助于v8种种便利的功能,Node.js诞生了。
Node.js是一项服务器技术。咱们都知道客户端提出服务请求,而服务器端负责处理请求并提供服务。而对于互联网来讲,在Node.js以前JavaScript是一项彻底的客户端技术,被用于浏览器中实现各类动画,对DOM的操做等等。然后端,即服务端则是由PHP、Python、Ruby、Java等等语言来实现。 Node.js的出现,使得先后端使用同一种语言,统一模型的梦想得以实现。
因此 Node.js到底解决了JavaScript的什么痛点和问题?
  1. 更好的组织代码,提高复用性。固然在ES6中这一点也获得了很大的提高。
  2. 处理文件与数据库。
  3. 与互联网进行沟通,以标准化的格式处理请求并发送回答。
  4. 快速地解决如上问题。
同时,Node.js还带来了许多别的后端技术所不具有,或是不完善的优势,如其余人回答中的事件驱动,异步编程,非阻塞式io等等。JavaScript自己语言的特性,以及其的流行程度与社区活跃度给Node.js带来了各类意义上的优点。

 3.Nodejs的优点和劣势?

  要讲清楚这个问题,先讲讲整个Web应用程序架构(包括流量、处理器速度和内存速度)中的瓶颈。 瓶颈在于服务器可以处理的并发链接的最大数量Node.js解决这个问题的方法是:更改链接到服务器的方式。每一个链接发射一个在Node.js引擎的进程中运行的事件,而不是为每一个链接生成一个新的OS线程(并为其分配一些配套内存)。 Node.js不会死锁,由于它根本不容许使用锁,它不会直接阻塞 I/O 调用。Node.js还宣称,运行它的服务器能支持数万个并发链接。
  Node自己运行V8 JavaScript。V8 JavaScript引擎是Google用于其Chrome浏览器的底层JavaScript引擎。 Google使用V8建立了一个用C++编写的超快解释器,该解释器拥有另外一个独特特征: 您能够下载该引擎并将其嵌入任何应用程序。V8 JavaScript引擎并不只限于在一个浏览器中运行。所以,Node.js实际上会使用Google编写的V8 JavaScript引擎,并将其重建为可在服务器上使用。

   Node.js优势:
  一、采用事件驱动、异步编程,为网络服务而设计。 其实Javascript的匿名函数和闭包特性很是适合事件驱动、异步编程。并且JavaScript也简单易学,不少前端设计人员能够很快上手作后端设计。
  二、Node.js 非阻塞模式的IO处理给Node.js带来在相对低系统资源耗用下的高性能与出众的负载能力,很是适合用做依赖其它IO资源的中间层服务。
  三、Node.js轻量高效,能够认为是数据密集型分布式部署环境下的实时应用系统的完美解决方案。Node很是适合以下状况:在响应客户端以前,您预计可能有很高的流量,但所需的服务器端逻辑和处理不必定不少。

   Node.js缺点:
  一、可靠性低
  二、 单进程,单线程,只支持单核CPU,不能充分的利用多核CPU服务器。一旦这个进程崩掉,那么整个web服务就崩掉了。
  不过以上缺点能够能够经过代码的健壮性来弥补。
 
  目前Node.js的网络服务器有如下几种 支持多进程的方式
  #1 开启多个进程,每一个进程绑定不一样的端口,用反向代理服务器如 Nginx 作负载均衡,好处是咱们能够借助强大的 Nginx 作一些过滤检查之类的操做,同时可以实现比较好的均衡策略,但坏处也是显而易见——咱们引入了一个间接层。
  #2 多进程绑定在同一个端口侦听。在Node.js中,提供了进程间发送“文件句柄” 的功能,这个功能实在是太有用了(貌似是yahoo 的工程师提交的一个patch) ,不明真相的群众能够看这里: Unix socket magic   #3 一个进程负责监听、接收链接,而后把接收到的链接平均发送到子进程中去处理。 在Node.js v0.5.10+ 中,内置了cluster 库,官方宣称直接支持多进程运行方式。Node.js 官方为了让API 接口傻瓜化,用了一些比较tricky的方法,代码也比较绕。这种多进程的方式,不可避免的要牵涉到进程通讯、进程管理之类的东西。 此外,有两个Node.js的module:multi-node 和 cluster ,采用的策略和以上介绍的相似,但使用这些module每每有一些缺点: #1 更新不及时 #2 复杂庞大,每每绑定了不少其余的功能,用户每每被绑架 #3 遇到问题难以解决 Node表现出众的典型示例包括: 一、RESTful API 提供RESTful API的Web服务接收几个参数,解析它们,组合一个响应,并返回一个响应(一般是较少的文本)给用户。这是适合Node的理想状况,由于您能够构建它来处理数万条链接。它仍然不须要大量逻辑;它本质上只是从某个数据库中查找一些值并将它们组成一个响应。因为响应是少许文本,入站请求也是少许的文本,所以流量不高,一台机器甚至也能够处理最繁忙的公司的API需求。 二、Twitter队列 想像一下像Twitter这样的公司,它必须接收tweets并将其写入数据库。实际上,每秒几乎有数千条tweet达到,数据库不可能及时处理高峰时段所需的写入数量。Node成为这个问题的解决方案的重要一环。如您所见,Node能处理数万条入站tweet。它能快速而又轻松地将它们写入一个内存排队机制(例如memcached),另外一个单独进程能够从那里将它们写入数据库。Node在这里的角色是迅速收集tweet,并将这个信息传递给另外一个负责写入的进程。想象一下另外一种设计(常规PHP服务器会本身尝试处理对数据库自己的写入):每一个tweet都会在写入数据库时致使一个短暂的延迟,由于数据库调用正在阻塞通道。因为数据库延迟,一台这样设计的机器每秒可能只能处理2000条入站tweet。每秒处理100万条tweet则须要500个服务器。相反,Node能处理每一个链接而不会阻塞通道,从而可以捕获尽量多的tweets。一个能处理50000条tweet的Node机器仅需20台服务器便可。 三、电子游戏统计数据 若是您在线玩过《使命召唤》这款游戏,当您查看游戏统计数据时,就会当即意识到一个问题:要生成那种级别的统计数据,必须跟踪海量信息。这样,若是有数百万玩家同时在线玩游戏,并且他们处于游戏中的不一样位置,那么很快就会生成海量信息。Node是这种场景的一种很好的解决方案,由于它能采集游戏生成的数据,对数据进行最少的合并,而后对数据进行排队,以便将它们写入数据库。使用整个服务器来跟踪玩家在游戏中发射了多少子弹看起来很愚蠢,若是您使用Apache这样的服务器,可能会有一些有用的限制;但相反,若是您专门使用一个服务器来跟踪一个游戏的全部统计数据,就像使用运行Node的服务器所作的那样,那看起来彷佛是一种明智之举。 总的来讲,Node.js的应用场景 1) 适合 JSON APIs——构建一个Rest/JSON API服务,Node.js能够充分发挥其非阻塞IO模型以及JavaScript对JSON的功能支持(如JSON.stringfy函数) 单页面、多Ajax请求应用——如Gmail,前端有大量的异步请求,须要服务后端有极高的响应速度 基于Node.js开发Unix命令行工具——Node.js能够大量生产子进程,并以流的方式输出,这使得它很是适合作Unix命令行工具 流式数据——传统的Web应用,一般会将HTTP请求和响应当作是原子事件。而Node.js会充分利用流式数据这个特色,构建很是酷的应用。如实时文件上传系统transloadit 准实时应用系统——如聊天系统、微博系统,但Javascript是有垃圾回收机制的,这就意味着,系统的响应时间是不平滑的(GC垃圾回收会致使系统这一时刻中止工做)。若是想要构建硬实时应用系统,Erlang是个不错的选择 2) 不适合 CPU使用率较重、IO使用率较轻的应用——如视频编码、人工智能等,Node.js的优点没法发挥 简单Web应用——此类应用的特色是,流量低、物理架构简单,Node.js没法提供像Ruby的Rails或者Python的Django这样强大的框架 NoSQL + Node.js——若是仅仅是为了追求时髦,且本身对这两门技术还未深刻理解的状况下,不要冒险将业务系统搭建在这两个漂亮的名词上,建议使用MySQL之类的传统数据库 若是系统能够匹配Node.js的适用场景,那么是时候采起具体的措施来讲服老板了。 说服本身老板采用Node.js的方式 构建一个简单的原型——花一周时间构建系统某一部分的原型是很是值得的,同时也很容易和老板在某一点达成一致,等到系统真的在某一部分应用了Node.js,就是打开局面的时候 寻找开发者——首先JavaScript语言的普及度很高,通常公司都不乏Web前端工程师,而此类工程师的学习门槛也很是低。这就意味着Node.js很容易招人,或者公司就隐藏了一些高手 强大的社区支持——Node.js社区很是活跃,吸引不少优秀的工程师,这就意味着公司能够很容易从社区获得免费或者付费的支持 系统性能考虑——JavaScript引擎Google V8,加之原生异步IO模型,使得Node.js在性能的表现很是出色,处理数以千计的并发请求很是轻松 专业公司的支持——使用开源技术的最大问题是,原做者不承诺对其产品进行技术支持或者质量保证。如今Node.js已经获得Joyent公司的赞助,这就保证了将来Node.js的发展是可持续性的
相关文章
相关标签/搜索