一、什么是Netty?
Netty提供了易于使用的API的客户端/服务器框架
特点:
- 并发高 - NIO
- 传输快 - 零拷贝
二、阻塞与非阻塞
线程访问资源的时候,该资源是否准备就绪的一种处理方式。如果资源此时没有准备就绪,这个时候就有两种处理方式:阻塞和非阻塞。阻塞指这个线程会一直持续等待这个资源处理完毕,直到它响应返回一个结果,这个时候线程不可以去做任何事情。非阻塞是指这个线程会直接返回结果可以去做其他的事情。
三、同步和异步
同步和异步是指访问数据的一种机制。
同步是指线程主动请求并且等待IO处理完成之后给一个通知
异步是指线程主动请求数据之后可以继续去处理其他的任务,可以发起其他的请求。当请求处理完成之后通过某种特定的通知方式去通知线程。
四、BIO
同步阻塞,Block IO
IO在进行读写的时候,这个线程是会被阻塞的,这个线程无法去进行其他的操作。使用起来非常方便,但是对于并发处理的能力非常低,并且线程之间访问资源的耗时也是比较久的。会比较依赖于网速和带宽。在JDK1.4之前都是这样子的。
- 上厕所,厕所的坑都满了,我必须要主动地去看那个坑的位置腾出来了,我就可以开心地去上厕所了,这种方式就是BIO
五、NIO
同步非阻塞,New IO(Non-Block IO)
- 同样是上厕所,坑满了,我不会像之前那样干等着,我会出去抽根烟或者拿起手机摇一摇,不会干等着,期间我会时不时主动地回厕所看一下有没有坑释放。
NIO是JDK1.4之后出现的。NIO有几个相关概念,如下:
相关概念
- selector:选择器、多路复用器
- buffer:缓冲区
- channel:通道
图中有一个server,三个客户端,客户端在通信的时候会使用selector选择器,selector就是一个线程,这个线程会主动地轮询。如果client1和server要进行连接的时候,会向selector进行注册,注册完毕之后就会有一个channel1,每一个客户端和selector建立连接之后都会有一个channel,channel是一个双向通道,它可以进行一些相应的数据的读写,这些数据的读写都会到buffer缓冲区里面去,去进行非阻塞的读写。selector多路复用器是一个单线程,它的性能特别强大,可以处理成千上万的请求,客户端的增多不会影响它的性能。channel和client是一对一的,每一个channel都会对应一个client,每一个服务端都会有一个selector,buffer中的数据会被用于读写,每次读完之后都会存在buffer中,并不会消失。
六、异步阻塞IO
实际开发中用不到。
上厕所,坑满了,我比较懒,我就干等着,然后有一个坑满了之后我也不会主动去蹲,而是等着释放坑的那个人通知我让我去用,这种方式是比较傻的。
七、AIO
异步非阻塞IO
上厕所,坑满了,我没有在厕所里面干等着,我是在厕所外面干着其他的事情,厕所的坑位用户用完了出来会通知我让我进去蹲坑,这个时候才去蹲坑。
非阻塞异步的通信方式,在NIO原有的基础上引入了一个异步的概念,在读写的时候它的所有的返回类型都是一个future对象, 它有相应的事件监听。
八、BIO、NIO、AIO对比
BIO、NIO、AIO对比九、再看Netty
Dubbo底层是用的Netty,大型项目很多都是用的Netty。
Netty线程模型(Reactor)
首先我们来看看单线程模型:所有的IO操作都是由同一个NIO线程处理的。
在一些复杂场景(高负载、高兵发)中使用该线程不太合适,主要是因为单线程去处理成百上千的请求的时候它的性能会支撑不了。
多线程模型:由一组NIO线程处理IO操作
多线程模型
左边的单线程用于处理客户端链接,然后将请求丢给后面的Reactor线程池,这样以来就相当于有一个专门的线程去监听我们的客户端应用。对于一些额外的读写请求都会交给线程池去完成。
主从线程模型:一组线程池接受请求,一组线程池处理IO
主从线程模型
网友评论