网关的线程模型
NIO的核心实现
NIO的核心API Buffer,channel,selecter。
channel与流的区别
对比 | channel | 流 |
---|---|---|
读写 | 同时进行读写 | 只能读或者写 |
异步 | 可以异步读写 | |
异步 | 通道可以写缓冲区,也可以从缓冲区读 |
buffer
缓冲区本质上是一个可以写入数据的内存块,然后可以再次读取,该对象提供了一组方法,可以更轻松地使用内存块,使用缓冲区读取和写入数据通常遵循以下四个步骤:
写数据到缓冲区;
调用buffer.flip()方法;
从缓冲区中读取数据;
调用buffer.clear()或buffer.compat()方法;
当向buffer写入数据时,buffer会记录下写了多少数据,一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式,在读模式下可以读取之前写入到buffer的所有数据,一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。
Netty的线程模型
Netty的线程模型主要有单线程Reactor模型,多线程Reactor,主从多线程Reactor模型。
ServerBootstrap bootstrap = new ServerBootstrap();
//绑定线程池
bootstrap.group(bossGroup, workGroup)
.channel(NioServerSocketChannel.class) //指定使用的channel
.option(ChannelOption.SO_REUSEADDR, serverConfig.isReUseAddr())
.option(ChannelOption.SO_BACKLOG, serverConfig.getBackLog())
.childOption(ChannelOption.SO_RCVBUF, serverConfig.getRevBuf())
.childOption(ChannelOption.SO_SNDBUF, serverConfig.getSndBuf())
.childOption(ChannelOption.TCP_NODELAY, serverConfig.isTcpNoDelay())
.childOption(ChannelOption.SO_KEEPALIVE, serverConfig.isKeepalive())
.childHandler(initChildHandler());
查看Netty的源码io.netty.bootstrap.ServerBootstrap.java,知道如下:
/**
* Specify the {@link EventLoopGroup} which is used for the parent (acceptor) and the child (client).
* 这里的单参数即为连接与请求处理线程-是公用的线程池
*/
@Override
public ServerBootstrap group(EventLoopGroup group) {
return group(group, group);
}
/**
* Set the {@link EventLoopGroup} for the parent (acceptor) and the child (client). These
* {@link EventLoopGroup}'s are used to handle all the events and IO for {@link ServerChannel} and
* {@link Channel}'s.
*/
public ServerBootstrap group(EventLoopGroup parentGroup, EventLoopGroup childGroup) {
super.group(parentGroup);
ObjectUtil.checkNotNull(childGroup, "childGroup");
if (this.childGroup != null) {
throw new IllegalStateException("childGroup set already");
}
this.childGroup = childGroup;
return this;
}
- 当 EventLoopGroup bossGroup = new NioEventLoopGroup()不填值时,默认为cpu核数*2
- 当 EventLoopGroup bossGroup = new NioEventLoopGroup()不填值时,默认为cpu核数*2