· 字数:153·阅读时间 1 分钟 阅读量

网关的线程模型

NIO的核心实现

NIO的核心API Buffer,channel,selecter。

channel与流的区别

对比 channel
读写 同时进行读写 只能读或者写
异步 可以异步读写
异步 通道可以写缓冲区,也可以从缓冲区读

buffer

缓冲区本质上是一个可以写入数据的内存块,然后可以再次读取,该对象提供了一组方法,可以更轻松地使用内存块,使用缓冲区读取和写入数据通常遵循以下四个步骤:

  1. 写数据到缓冲区;

  2. 调用buffer.flip()方法;

  3. 从缓冲区中读取数据;

  4. 调用buffer.clear()或buffer.compat()方法;

当向buffer写入数据时,buffer会记录下写了多少数据,一旦要读取数据,需要通过flip()方法将Buffer从写模式切换到读模式,在读模式下可以读取之前写入到buffer的所有数据,一旦读完了所有的数据,就需要清空缓冲区,让它可以再次被写入。

参考文章:https://www.jianshu.com/p/362b365e1bcc

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;
    }
  1. 当 EventLoopGroup bossGroup = new NioEventLoopGroup()不填值时,默认为cpu核数*2
  2. 当 EventLoopGroup bossGroup = new NioEventLoopGroup()不填值时,默认为cpu核数*2