Netty之主从Reactor多线程模型

Reactor模式用于解决高性能IO问题,特别适合处理海量的I/O事件,它是当前大多数IO组件所采用的IO模式。Netty网络框架就是基于Reactor模式进行设计和开发的,当请求抵达后,服务处理程序使用多路分配策略,同步地派发这些请求至相关的请求处理程序。

Netty可以通过配置不同参数实现不同Reactor线程模型,在Netty的官方demo中,推荐使用主从Reactor多线程模型,所以这里主要讲解常用的主从Reactor多线程模型。

主从Reactor线程模型的特点,服务端用于接收客户端连接的不再是个1个单独的NIO线程,而是一个独立的NIO线程池bossGroup。Acceptor接收到客户端TCP连接请求并处理完成后,将新创建的SocketChannel注册到workGroup线程池的某个IO线程上,由它负责SocketChannel的读写和编解码工作。

(1)bossGroup:监听ServerSocketChannel,接收到客户端连接请求后交由Acceptor处理,成功建立连接后将SocketChannel派发给workGroup。

(2)Acceptor:联想Socket编程大概也能猜到这是处理客户端请求链接的,Acceptor仅仅完成登录、握手和安全认证等操作,一旦链路建立成功,就将SocketChannel注册到后端workGroup线程池的IO线程上,由IO线程负责后续的IO操作。

(3)workGroup:监听SocketChannel的IO事件,完成编码、解码以及相应业务处理。

下面给出一个主从Reactor多线程模式的使用实例:

public class Server {
	public static void main(String[] args) throws Exception {
		// Configure the server
		// 创建两个EventLoopGroup对象
		// 创建boss线程组 ⽤于服务端接受客户端的连接
		EventLoopGroup bossGroup = new NioEventLoopGroup(2);
		// 创建 worker 线程组 ⽤于进⾏ SocketChannel 的数据读写
		EventLoopGroup workerGroup = new NioEventLoopGroup();
		try {
			// 创建 ServerBootstrap 对象
			ServerBootstrap b = new ServerBootstrap();
			// 设置使⽤的EventLoopGroup
			b.group(bossGroup, workerGroup)
			// 设置要被实例化的为 NioServerSocketChannel 类 
			.channel(NioServerSocketChannel.class)
			// 设置 NioServerSocketChannel 的处理器
			.handler(new LoggingHandler(LogLevel.INFO))
			// 设置连⼊服务端的 Client 的 SocketChannel 的处理器
			.childHandler(new ServerInitializer());
			// 绑定端⼝,并同步等待成功,即启动服务端
			ChannelFuture f = b.bind(8888);
			// 监听服务端关闭,并阻塞等待
			f.channel().closeFuture().sync();
		} finally {
			// 优雅关闭两个 EventLoopGroup 对象
			bossGroup.shutdownGracefully();
			workerGroup.shutdownGracefully();
		}
	}
}

猜你喜欢

转载自blog.csdn.net/wangpf2011/article/details/96473473