最近为了拓宽知识面准备自学Node.js,不过在此之前有一些服务器端的知识需要了解,自己查阅了一些视频和网站后总结如下。新手上路,其中错误想必不少,还望各位同仁不吝指教。
一、浏览器工作原理:
客户端(浏览器/app)发送请求
服务器接(tomcat/apache/iis)收到请求,然后通过I/O从数据库(mysql/db2/oracle)中读取出数据
服务器将数据传输给客户端
客户端对数据进行解析,在页面进行显示
而我们提高性能的手段就是缩短发送到响应的时长。
二、提高性能的方法
1、 提高客户端发送速度(无法控制,该性能由用户网速决定)
2、 提高服务器响应速度(可以控制,通过提高服务器带宽,CDN加速等方法加速,但有一定程度的瓶颈,带宽不能无上限的提高)
3、 提高服务器处理请求任务的速度(通过算法优化,或者使用多线程来优化)
4、 提高服务器从磁盘读取/写入到数据库的速度(所有项目后期都会遇到的瓶颈,举例:饭店提高点菜速度(发送速度)、给厨师传话速度(响应速度)、服务员的数量和上菜速度(多线程和算法优化),但是后厨做饭的速度是有极限的(从数据库读取/写入的速度))同样有上限,我们通过分布式、矩阵式、刀片式等方式进行磁盘读取提高的读取速度是有限的。每个线程到达后,由于磁盘读取速度达到瓶颈,线程只能等待读取出的数据,这种情况下的阻塞称为I/O阻塞。
三、V8引擎的介绍
Chrome浏览器的引擎即V8引擎,实质是一个专门对JavaScript语言进行解释和执行的流程虚拟机。起初V8引擎内置在浏览器里,在浏览器中执行JS代码,也可以内置在node.js环境下,然后帮助服务器解析JS代码。
四、V8引擎的优势
1、 强大的编译和快速执行效率(通过运用大量算法和技巧)
2、 性能好,执行效率远超Python和ruby等脚本语言
3、 历史遗留问题少,没有同步I/O
4、 利用事件驱动机制
五、node.js的诞生
修改V8引擎的内核,将其用在了服务器开发后的一系列内容就是Node.js。其中作用最大的就是异步I/O和事件驱动。
六、node.js简介
它让JavaScript可以运行在服务器端的平台,进而使JavaScript能像其他后段语言一样与系统进行交互。而之前的JavaScript只能在浏览器(客户端)中运行,作用面很窄。
优势:不用架设在任何服务器软件上;更适合中小项目开发;投资回报率最高,最小的成本,最大的性能。
特点:
1、 单线程:
优势:减少了内存开销,不再有创建线程、销毁线程的事件开销;而多线程会占用内存。
劣势:不能做大型开发,在使用node.js时,一个8g内存的服务器能至少同时处理四万用户的连接;如果一个事件阻塞了I/O,那么唯一的线程就会瘫痪;
若node.js崩溃则整个系统崩溃。
2、 非阻塞I/O
传统I/O的劣势在于,当单线程采用阻塞I/O处理机制时,在执行了访问数据库的代码后,整个线程都会停顿下来等待数据库返回数据再执行下面的代码,也就是说I/O阻塞降低了代码的执行效率。而非阻塞I/O是在执行了数据库访问代码后立即执行后续的代码,把数据库返回的结果放在回调函数中,当函数执行完毕自动获取该结果,这就提高执行效率。
实现非阻塞I/O的前提条件:当某个I/O执行完毕后必须以事件形式通知执行I/O操作的线程,线程执行这个事件的回调函数;线程中要有事件循环,不停的遍历事件队列来发现待处理的事件。
优势:阻塞模式下一个线程只能处理了一个任务,想提高吞吐量必须通过多线程,而非阻塞模式下整个线程永远都在执行操作而没有等待时间。
3、 事件驱动
将事件放入一个事件环中,不停的查看事件环来让回调函数(可能是磁盘I/O,网络通信、数据库查询等操作)对其进行处理。
七、node.js的应用方向
1、 善于I/O,天生异步的特点让其非常擅长进行任务调度和处理并发I/O,但不善于计算。
2、 具体方向:网站开发、即时通信、小程序开发、跨平台开发等。
3、 node.js过于追求性能而导致健壮性有所不足,所以不适用于银行、证券等方向,但适合创业公司这种小体量、追求性能的公司。
4、 大型企业在客户端和服务器端直接加设node.js,适合用node.js做的就尽量用成本低回报高的node.js来做。
八、客户端与服务器
两种主要架构
C/S(Client/Server):客户端/服务器架构,如下载到本地的优酷视频客户端
优点:1、服务器中只有数据库,其他的业务逻辑和界面都交给客户端完成
2、较为安全,用户界面丰富,用户体验好
3、速度快,由于业务逻辑和外部资源都已经下载到本地了,加载起来会毕竟迅速,很多大型的游戏都是C/S架构。
缺点:每次升级都要重新安装,针对不同的操作系统开发,可移植性差。
B/S(Browser/Server):浏览器/服务器架构,如访问优酷网
特点:基于浏览器访问,将业务层交给服务器完成,客户端仅仅提供界面的渲染和数据的交换等工作。
优点:因为只做服务器端,可以跨平台,移植性强。
缺点:安全性较低,所有的资源都由服务器端完成,加载速度较C/S架构慢,用户体验较差。