- 网络IO模型(BIO, NIO, 多路复用, AIO)
- Reactor模型
- 单Reactor单线程
- 单Reactor多线程
- 主从Reactor多线程
- 结论
1. Netty是什么
- 基于Reactor模型的高性能网络编程框架
- 异步事件驱动
- 底层对Java的nio作了封装
2. Netty特点
- 高并发:基于NIO开发的网络通信框架
- 传输快:零拷贝特性,同时内存池复用
- 封装好:封装了Java底层的很多细节,使用简单
- 功能多:预置了多种编解码功能,支持多种主流协议
3. 网络模型
见笔记:https://blog.csdn.net/qq_41157876/article/details/110505416
4. Reactor模型
- Reactor模型,是指通过一个或多个输入同时传递给服务处理器的服务请求的事件驱动处理模式
- Reactor模式也叫Dispatcher模式,即I/O多了复用统一监听事件,收到事件后分发(Dispatch给某进程),是编写高性能网络服务器的必备技术之一
(1)单Reactor单线程
- 所有I/O操作都由一个线程完成,即多路复用、事件分发和处理都是在一个Reactor线程上完成的。
- 既要接收客户端的连接请求,向服务端发起连接,又要发送/读取请求或应答/响应消息。一个NIO 线程同时处理成百上千的链路,性能上无法支撑,速度慢,若线程进入死循环,整个程序不可用,对于高负载、大并发的应用场景不合适
(2)单Reactor多线程
- 有一个NIO 线程(Acceptor) 只负责监听服务端,接收客户端的TCP 连接请求;NIO 线程池负责网络IO 的操作,即消息的读取、解码、编码和发送;1 个NIO 线程可以同时处理N 条链路,但是1 个链路只对应1 个NIO 线程,这是为了防止发生并发操作问题。但在并发百万客户端连接或需要安全认证时,一个Acceptor 线程可能会存在性能不足问题
(3)主从Reactor多线程
- Acceptor 线程用于绑定监听端口,接收客户端连接,将SocketChannel 从主线程池的Reactor 线程的多路复用器上移除,重新注册到Sub 线程池的线程上,用于处理I/O 的读写等操作,从而保证mainReactor只负责接入认证、握手等操作
- 每个Boss NioEventLoop循环执行的任务包含3步:
1 轮询accept事件
2 处理accept I/O事件,与Client建立连接,生成NioSocketChannel,并将NioSocketChannel注册到某个Worker NioEventLoop的Selector上
3 处理任务队列中的任务,runAllTasks。任务队列中的任务包括用户调用eventloop.execute或schedule执行的任务,或者其它线程提交到该eventloop的任务。
- 每个Worker NioEventLoop循环执行的任务包含3步:
1 轮询read、write事件;
2 处I/O事件,即read、write事件,在NioSocketChannel可读、可写事件发生时进行处理
3 处理任务队列中的任务,runAllTasks。
https://www.cnblogs.com/yangsanchao/p/13069330.html
https://blog.csdn.net/qq_33000453/article/details/103611001
https://blog.csdn.net/hbtj_1216/article/details/75331995
http://ifeve.com/%E8%B0%88%E8%B0%88netty%E7%9A%84%E7%BA%BF%E7%A8%8B%E6%A8%A1%E5%9E%8B/