一、Netty是个啥?
前面几篇介绍了Nio的一些知识,下面正式开始学习Netty。
可以从下面几点介绍Netty:
- 异步的,基于事件驱动的高性能的网络应用程序框架
- 底层是对Nio的进一步的封装
- 有自己的线程模型
其他的暂时想不起来了
二、线程模型是个啥?
常见的线程模型有两种:
- 传统阻塞io模型
- Reactor模型
- 单Reactor单线程
- 单Reactor多线程
- 主从Reactor多线程
上面的这个分类是不是看不懂?那就通过图来研究先上面说的内容...
1、传统阻塞线程模型
上个图
这个是我们常见的一种线程模型,特点如下:
- 一个连接对应一个线程。连接数多时,线程数也多,这样势必造成系统资源的浪费。
- 连接建立后,加入没有数据可读,线程会阻塞在read的操作这边,线程就阻塞了,也是浪费资源。
2、Reactor模式(Dispatcher模式)
上面的模型总结下会有两个解决办法:
- io复用。
- 使用线程池。
基于这两个解决办法再去看Reactor模型。
2.1 单Reactor单线程
上图:
和上面的传统的阻塞线程模型比较的话,这个模型多出了一个Reactor对象去处理请求,对于过来的请求通多dispather进行分发。
问题在于处理业务的能力还是太弱了。
2.2 单Reactor多线程
上图:
这个图和上面的模型比较,加入了线程池去处理业务操作。
简单说明下:Handler对象通过read方法去读取请求内容,然后进行分发,分发给线程池中的线程去处理,处理的结果返回给Handler对象,最终通过send方法返回给上层。
这个模型虽然解决了业务处理的问题,还是没有解决请求过多导致的Reactor瓶颈问题。
2.3 主从Reactor多线程
上图:
这个模型和上面的模型比较,分出了主从Reactor线程去处理不同的请求。主线程用来处理连接请求,子线程用来处理除连接请求外的请求。