Node.js是从纯前端到高阶前端的必经之路,全栈工程师。简单的说,Node.js是运行在一个服务上Node.js是一个基于ChromeJavaScript运行时的平台。Node.js是一个事件驱动的I/O服务器端JavaScript环境。基于谷歌的V8引擎,V8引擎执行Javascript的速度非常快,性能非常好。如果你是一名前端程序员,你不知道PHP、Python或Ruby等动态编程语言,然后你想创建自己的服务,那么Node.js是一个非常好的选择Node.js就是JavaScript运行在服务器端,如果你熟悉Javascript的话,你会很容易学会Node.js。当然,如果你是后端程序员,想要部署一些高性能的服务,那么学习Node.js也是一个非常好的选择。Node.JS适合在高端应用中使用。并发、I/O密集、业务逻辑量小的场景Node.js模块组成如下:Node.js运行机制V8引擎解析JavaScript脚本的解析代码,调用NodeAPIlibuv库负责NodeAPI的执行。它将不同的任务分配给不同的线程,形成一个EventLoop(事件循环),并将任务的执行结果以异步的方式返回给V8引擎。然后V8引擎将结果返回给用户。事件循环(EventLoop)Nodejs执行后会初始化一个事件循环,执行代码程序(这些程序可能会引起异步调用、定时器或process.nextTick()),然后开始执行事件循环。事件循环的执行顺序:上面的每个模块都是事件循环的一个阶段,每个阶段都有一个先进先出的待执行回调队列。虽然每个stage都不一样,但是一般来说,当一个事件执行到一个stage的时候,先执行这个stage的具体操作,然后再操作这个stage的队列。当队列执行完或者达到回调限制时,事件循环会执行下一个。阶段。每个阶段执行的任务如下:timers阶段:该阶段执行setTimeout和setInterval调度的回调;I/O回调阶段:除了close事件的回调、定时器设置的回调、setImmediate()设置的回调外执行。回调;空闲、准备阶段:仅供节点内部使用;poll阶段:获取新的I/O事件,节点在合适的情况下会阻塞在这里;检查阶段:执行setImmediate()设置的回调;关闭回调阶段:执行socket.on('close',...)这些callbackprocess.nextTick()不属于以上任何一个阶段,它会在每个阶段结束时运行。也可以认为nextTick是在调用next异步方法的事件回调函数之前执行的。TIPS:Node.js中的事件循环机制是不会轮回的,只会自上而下循环执行。完整的一次性执行机制可以这样描述。在Node.js中,大多数API都是异步的。有一个非常生动的故事描述了JAVA和Node.js之间的区别。JAVA是一家餐厅,100个服务员对应100个顾客。Node.js是一个努力工作的服务员,也对应着100个顾客。上菜的速度很大一部分取决于厨师的烹饪速度。Node.js的单线程并不是真正的单线程,而是开辟了一个单线程进行业务处理。(cpu运行),同时开启其他线程处理I/O。当指令到达主线程时,主线程发现有I/O后,直接将事件传递给I/O线程,而不是等待I/O结束再处理后面的业务,而是拿到一个status后马上往下走,这就是“单线程”和“异步I/O”。I/O操作之后呢?Node.js的I/O处理完成后,会有一个回调事件。该事件将被放置在一个事件处理队列中。当流程启动时,node会创建一个类似While(true)的循环,每次轮询都会检查是否有事件需要处理,是否有事件相关的回调函数需要处理,如果有则处理,然后加入下一次轮询,如果没有,则退出流程,这就是所谓的“事件驱动”。这也从Node的角度解释了什么是“事件驱动”。在node.js中,事件主要来自网络请求、文件I/O等,观察者根据不同的事件进行分类,包括文件I/O观察者和网络I/O观察者。事件驱动是典型的生产者/消费者模型。请求到达观察者,事件循环从观察者处消费。主线程可以不等待I/O,不间断的专注于业务。优点:Node的既定目标是“提供一种构建可伸缩网络程序的简单方法”。让我们看一个简单的例子。在Java和PHP等语言中,每个连接都会产生一个新线程,每个新线程可能需要2MB的伴随内存。在具有8GBRAM的系统上,理论上最大并发连接数为4,000个用户。随着客户群的增长,如果您希望Web应用程序支持更多用户,则必须添加更多服务器。所以在传统的后台开发中,整个Web应用架构(包括流量、处理器速度、内存速度)的瓶颈是:服务器最大能够处理的并发连接数。这种不同架构承载的并发量是不一致的。而Node的出现就是为了解决这个问题:改变连接服务器的方式。在Node声称它不允许锁定的地方,它不会直接阻塞I/O调用。Node不是为每个连接生成一个新的OS线程(并为其分配一些伴随的内存),而是为每个连接发出一个在Node引擎进程中运行的事件。缺点:上面说了,nodejs的机制是单线程的。在这个线程中,有一个事件循环机制来处理所有的请求。在事件处理过程中,它会智能地将一些涉及IO和网络通信的耗时操作交给worker-threads执行,执行完再回调。这就是所谓的异步IO非阻塞。但是那些只用CPU计算的非IO操作,它会自己扛,比如什么是斐波那契数列。它是单线程的,这些自负的任务必须一个接一个完成。如果前一个没有完成,后一个就只能等待了。所以,如果有很多CPU密集型任务,对CPU要求比较高,可能会导致号称高性能,适合高并发的node.js服务器响应慢。Node.js使用Nginx+pm2,并发度高。可以在pm2中启用多线程负载平衡。有两种模式:pm2介绍:PM2是一个节点进程管理工具,可以用来简化节点应用管理的很多繁琐工作,比如性能监控,自动重启,负载均衡等,而且非常容易使用。下面是对PM2的入门介绍,基本涵盖了PM2常用的功能和配置。fork模式,单实例多进程,常用于多语言混合编译,如php、python等,不支持端口复用,需要做应用端口分配和负载均衡子进程业务自己编码。缺点是单个服务器实例容易因异常而崩溃。集群模式,多实例多进程,但只支持node,端口可以复用,不需要额外配置端口,0代码实现负载均衡。好处是由于多实例机制,可以保证服务器的容错性,即使出现异常,多个服务器实例也不会同时崩溃。共同点是因为都是多进程,所以都需要消息机制或者数据持久化来实现数据共享。pm2部署,默认开启负载均衡:npmipm2-g$pm2startapp.js#启动app.js应用$pm2startapp.js-i4#集群模式启动app.js的4个应用实例#4每个应用程序都会自动执行负载均衡。pm2startapp.js-imax最大化您的cpus数量以启动多线程以进行负载平衡。如果要停止所有应用程序,可以使用pm2stopall查看进程状态。pm2listpm2真的很好很强大。代码可以在线热更新,更多说明需要去官网查看pm2和Nginx。配合pm2+nginx无非是在nginx上做一个反向代理配置,直接粘贴配置即可。upstreammy_nodejs_upstream{server127.0.0.1:3001;}server{listen80;server_namemy_nodejs_server;root/home/www/project_root;location/{proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerHost$http_hostX;proxy_setN_header-真;proxy_http_version1.1;proxy_set_header升级$http_upgrade;proxy_set_header连接“升级”;proxy_max_temp_file_size0;proxy_passhttp://my_nodejs_upstream/;proxy_redirectoff;proxy_read_timeout240秒;有时它被用作中间件和访问层。比如Electron开发跨平台应用,Nginx实现多线程。负载均衡的作用。负载均衡:分布到多个运行单元去执行,和它的英文名字很吻合。即我们需要一个调度器来保证所有后端服务器都充分发挥其性能,从而保持服务器集群的整体性能最优,这就是负载均衡。负载均衡涉及的东西比较多,理论就不多说了。网上有很多书。今天我们将使用Nginx服务器来实现一个简单的负载均衡算法。源地址散列法:根据获取客户端的IP地址,通过散列函数计算出一个值,用该值对服务器列表的大小进行取模运算,得到的结果就是客户端的序号客服终端要访问的服务器。源地址散列法用于负载均衡。对于IP地址相同的客户端,在后端服务器列表不变的情况下,每次都会映射到同一台后端服务器进行访问。轮询方式:将请求按顺序依次分发给后端服务器,它均衡地对待后端的每台服务器,不考虑服务器的实际连接数和当前系统负载。随机方式:通过系统的随机算法,根据后端服务器的列表大小值,随机选择其中一台服务器进行访问。加权轮询法:不同的后端服务器可能机器配置和当前系统负载不同,因此其抗压能力也不同。给配置高、负载低的机器分配更高的权重,让它们处理更多的请求;给配置低、负载高的机器分配较低的权重,以降低其系统负载,加权轮询效果很好妥善处理这个问题,将请求按权重顺序分配给后端。加权随机法:与加权循环法一样,加权随机法也是根据后端机器的配置和系统的负载分配不同的权重。不同的是,它是按权重随机请求后端服务器,而不是按顺序。最小连接数法:由于后端服务器的配置不同,请求的处理可能快也可能慢。最小连接数方法根据后端服务器当前连接状态,动态选择一台积压连接最少的服务器来处理当前请求,尽可能提高后端服务的利用效率,并将负责合理拆分到各个服务器。下载Nginx,找到config文件夹下的nginx.conf,修改每个upstreamtest{server11.22.333.11:6666weight=1;服务器11.22.333.22:8888宕机;服务器11.22.333.33:8888备份;服务器11.22.333.44:5555权重=2;}//down表示订单前面的服务器暂时不参与负载。//weight默认为1,权重越大,负载的权重越大//backup:所有其他非备份机器停机或忙时,请求备用机。所以本机压力会最轻的nginx命令总结:nginx服务器重启命令,关闭nginx-sreload:修改配置生效后重新加载nginx-sreopen:重新打开日志文件nginx-t-c/path/到/nginx。conf测试nginx配置文件是否正确关闭nginx:nginx-sstop:快速停止nginxquit:完全有序地停止nginx其他停止nginx的方法:ps-ef|grepnginxkill-QUIT主进程号:从容停止Nginxkill-TERM主进程号:快速停止Nginxpkill-9nginx:强行停止Nginx启动nginx:nginx-c/path/to/nginx.conf顺利重启nginx:kill-HUPmain进程号为启用Nginx多线程负载均衡和部署pm2负载均衡架构图:第一种方式,Node.js作为底层服务器直接操作数据库:第二种方式,Node.js作为中间件,以及访问底层服务器的方式:高并发下性能对比,Apache、Nginx和Node.js高并发下性能测试对比:参考文章:巨头之间的终极对决,Apache、Nginx和Node.js的较量.用于基准测试的工具:ApacheBench,2.3<$Revision:1748469$>测试包括一系列基准测试,从1000到10000个请求和从100到1000个并发请求——结果相当令人惊讶。高并发测试结果对比:Apache、Nginx和Node对比:请求负载性能(每100个并发用户)Apache、Nginx和Node对比:用户负载能力(每1000个请求)压力测试从结果中我们可以得到什么?从上面的结果来看,似乎Nginx可以用最少的时间完成最多的请求,换句话说,Nginx是最快的HTTP服务器。还有一个相当惊人的事实,即对于给定数量的并发用户和请求,Node.js可以比Nginx和Apache更快。但是当并发测试中请求数增加时,Nginx重新领先,这个结果对于那些陷入Node.js遐想的人来说是一个清醒的认识。与Apache和Nginx不同,Node.js似乎对并发用户数不太敏感,尤其是在集群节点上。如图所示,集群节点在0.1秒左右保持直线,而Apache和Nginx都在0.2秒左右波动。根据以上统计可以得出结论,如果网站比较小,网站使用的服务器是无所谓的。但是,随着网站受众的增长,HTTP服务器的影响越来越明显。当谈到每个服务器的原始速度底线时,正如压力测试所描述的那样,我的感觉是性能背后最关键的因素不是某种特定的算法,而是每个服务器运行语言所使用的编程。由于Apache和Nginx都使用C——一种AOT语言(编译语言),Node.js使用JavaScript——一种JIT语言(解释语言)。这意味着Node.js在执行程序的过程中有额外的工作负载。这意味着我不能仅仅根据上面的结果得出结论,而是进一步检查,正如你在下面看到的,当我使用一个优化的Node.js服务器和流行的Express框架时,我得到了几乎相同的性能结论.综上所述,如果没有可提供的内容,HTTP服务器就没什么用了。因此,在比较Web服务器时,我们必须考虑的一个重要部分是我们希望在它们上运行什么。尽管还有其他功能,但HTTP服务器最广泛的用途是运行网站。因此,为了了解每台服务器的实际性能,我决定将世界上使用最广泛的CMS(内容管理系统)WordPress与Ghost进行比较,Ghost是一颗以JavaScript为核心的后起之秀。基于JavaScript的Ghost页面能否胜过运行在PHP和Apache/Nginx上的WordPress页面?这是一个有趣的问题,因为Ghost的优势在于运行工具单一且一致——无需额外包装,而WordPress需要依赖Apache/Nginx与PHP的集成,这会导致显着的性能缺陷。除此之外,PHP和Node.js之间存在显着的性能差距,哪个更好,我将在下面简要介绍,这可能会导致一些与最初预期截然不同的结果。PHP与Node.js要比较WordPress和Ghost,我们必须首先考虑影响两者的基本组件。基本上,WordPress是基于PHP的CMS,而Ghost是基于Node.js(JavaScript)的。与PHP不同,Node.js具有以下优点:非阻塞I/O事件驱动更新颖,更少过时的代码因为有大量评估文章解释和演示Node.js相对于PHP的原始速度(包括PHP7)、这个话题我就不多说了,大家自行谷歌搜索。那么,考虑到Node.js优于PHP,Node.js网站会比Apache/Nginx和PHP更快吗?WordPressvs.Ghost摊牌当比较WordPress和Ghost时,有些人会说这就像比较苹果和橙子,在大多数情况下我同意这一点,因为WordPress是一个成熟的CMS,而Ghost基本上只是一个博客平台。但是,仍然存在两者竞争的市场,两者都可以用来向全世界发布您的个人文章。做一个前提,我们如何比较两个运行在完全不同代码上的平台,包括风格主题和核心功能。事实上,科学的实验测试条件是很难设计的。但是,我对本次测试中更贴近生活的场景更感兴趣,因此WordPress和Ghost都将保留其主题。所以这里的目标是让两个平台的页面大小尽可能相似,让PHP和Node.js在幕后发挥作用。由于结果是根据不同的标准衡量的,最重要的是在不同的尺度上衡量的,因此在图中并排显示它们是不公平的。因此,我改为使用该表:Node、Nginx、Apache以及运行WordPress和Ghost的比较。前两行是WordPress,后两行是GhostNode、Nginx、Apache以及运行WordPress和Ghost的比较。前两行是WordPress,后两行是Ghost如您所见,尽管Ghost(Node.js)正在加载一个小得多的页面(您可能会惊讶于1kb可以产生如此大的差异),但它仍然Nginx和Apache都比WordPress更小。此外,使用Nginx代理作为负载均衡器来接管来自每个节点服务器的请求是否真的会提高或降低性能?好吧,根据上表,如果有的话,它会产生变慢的效果——这是一个合理的结果,因为额外的封装层当然会使它变慢。当然,从上面的数字也可以看出,这种差异可以忽略不计。但从上表中最重要的一点是,即使Node.js比PHP更快,HTTP服务器的作用可能超过某个Web平台使用的编程语言的重要性。当然,另一方面,如果加载的页面更多地依赖于服务器端脚本处理,那么我怀疑结果可能会有点不同。最后,如果一个网络平台真的想在这场比赛中击败WordPress,那么从这个比较中得出的结论是,要想在性能上更胜一筹,就必须定制像PHP-FPM这样的东西,它将直接与JavaScript通信(而不是运行作为服务器),因此它可以充分利用JavaScript的强大功能来获得更好的性能。Node.js的生态系统总结:Node.js遵循commonJS规范。如果要说它的生态,第一个肯定是webpack。不会用Node.js的人也用不好webpack,所以Node.js之一突破初级前端工程师的好学习方向expresskoakoa2egg系列Node.js框架,在Restful架构下使用,完成一些常规的http,ajax请求响应GraphQL,GraphQL是API使用的一种查询语言,不仅Node还有.js等语言。不仅可以查询,还可以进行多库CRUD操作,可以解决RestFul架构带来的一些问题mongodb,非关系型数据库,轻量级数据库,目前Node.js用的比较多数据库,在Node.js中,我们一般使用mongoose与sqlite合作的库。SQLite是一个进程内库,它实现了一个自给自足、无服务器、零配置和事务性SQL数据库引擎。它是一个零配置的数据库,这意味着像其他数据库一样,你不需要在系统中配置它。与其他数据库一样,SQLite引擎不是一个独立的进程,可以根据应用需要进行静态或动态链接。SQLite直接访问它的存储文件。Electron,跨平台桌面开发,可以使用Node.jsAPI,也封装了V8环境。C++插件,Node.js的V8环境是用C++写的,自然也可以用C++插件Redis,数据缓存层,Redis支持主从同步。数据可以从主服务器同步到任意数量的从服务器,从服务器可以是关联其他从服务器的主服务器。这使Redis可以执行单级树复制。存储可以有意或无意地写入数据。由于完全实现了发布/订阅机制,当树从数据库同步到任何地方时,它可以订阅一个频道并接收到主服务器的完整消息发布记录。同步有助于读取操作的可伸缩性和数据冗余。SSR,以React为例,在中间层代码注水,在客户端对代码进行脱水,实现部分首屏SSR,优化首屏渲染时间。websocket通信等Puppeteer爬虫总结Node.jsNode.js是当前前端开发不可或缺的技能,也让我们在成为真正的全栈工程师Node.js适用场景,非精读计算型Node.js的核心部分不仅仅是接受请求和返回数据的一套RestFul架构。还有文件IO、流、Buffer、redis层等操作。Node.js配合Nginx做负载均衡,不仅可以提升性能,还可以真正为后端减轻很多负担,满足很多特定的需求。Node.js在访问层工作。比如在Electron中,可以调用很多Node的API来完成渲染进程做不到的事情,比如文件io,buffer操作等等,今天由于时间关系,很多东西都没有详细写出来,可能还有很多疏漏,以后会慢慢补上。路过,点个赞,我们永远是A
