首先,什么是Node.js?
Node 是一个服务器端JavaScript 解释器,它改变了服务器工作方式的概念。其目标是使程序员能够构建高度可扩展的应用程序,编写可以处理与一台(且只有一台)物理机器的数万个同时连接的代码。
Node 旨在解决什么问题?
Node 的既定目标是“提供一种构建可扩展网络程序的简单方法”。当前的服务器程序有什么问题?让我们来尝试一下数学问题。 Java 和PHP 等语言为每个连接生成一个新线程,每个新线程可能需要2 MB 的附加内存。在具有8 GB RAM 的系统上,理论上最大并发连接数为4,000 个用户。随着客户群的增长,如果您希望Web 应用程序支持更多用户,则需要添加服务器。自然,服务器成本、流量成本、人工成本等成本就会增加。除了这些增加的成本之外,还存在潜在的技术问题,即共享资源必须在所有服务器之间共享,因为用户可能针对每个请求使用不同的服务器。由于上述原因,整个Web应用程序架构(包括流量、处理器速度和内存速度)的瓶颈是服务器可以处理的最大同时连接数。
Node 解决这个问题的方法是改变它连接服务器的方式。每个连接都会发出一个在节点引擎进程中运行的事件,而不是为每个连接生成一个新的操作系统线程(并为其分配内存)。 Node 声称永远不会死锁,因为它不授予任何锁,也不直接阻止I/O 调用。 Node 还声称其运行的服务器可以支持数万个并发连接。
现在您已经有了一个可以处理数以万计的并发连接的程序,那么您实际上可以使用Node 构建什么?如果您有一个需要处理这么多连接的Web 应用程序,那就太可怕了。这是一个“如果你有这个问题,那就根本不重要”的问题。在回答上述问题之前,我们先来看看Node 是如何工作的以及它是如何设计的。
什么是节点?
是的,Node是一个服务器程序。然而,底层的Node产品与Apache和Tomcat有很大不同。本质上,这些服务器是“准备安装”的服务器产品,允许您立即部署应用程序。借助这些产品,您可以在一分钟内启动并运行服务器。 Node肯定不是这个产品。与Apache 允许开发者通过添加PHP 和SSL 模块来实现安全连接来创建动态网页类似,Node 也有模块的概念,允许开发者向Node 核心添加模块。 Node 实际上有数百个模块可供选择,社区在创建、发布和更新模块方面非常活跃,有时每天处理数十个模块。本文稍后将介绍Node 的整个模块化部分。
节点如何工作?
节点本身运行V8 JavaScript。等等,服务器上的JavaScript 怎么样?是的,你没看错。服务器端JavaScript 对于只在客户端使用JavaScript 的程序员来说可能是一个新概念,但这个概念本身并不牵强。那么为什么客户端上使用的相同编程语言不能在服务器上使用呢?
什么是V8? V8 JavaScript 引擎是Google 用于其Chrome 浏览器的底层JavaScript 引擎。很少有人考虑JavaScript 在客户端计算机上实际执行的操作。实际上,JavaScript 引擎负责解释和执行代码。 Google 使用V8 创建了一个用C++ 编写的闪电般快速的解释器。该解释器还有另一个独特的功能,允许您下载引擎并将其合并到任何应用程序中。 V8 JavaScript 引擎不限于在一种浏览器中运行。所以Node 实际上采用了Google 编写的V8 JavaScript 引擎并重新构建它以在服务器上运行。这是完美的!既然已经有了好的解决方案,为什么还要创建一种新语言呢?
事件驱动编程
许多程序员被教导相信面向对象编程是完美的编程设计,因此他们忽视其他编程技术。 Node 使用所谓的事件驱动编程模型。
清单1. 在客户端使用jQuery 进行事件驱动编程
//客户端jQuery 代码展示了事件驱动编程的工作原理//当按下按钮时,会触发一个事件- 我们将直接在此处的匿名函数内处理该事件。 //所有必需的变量都存在。可以直接引用$('#myButton').click(function(){ if ($('#myTextField').val() !=$(this).val()) alter('字段匹配按钮必须是一个句子');
实际上,服务器端和客户端没有区别。是的,您不是在单击按钮或在文本字段中输入内容,而是在更高级别上发生了事件。连接已建立。这是一个事件。通过连接接收数据也是一个事件。尽管数据已停止流过连接,但这仍然是一个事件。
为什么这种类型的设置非常适合Node?JavaScript 是一种出色的事件驱动编程语言,因为它允许匿名函数和闭包。更重要的是,任何编写过代码的人都熟悉它的语法。可以在捕获事件时创建事件发生时调用的回调函数。这使得代码更容易编写和维护,无需复杂的面向对象的框架或接口,并且不存在过度工程的可能性。只需监听事件,编写回调函数,然后让系统完成剩下的工作。
示例节点应用程序
最后我们看一下代码。让我们将迄今为止介绍的所有内容放在一起并创建您的第一个Node 应用程序。我们已经知道Node 非常适合处理高流量应用程序,因此我们将创建一个非常简单的Web 应用程序,以实现最大速度。以下是“老板”对示例应用程序的具体要求: 创建随机数生成器RESTful API。该应用程序必须接受一个输入:名为“number”的参数。然后,应用程序返回0 到此参数之间的随机数,并将结果数返回给调用者。 “老板”想要普及应用程序,因此需要能够处理50,000个并发用户。我们来看看下面的代码。
清单2. 节点随机数生成器
//这些模块必须导入才能使用,类似于其他语言中的#include或import语句。 //var http=require('http'); (' url'); //节点文件中最重要的行。 //从技术上讲,每次建立连接时,节点都会通知底层操作系统。 //必须执行特定的回调函数。 //由于我们使用REST API 创建Web 服务,因此我们需要在上面的行中创建//的http 变量。 //最后,如你所见。 //PHP 或Java 程序员应该熟悉回调方法自动接收“请求”和“响应”对象。 //http.createServer(function(request, response) { //响应必须处理所有内容:标头和返回码//这些类型的事情由服务器程序自动完成,例如//Apache 和Tomcat。但在Node 中你必须这样做自己做所有事情response.writeHead(200, {'Content-Type': 'text/plain' }); //下面是一些独特的代码这就是解析函数//处理从客户端请求传递的参数以检索//查询对象中的键和值。您可以找到“number”键的值: var input=params.number; //这些是创建返回到的随机数的通用JavaScript 方法。 caller. random() * numInput).toFixed(0); //向响应写入一个随机数response.write(numOutput); //节点可以维持连接,因此必须显式终止此连接。 //但是,该高级主题超出了本文的范围。 //创建服务器时,必须显式地将HTTP 服务器连接到//端口。标准HTTP 端口是80,因此请连接到该端口。 }).listen(80); //服务器启动后,将字符串打印到控制台//让我们知道它已正确启动。 ('随机数生成器正在运行.');
启动应用程序
将上述代码写入名为“random.js”的文件中。现在,要启动并运行此应用程序(创建HTTP 服务器并侦听端口80 上的连接),只需在命令提示符处键入以下命令:%noderandom.js。当服务器启动并运行时,它看起来像这样:
root@ubuntu:/home/moila/ws/mike# node random.js 随机数生成器正在运行.
访问应用程序
该应用程序已启动并正在运行。该节点正在侦听所有连接。我们来测试一下。现在您已经创建了一个简单的RESTful API,您可以使用Web 浏览器访问您的应用程序。输入以下地址(确保您已完成上述步骤):http://localhost/?number=27。
浏览器窗口将更改为0 到27 之间的随机数字。单击浏览器的“重新加载”按钮即可获取另一个随机数。您现在已经完成了第一个Node 应用程序。
节点有什么用?
至此,您可能已经回答了“Node是什么?”的问题,但您可能还有另一个问题:“Node是用来做什么的?”这是因为肯定有好处。从节点。
到底有什么好处呢?
如前所述,Node 非常适合您预计会有大量流量,但在响应客户端之前不一定需要大量服务器端逻辑或处理的情况。一个好的节点的典型例子是:
RESTful API
提供RESTful API 的Web 服务采用一些参数,解析它们,组装响应,并将响应(通常较少的文本)返回给用户。这对于Node 来说是一个理想的情况,因为它允许构建节点来处理数万个连接。还是不需要太多逻辑。基本上,您只需从数据库中查找一些值并将它们组装成响应即可。由于响应是少量文本,传入请求也是少量文本,因此流量并不高,即使是最繁忙的企业的API 需求也可以在单台机器上处理。
推特队列
像Twitter 这样的公司需要接收推文并将其写入数据库。实际上,每秒有近数千条推文到达,数据库不可能及时处理高峰时段所需的写入数量。节点将是解决这个问题的重要组成部分。正如您所看到的,Node 可以处理数以万计的传入推文。它们可以快速、轻松地写入内存排队机制(例如memcached),另一个进程可以从该机制将它们写入数据库。这里节点的作用是快速收集推文并将这些信息传递给另一个负责写入的进程。想象一下不同的设计,其中常规PHP 服务器尝试处理对数据库本身的写入。由于数据库调用阻塞了通道,因此每条推文写入数据库时都会出现短暂的延迟。由于数据库延迟,以这种方式设计的机器每秒可能只能处理2000 条传入推文。要每秒处理100 万条推文,您需要500 台服务器。相反,Node 会在不阻塞通道的情况下处理每个连接,从而允许您捕获尽可能多的推文。一个可以处理50,000 条推文的节点机器只需要20 台服务器。
视频游戏统计
如果您曾经在线玩过《使命召唤》 游戏,那么当您查看游戏的统计数据时,您会立即注意到一些事情。生成这种级别的统计数据需要跟踪大量信息。因此,当数以百万计的玩家同时在线玩游戏并且他们在游戏中处于不同的位置时,可以非常快速地生成大量信息。 Node 是这种场景的完美解决方案,因为它摄取游戏生成的数据,执行最小的数据合并,并对数据进行排队,以便将其写入数据库。使用整个服务器来跟踪游戏中玩家发射的子弹数量似乎很愚蠢。如果您使用Apache 这样的服务器,可能会有一些有益的限制,但如果您使用专用服务器来跟踪所有游戏的统计数据,则可以使用Node 来获取数据,这似乎是一个明智的选择,就像在服务器正在运行。
节点模块
虽然不是本文的原始主题,但根据大众的需求,本文已扩展为包括Node 模块和Node 包管理器的概述。就像熟悉Apache 的开发人员一样,您也可以通过安装模块来扩展Node 的功能。然而,Node 中提供的模块极大地增强了产品,并且这些模块非常有用,以至于使用Node 的开发人员通常会安装其中的一些模块。因此,模块变得越来越重要,甚至成为整体产品的重要组成部分。
在“参考”部分中,我们提供了一个模块页面的链接,其中列出了所有可用模块。为了演示模块可以提供的可能性,我们从数十个可用模块中包含了以下模块。一个用于创建动态创建的页面(例如PHP),一个用于简化MySQL 的使用,一个用于帮助使用WebSockets,还有一个模块。协助解析文本和参数。这篇概述文章旨在帮助您了解Node 并决定是否需要(再次)更深入地研究它,因此我们不会详细讨论这些模块。可用模块。
此外,Node 功能还包括Node Package Module,它是用于安装和管理Node 模块的内置功能。依赖关系是自动处理的,因此您可以确保要安装的任何模块都已正确安装并包含所需的依赖关系。如果您选择加入社区并创建自己的模块,我们也支持将您自己的模块发布到Node 社区。您可以将NPM 视为扩展Node 功能的简单方法,而无需担心破坏Node 安装。同样,如果您选择使用Node,NPM 将成为Node 解决方案的重要组成部分。
结论
正如您从本文中看到的,Node 实现了提供高度可扩展服务器的目标。使用Google 极快的JavaScript 引擎,即V8 引擎。它使用事件驱动的设计来保持代码最少且易于阅读。所有这些元素都有助于实现Node 的理想目标,即轻松创建高度可扩展的解决方案。
与了解Node 是什么一样重要,了解Node 不是什么也很重要。 Node 不仅仅是Apache 的替代品;它的设计目的是让PHP Web 应用程序的扩展变得更加容易。与事实应该没有什么区别。 Node 仍处于早期阶段,但它的发展速度如此之快,社区的参与度如此之高,社区成员正在创建如此多的优秀模块,以至于我们在一年之内就看到了这种演变产品可能会被引入到您的业务中。
切图网是一家专注于Web前端开发、注重用户体验的公司。欢迎注册微信公众号:qietuwang。
版权声明:本文由今日头条转载,如有侵犯您的版权,请联系本站编辑删除。