珠峰培训

Node.js挖掘之一:一个小例子浅析Node.JS架构

作者:

2015-08-01 17:33:39

154

精华 Node.js挖掘之一:一个小例子浅析Node.JS架构
 
 发布于 1个月前  作者 LanceHBZhang  1234 次浏览  来自 分享

最近周播剧《盗墓笔记》挺火。而我最近在干两件事,一是追《盗墓笔记》,二是研究Node.js。Node.js研究了也有一段时间了,把我的研究结果发到博客上来,写成"Node.js挖掘"系列,虽然挖掘node没有盗墓那么惊心动魄,但收获确是一样的丰厚。

一直在寻找一个关于Node.js的架构,可是没找到。自己看代码,画了一个。图中从左到右依次为V8 engine, Node.js wrapper以及 libuv。这3者组成了强大灵活的Node.js。

V8 执行 JaveScript代码 server.listen(config.crypto.service.port, function () {}) 时会通过一些基础服务调到 TCPWrap::Listen()。TCPWrap是Node.js的内建模块。代码可以参考 src/Tcp_wrap.cc。 TCPWrap::Listen()是Node.js提供的wrapper函数,其通过调用libuv的API uv_listen() 的方式,由libuv来完成异步调用。图中步骤1,2,3,4,5标明了调用和返回路径。这几步会很快结束。留下callback TCPWrap::OnConnection()等着所需要的数据ready好后被调用。

libuv在得到所需要的请求后,会调用callback TCPWrap::OnConnection(),在该函数最后通过 tcp_wrap->MakeCallback(env->onconnection_string(), ARRAY_SIZE(argv), argv) 调用V8 engine中的JavaScript callback

Sample+Flowchart+Template.png

下图是更详细的架构图。与之前的图相比,在V8的context里面添加了JavaScript,并且将V8执行JS代码 new TCP() 时,Node.js提供的服务画出来了。 Node.js内建模块http其实是建立在模块net之上的。如果看net.js代码会发现,其通过 new TCP() 返回的类对象完成后续的TCP connect, bind, open等socket动作。

可以看到Node.js做的工作像是一座桥。左手V8,右手libuv,将2者有机连接在一起。HandleWrap::HandleWrap()中记录了V8 instance中的JavaScript对象以及TCPWrap对象。这样在TCPWrap::OnConnection()中可以拿到这两个对象,执行后续的callback调用。

Node.js+architecture_moredetail (1).png