Reactor模型
导读:在Neyyu权威指南2 ”Netty服务端创建“这一章节开头中,有这么一个前提条件,“概述是想要深入到学习Netty原理,通过阅读源码是最有效的方式之一。那么阅读源码,需要了解一定的基础是必要的。同时Reactor模式,是高性能网络编程的必知必会模式。
Netty服务端的创建需要必备: 1)熟悉JavaNIO主要类与库的使用 ;2)熟悉JDK的多线程便车给你; 3)了解Reactor模式”。针对于1和2,在学习java基础的时候必然已经学过,那么对于Reactor模式又是什么,通过以下的文章可以进一步了解到什么是Reactor模式,且Netty是如何使用Reactor模式的。
1.什么是Reactor(反应器设计)模式
Reactor模式 是一种「事件驱动」模式。
「Reactor线程模型」就是通过 单个线程 使用Java NIO包中的Selector的select()方法,进行监听。当获取到事件(如accept、read等)后,就会分配(dispatch)事件进行相应的事件处理(handle)。
如果要给 Reactor线程模型 下一个更明确的定义,应该是:
Reactor线程模式 = Reactor(I/O多路复用)+ 线程池
其中Reactor负责监听和分配事件,线程池负责处理事件。
2.Reactor模式种定义的角色
Reactor模型中定义的三种角色:
Reactor:负责监听和分配事件,将I/O事件分派给对应的Handler。新的事件包含连接建立就绪、读就绪、写就绪等。
Acceptor:处理客户端新连接,并分派请求到处理器链中。
Handler:将自身与事件绑定,执行非阻塞读/写任务,完成channel的读入,完成处理业务逻辑后,负责将结果写出channel。可用资源池来管理。
3.多线程IO的致命缺陷
最开始的网络编程的原理就是服务器用一个while循环,while循环不断监听是否有套接字进行连接,调用如下类似的函数进行处理
while(true){
socket = accept();
handle(socket)
}
这种方法的最大问题是无法并发,效率太低,如果当前的请求没有处理完,那么后面的请求只能被阻塞,服务器的吞吐量太低。
之后,想到了使用多线程,也就是很经典的connection per thread,每一个连接用一个线程处理,类似:
package com.crazymakercircle.iodemo.base;
import