我们在上一篇文章中了解到,Netty 是对 NIO 模型的支持。讲到 NIO 模型,那么我们就必须要了解一下 Reactor 模式。
Reactor 设计模式是 event-drivenarchitecture 的一种实现方式,处理多个客户端并发的向服务端请求服务的场景。它主要有三种线程模型,单线程模型、多线程模型和主从多线程模型。它的核心流程如下:
注册感兴趣的事件 --> 扫描是否有感兴趣的事件发生 --> 事件发生后做出相应的处理。
单线程就是将 Acceptor 的处理和 Handler 的处理都在同一个线程中。一个请求对应一个 Handler。这边当请求量增加的时候 handler 也会增加,如果有一批 Handler 处理时间比较长,没有处理完成,那么就有可能导致新请求的连接请求不进来。
它与单线程相比,处理的 Handler 放在了一个线程池里面,每次请求数据的时候会从线程池里面获取,而不是单独开启一个线程。当客户端请求量增加的时候,如果 Handler 没有处理完,那么只能够等待,等待线程池中的线程释放。
主从 Reactor 模型和多线程模型类型,只是在主从 Reactor 多线程模型的 Acceptor 线程池中获取线程,然后通过认证鉴权后进行派遣,再分配给 Reactor 线程池进行处理。
上面我们讲到 Reactor 模式的核心流程:注册感兴趣的事件 --> 扫描是否有感兴趣的事件发生 --> 事件发生后做出相应的处理。在 Netty 中,对应的类监听事件如下:
client/Server | SocketChannel/ ServerSocketChannel |
OP_ACCEPT | OP_CONNECT | OP_WRITE | OP_READ |
---|---|---|---|---|---|
client | SocketChannel | Y | Y | Y | |
server | ServerSocketChannel | Y | |||
server | SocketChannel | Y | Y |
模式 | 使用代码 |
---|---|
Reactor 单线程模式 | EventLoopGroup eventGroup = new NioEventLoopGroup(1); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(eventGroup); |
Reactor 多线程模式 | EventLoopGroup eventGroup = new NioEventLoopGroup(); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(eventGroup); |
主从 Reactor 多线程模式 | EventLoopGroup bossGroup = new NioEventLoopGroup(); EventLoopGroup workerGroup = new NioEventLoopGroup(); ServerBootstrap serverBootstrap = new ServerBootstrap(); serverBootstrap.group(bossGroup,workerGroup); |
从上面的代码中可以看到 Netty 对 Reactor 模式的支持切换的方便性。
本章节我们了解到了三种 Reactor 模式,并且简单的介绍了 Netty 中对 Reactor 模式的支持方式。单线程模式是一个请求对应一个处理线程,多线程模式是一个请求然后利用线程池来处理。主从线程是将请求接收用一个线程处理,具体的处理逻辑用另外一个线程处理,各司其职,提升效率。