Node的优缺点?
优点
- 使用js语法,简单,强大,轻量,可扩展
- 强大体现在非阻塞IO,可以适应分块传输数据,较慢的网络环境,尤其擅长高并发访问
- 轻量体现在node本身既是代码,又是服务器,前后端使用统一语言
- 可扩展体现在可以轻松应对多实例,多服务器架构,同时有海量的第三方应用组件
缺点
- 不适合CPU密集型应用
- CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;
- 解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;
- 只支持单核CPU,不能充分利用CPU
- 解决方案:多服务
- 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃
- 原因:单进程
- 解决方案:
- (1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;
- (2)开多个进程监听同一个端口,使用cluster模块;
- 开源组件库质量参差不齐,更新快,向下不兼容
Koa ?
- 就是一种简单好用的 Web 框架。它的特点是优雅、简洁、表达力强、自由度高。本身代码只有1000多行,所有功能都通过插件实现,很符合 Unix 哲学。
- Koa 2.0 与 Koa 1.x 版本的最大区别就是使用了 ES7 中 Async/Await 的特性,代替了 co 的 Generator Function,好处是摆脱了 co 的“暧昧”实现方法,改而使用原生的 Coroutine-like(maybe) 语法。缺点是与从 connect/express 迁移到 Koa 1.x 一样,很弱的向前兼容,需要用一个 wrapper 来继续使用 1.x 的中间件
- 在于 handler 的处理方法,express 是普通的回调函数, koa 是利用ES7 中 Async/Await 的特性,没有回调,没有回调,就大大加速了开发速度这一点而言,已经足以让我们跪舔了
- koa是中间件模式,执行到next的时候,会去调用下一个中间件,下个中间件执行完再接着执行上个中间件next下面的代码
- koa把 request, response 封装到了同一个上下文对象 content
什么是RESTful架构?
- 每一个URI代表一种资源
- 客户端和服务器之间,传递这种资源的某种表现层
- 客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"
什么是错误优先的回调函数?
错误优先的回调函数(Error-First Callback)用于同时返回错误和数据。第一个参数返回错误,并且验证它是否出错;其他参数用于返回数据。
fs.readFile(filePath, function(err, data) {
if (err) {
// 处理错误
return console.log(err);
}
console.log(data);
});
如何避免回调地狱?
-
模块化: 将回调函数转换为独立的函数
-
使用流程控制库,例如async
-
使用Promise
-
使用async/await(参考Async/Await替代Promise的6个理由)
如何让node监听80端口?
-
借助 nginx
-
sudo
一次完整的HTTP请求所经历的7个步骤?
HTTP通信机制是在一次完整的HTTP通信过程中,Web浏览器与Web服务器之间将完成下列7个步骤:
**建立TCP连接 **
- 在HTTP工作开始之前,Web浏览器首先要通过网络与Web服务器建立连接,该连接是通过TCP来完成的,该协议与IP协议共同构建Internet,即著名的TCP/IP协议族,因此Internet又被称作是TCP/IP网络。HTTP是比TCP更高层次的应用层协议,根据规则,只有低层协议建立之后才能进行更高层协议的连接,因此,首先要建立TCP连接,一般TCP连接的端口号是80。
**Web浏览器向Web服务器发送请求命令 **
- 一旦建立了TCP连接,Web浏览器就会向Web服务器发送请求命令。例如:GET/sample/hello.jsp HTTP/1.1。
**Web浏览器发送请求头信息 **
- 浏览器发送其请求命令之后,还要以头信息的形式向Web服务器发送一些别的信息,之后浏览器发送了一空白行来通知服务器,它已经结束了该头信息的发送。
**Web服务器应答 **
- 客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。
**Web服务器发送应答头信息 **
- 正如客户端会随同请求发送关于自身的信息一样,服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。
**Web服务器向浏览器发送数据 **
- Web服务器向浏览器发送头信息后,它会发送一个空白行来表示头信息的发送到此为结束,接着,它就以Content-Type应答头信息所描述的格式发送用户所请求的实际数据。
**Web服务器关闭TCP连接 **
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:Connection:keep-alive
- TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。
什么是HTTP,TCP,UDP?
关系
TCP/IP是个协议组,可分为四个层次:网络接口层、网络层、传输层和应用层。
在网络层有IP协议、ICMP协议、ARP协议、RARP协议和BOOTP协议。
在传输层中有TCP协议与UDP协议。
在应用层有HTTP,FTP、TELNET、SMTP、DNS等协议。
HTTPS通信原理
HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道
HTTPS是HTTP over SSL/TLS,HTTP是应用层协议,TCP是传输层协议,在应用层和传输层之间,增加了一个安全套接层SSL/TLS:
-
SSL (Secure Socket Layer,安全套接字层)
-
TLS (Transport Layer Security,传输层安全协议)
-
SSL使用40 位关键字作为RC4流加密算法
(加密的是path/body)
Https的作用
- 内容加密 建立一个信息安全通道,来保证数据传输的安全;
- 身份认证 确认网站的真实性
- 数据完整性 防止内容被第三方冒充或者篡改
HTTP(HyperText Transfer Protocal, 超文本传输协议)无状态、HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
tcp协议和udp协议的差别
差别 | TCP | UDP
---- | ----- | ----- | -----
是否连接 | 面向连接 | 面向非连接
传输可靠性 | 可靠 | 不可靠
应用场合 | 传输大量数据 | 少量数据
速度 | 慢 | 快
Node的中间件模式?
中间件 在 Node.js 中被广泛使用,它泛指一种特定的设计模式、一系列的处理单元、过滤器和处理程序。以函数的形式存在,连接在一起,形成一个异步队列,来完成对任何数据的预处理和后处理。
横向处理
灵活性:使用中间件我们用极少的操作就能得到一个插件
扩展性:用最简单的方法就能将新的过滤器和处理程序扩展到现有的系统上
-
koa-bodyparser
** 用来解析body的中间件,ctx.request中可以获取到对象形式的数据
** xml数据没办法通过koa-bodyparse解析,有另一个中间件koa-xml-body -
koa-logger
-
用来打印一些请求日志
-
koa2-cors
-
允许跨域请求
-
koa-jwt
-
校验token
-
koa-router
-
配置路由
-
crypto
-
加密数据(用户密码)
-
对称加密(Symmetric Cryptography)
-
对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key)。对称加密有很多种算法,由于它效率很高,所以被广泛使用在很多加密协议的核心当中
-
选择了Rijndael算法
-
非对称加密(Asymmetric Cryptography)
-
非对称加密为数据的加密与解密提供了一个非常安全的方法,它使用了一对密钥,公钥(public key)和私钥(private key)。私钥只能由一方安全保管,不能外泄,而公钥则可以发给任何请求它的人。非对称加密使用这对密钥中的一个进行加密,而解密则需要另一个密钥。比如,你向银行请求公钥,银行将公钥发给你,你使用公钥对消息加密,那么只有私钥的持有人--银行才能对你的消息解密。与对称加密不同的是,银行不需要将私钥通过网络发送出去,因此安全性大大提高
-
目前最常用的非对称加密算法是RSA算法
Promise的用法?
状态?
-
pending (正在处理)
-
reslove(正确返回)
-
reject(错误返回)
方法?
-
Promise.all([PromiseA, PromiseB]).then((resultA, resultB)=> {})
-
需等待多个异步方法成功相应
-
Promise.race([PromiseA, PromiseB]),then(resultA => {})
-
按结束时间只选择最快的结果
async/await?
使用 async / await, 搭配 promise, 可以通过编写形似同步的代码来处理异步流程, 提高代码的简洁性和可读性.
匿名函数、闭包?
匿名函数
- 通过表达式的自我执行
// 自我执行
(function (num){
alert(num);
})(100);
闭包
-
闭包指有权访问另一个函数作用域里变量的函数
-
使用闭包的优点(缺点),可以把局部变量驻留在内存中,避免使用全局变量(全局变量污染导致应用程序不可预测性,每个模块都可调用容易发生错误,所以推荐使用私有的,封装的局部变量)
//函数里放一个匿名函数---闭包
function box (){
return function(){
return 'Lee';
}
}
alert(box); //function box(){return function(){return 'Lee'}}
alert(box());//function (){return 'Lee'}
alert(box()());//Lee
关于this指向
this对象是在运行时基于函数的执行环境绑定的,如果this在全局范围就是window,如果是在对象内部,就指向这个对象,而闭包却是在运行时指向window的,因而闭包不属于这个对象的属性或方法。
MongoDB的优缺点?
优点
-
高性能
-
高可用性
-
易扩展性
-
丰富的查询语言,支持动态查询以及查询记录分析
-
面向文档存储(BSON,类JSON数据模式简单而强大)
-
查询与索引方式灵活,是最像SQL的Nosql
-
全索引支持,扩展到内部对象和内嵌数组
-
高效存储二进制大对象 (比如照片和视频)
-
复制和故障切换支持
-
Auto- Sharding自动分片支持云级扩展性
-
MapReduce 支持复杂聚合
缺点
- 不支持事务(进行开发时需要注意,哪些功能需要使用数据库提供的事务支持)
- MongoDB占用空间过大 (不过这个确定对于目前快速下跌的硬盘价格来说,也不算什么缺点了)
- MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方
- 在32位系统上,不支持大于2.5G的数据(很多操作系统都已经抛弃了32位版本,所以这个也算不上什么缺点了,3.4版本已经放弃支持32 位 x86平台)
- 大数据量持续插入,写入性能有较大波动
- 单机可靠性比较差
- 在集群分片中的数据分布不均匀
MongoDB支持存储过程吗?如果支持的话,怎么用?
- MongoDB支持存储过程,它是javascript写的,保存在db.system.js表中
关系型数据库与非关系型数据库的区别?
- NoSQL是非关系型数据库,NoSQL = Not Only SQL。
- 关系型数据库采用的结构化的数据,NoSQL采用的是键值对的方式存储数据。
- 在处理非结构化/半结构化的大数据时;在水平方向上进行扩展时;
- 随时应对动态增加的数据项时可以优先考虑使用NoSQL数据库。
- 在考虑数据库的成熟度;支持;分析和商业智能;管理及专业性等问题时,应优先考虑关系型数据库。
条件查询符?
- $gt ---- > (greater than)
- $lt ---- < (less than)
- $gte ---- >= (greater than equal)
- $lte ---- <= (less than equal)
- $ne ---- != 、<> (not equal)
- $in ---- in
- $nin ---- not in
- $all ---- all
- $or ---- or
- $not ---- 反匹配
为什么MongoDB的数据文件很大?
- MongoDB采用的预分配空间的方式来防止文件碎片。
当更新一个正在被迁移的块(Chunk)上的文档时会发生什么?
- 更新操作会立即发生在旧的块(Chunk)上,然后更改才会在所有权转移前复制到新的分片上。
MongoDB在A:{B,C}上建立索引,查询A:{B,C}和A:{C,B}都会使用索引吗?
- 不会,只会在A:{B,C}上使用索引。
如果一个分片(Shard)停止或很慢的时候,发起一个查询会怎样?
- 如果一个分片停止了,除非查询设置了“Partial”选项,否则查询会返回一个错误。如果一个分片响应很慢,MongoDB会等待它的响应。
Redis
简介
Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。
Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
- Redis支持数据的备份,即master-slave模式的数据备份。
Redis 优势
- 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
- 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
- Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
- Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
如何优化并发?
- node
- 异步非阻塞
- redis
- 开多个线程
- 对数据库操作
- 加索引
- 线程池
- 拆表
进程的管理工具?
pm2、supervisor、nodemon
数据库都有哪些?
-
关系型数据库
- mysql 、SQL Server、Oracle、Sybase、DB2
-
非关系型数据库
- mongoDB、Redis
网友评论