Netty源码分析基于主流的Netty4.x版本。
一. Netty模型
目前IO模型分为BIO,NIO,AIO三种
- BIO为堵塞模型
- NIO模型基于IO多路复用技术
- AIO模型是真正的异步非堵塞的模型
以去营业厅办事为例:
BIO: 要求你一直在营业厅排队等待,啥事也没法做,直到处理完。
NIO: 是营业厅改进了服务,给你一个号码,提供了显示屏,你只要时不时抬头看看是不是轮到了你的号码,期间可以忙些其他事情。
AIO: 营业厅提供了线上预约服务,预约轮到你,短信提醒你去营业厅办理。
Netty 4.x线程模型基于reactor模型,这是基于NIO模型的技术。
reactor模型有可以分为单线程模型,多线程模型,主从模型。
- 单线程模型
所有操作都在一个NIO线程完成,包括接收,读写操作。 - 多线程模型
根据功能进行了区分,一个NIO线程处理接收操作,一个NIO线程池处理读写操作。 - 主从模型
在多线程模型基础上,一个NIO线程池进行接收操作,一个NIO线程池处理读写操作。
二. Demo
下例为demo,为后续Netty服务端源码文章的demo。
public class NioServer {
public void bind(String host, int port) {
NioEventLoopGroup parentGroup = new NioEventLoopGroup();
NioEventLoopGroup workGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(parentGroup, workGroup)
.channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 128)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) throws Exception {
}
});
try {
ChannelFuture future = serverBootstrap.bind(host, port).sync();
future.channel().closeFuture().sync();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
在上例中, serverBootstrap.group(parentGroup, workGroup)操作,就是设置parentGroup作为接收连接的线程池,workGroup作为处理读写的线程池。