一个小例子浅析Node.JS架构
发布于 4天前 作者 LanceHBZhang 302 次浏览 来自 分享

一直在寻找一个关于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

回到顶部