专栏首页李蔚蓬的专栏WebRTC | Web服务器原理、Nodejs工作原理、Nodejs事件处理流程、V8引擎等要点解析

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逻辑对应的中间层、底层操作;

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Android蓝牙详析 | 经典蓝牙通讯架构

    AcceptThread函数接收的是一个布尔值secure;

    凌川江雪
  • 用Python做爬虫时相关tips的参考文章集锦(refreshing)

    2.Python的hasattr() getattr() setattr() 函数使用方法详解

    凌川江雪
  • Tip | 蛇形矩阵

    凌川江雪
  • 加载第三方JS的各种姿势

    如果你的网站上面有很多第三方JS代码,那么“下载速度的不可控”很有可能导致你的网站会被拖慢。因为JS在执行的时候会影响到页面的DOM和样式等情况。浏览器在解析渲...

    mmzhou
  • 自己动手用electron+vue开发博客园文章编辑器客户端【二】

    在nwjs里,宿主页面与做过特殊标记的iframe页面(nwdisable nwfaketop和nwUserAgent)通信,并没有什么特别的地方

    liulun
  • 【前端编程】加载第三方JS的各种姿势

    从网站开发者的角度来看,第三方JS相比第一方JS有如下几个不同之处: 下载速度不可控 JS地址域名与网站域名不同 文件内容不可控 不一定有强缓存(Cache-C...

    李海彬
  • WKWebView的使用与JS交互详细解读

    前言:     WKWebView 这是在iOS8.0之后增加的一个比UIWebView更加完善和强大的控件!看网上关于它的博客也是有许多的了,从各个方面总结一...

    Mr.RisingSun
  • 担心爬虫UA代理不够用?教你一招屡试不爽的方法!

    摘要:爬虫过程中的反爬措施非常重要,其中设置随机 User-Agent 是一项重要的反爬措施,Scrapy 中设置随机 UA 的方式有很多种,有的复杂有的简单,...

    1480
  • 【教程】如何用腾讯云服务器搭建微信公众号机器人?

    我们经常在一些公众号里回复信息,微信公众号都会自动回复信息,区别于微信平台的自动回复,有的公众号上面的自动回复,则更像是一个机器人客服。下面小编就教大家如何搭建...

    云上云
  • 搭建微信 AI 机器人

    腾讯云提供了开发者实验室帮助用户搭建微信 AI 机器人,教程内容如下,用户可以点击开发者实验室快速上机完成实验。

    小Q

扫码关注云+社区

领取腾讯云代金券