WebRTC | Web服务器原理、Nodejs工作原理、Nodejs事件处理流程、V8引擎等要点解析...

  • 出于安全原因,像Chrome之类的浏览器是不允许直接调用本地的JS文件的;
    所以只能把它放在Web服务器端,
    通过Web服务器下载到本地,再运行这些程序;

  • 后续很多WebRTC案例,包括信令服务器,都是需要使用到Web服务器的;


Web服务器选型

  • Nodejs
    比较特殊,可以用js开发服务端程序;
    有两份JS,
    一份是用于控制服务器的,
    一份是用于下载到客户端去运行的;
  • Nginx
    性能上比Apache更好,灵活度等也优于Apache,
    所以逐渐把Apache取代;
  • Apache
    一开始出现的时候占服务器市场80%,
    逐渐被Nginx取代;


Web服务工作原理


Nodejs工作原理

  • Application:
    我们自己开发的JavaScript程序,
    Application运行,首先输出给V8JS引擎;

  • V8 JavaScript Engine【V8JS引擎 | 重点】
    这个引擎是从Chrome项目中抽取出来的;
    主要是对JS进行一些解析工作,解析完了之后生成二进制代码;
    解析生成的二进制代码去调用 Nodejs的API【NODE.JS BINDINGS】,
    随后【NODE.JS BINDINGS】会调用LIBUV【一个事件处理库】

  • 【LIBUV】
    类似于Android的Handler消息机制;


JS解析过程

  • 首先V8引擎 会收到 JS源程序;

  • 在服务端写服务的时候,
    首先是用JS写一个小的脚本;

  • 脚本经过V8,
    通过parser,解析成Abstract Syntax Tree,
    最终交给解析器【interpreter】,
    【interpreter】将其解析成bytecode【字节码,执行代码】;
    也可能【interpreter】经过编译优化【optimizing compiler】,
    形成优化后的代码【optimized code】,
    最终再转化成bytecode;


Nodejs事件处理流程

  • Nodejs收到事件之后的大概的处理流程

  • 首先是若干个Request,
    请求到Node.js 应用上来;

  • 拿到请求之后,会生成请求对应的事件,
    插入到事件队列【LIBUV中 的 Event Queue】中去,
    【LIBUV】中的Event Loop会不断循环,
    读取【Event Queue】队头的事件进行处理;

  • 简单的事件则直接【Callback】,返回一个【Response】
    (如请求一个HTML简单页面的事件);

  • 还有复杂一点的事件,
    可能需要调用数据库、做一些查询工作、做数据统计,
    最终展示页面,
    这个时候会从线程池【Thread Pool】取出一个线程【Thread】,
    执行对应的【Function】,最后【Callback】,返回一个【Response】;
    最后回收线程;

  • 以上两个步骤的【Callback】,
    如果是最终结果,自然是直接返回一个【Response】,
    如果只是中间结果,
    可能还需要再次生成事件,插入【Event Queue】,
    进行下一轮的事件处理;


两个V8引擎

  • 我们说Nodejs比较特殊,
    可以用js开发服务端程序;
    有两份JS,
    一份是用于控制服务器的,
    一份是用于下载到客户端去运行的;

  • 那么 服务端、客户端 其实分别对应着一个V8引擎;


  • 一般情况下,在客户端发送请求之前,
    Nodejs服务是要先运行起来的【running】,
    服务端有自己的JS,
    经过(服务端 的)V8解析、中间层LIBUV处理,
    然后先运行起来了;

  • 客户端发送一个http请求Nodejs服务端,
    比如要请求【Request】某一个JS文件,
    那【Request】生成对应的事件【Event】之后,
    经过LIBUV事件处理机制【上述流程】,
    进行事件处理,操作磁盘,拿到对应JS文件,
    然后Callback、Response返回给客户端【浏览器】;

  • 浏览器【客户端】收到服务端JS文件之后,
    也将JS代码交给【(浏览器/客户端 自己的)V8】进行解析
    解析得到执行代码【byteCode】之后;
    随后进行JS逻辑对应的中间层、底层操作;











参考自:

Stepify(node-stepify) 是一个简单易扩展的Node.js流程控制引擎,采用方法链(methods chain)的方式定制异步任务,使得Node.js工作流易于理解和维护。 目标是将复杂的任务进行拆分成多步完成,使得每一步的执行过程更加透明,化繁为简。 stepify特点 最基本的API的就3个:step(),done(),run(),简单容易理解。 精细的粒度划分(同时支持单/多任务),执行顺序可定制化。 每一个异步操作都经过特殊的封装,内部只需要关心这个异步的执行过程。 链式(chain)调用,代码逻辑看起来比较清晰。 灵活的回调函数定制和参数传递。 统一处理单个异步操作的异常,也可根据需要单独处理某个任务的异常。 最简单的用法 简单实现基于oauth2授权获取用户基本资料的例子: // Authorizing based on oauth2 workflowStepify()     .step('getCode', function(appId, rUri) {         var root = this;         request.get('[authorize_uri]', function(err, res, body) {             root.done(err, JSON.parse(body).code);         });     }, [appId], [redirectUri])     .step('getToken', function(code) {         var root = this;         request.post('[token_uri]', function(err, res, body) {             root.done(err, JSON.parse(body).access_token);         });     })     .step('getInfo', function(token) {         request.get('[info_uri]?token='\u00a0 \u00a0token,\u00a0function(err,\u00a0res,\u00a0body)\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0//\u00a0got\u00a0user\u00a0info,\u00a0pass\u00a0it\u00a0to\u00a0client\u00a0via\u00a0http\u00a0response\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0\u00a0\u00a0})\n\u00a0\u00a0\u00a0\u00a0.run();\n\u591a\u4e2astep\u5171\u7528\u4e00\u4e2ahandle\u3001\u9759\u6001\u53c2\u6570\u3001\u52a8\u6001\u53c2\u6570\u4f20\u9012\u7684\u4f8b\u5b50\uff1a\nStepify()\n\u00a0\u00a0\u00a0\u00a0.step('read', __filename)     .step(function(buf) {         // buf is the buffer content of __filename         var root = this;         var writed = 'test.js';         // do more stuff with buf         // this demo just replace all spaces simply         buf = buf.toString().replace(/\s /g, '');         fs.writeFile(writed, buf, function(err) {             // writed is the name of target file,             // it will be passed into next step as the first argument             root.done(err, writed);         });     })     .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌川江雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值