netty的整体流程

115 阅读1分钟

服务启动

//真正执行绑定的方法
AbstractBootstrap.dobind()
    initAndRegister()
        channelFactory.newChannel()通过ChannelFactory创建一个Channel,channelFactory默认表示为ReflectiveChannelFactory里面的constructor,反射创建的类为NioServerSocketChannel
            NioServerSocketChannel():上面方法会默认执行该无参构造方法
                ServerSocketChannel newSocket(SelectorProvider provider):NioServerSocketChannel的构造方法会自动调用该方法,会创建Java原生ServerSocketChannel
                NioServerSocketChannel(ServerSocketChannel channel):调用该构造方法,注册感兴趣的事件为读
                protected AbstractNioChannel(Channel parent, SelectableChannel ch, int readInterestOp) :调用该方法,设置channel为非阻塞
                AbstractChannel(Channel parent):创建id、unsafe,pipeline(默认为双向链表)
    void init(Channel channel):用来设置参数,添加handler,同时添加一个ServerBootstrapAcceptor
    config().group().register(channel):调用bossGroup注册channel
        next().register(channel);next实际为线程池选择器
        AbstractUnsafe#register0():
        protected void doRegister():key,将EventLoop中的Selector与Java原生的Channel绑定在一起,并返回这个SelectionKey
        
AbstractBootstrap#doBind0
    bstractChannel#bind(java.net.SocketAddress, io.netty.channel.ChannelPromise):最终调用java原生的channel绑定到一个本地地址

netty接收新连接

channelRead ():接收新连接的时候调用。Netty 底层接收新连接跟 Java 原生 Channel 是一致的,而且它的 select 是在 NioEventLooprun () 方法中
NioEventLooprun ():执行了nioselect方法,同时执行selectKeys方法
    NioEventLoop.select():进入阻塞方法
    NioEventLoop.processSelectedKeys():遍历selectedKeys,将NioServerSocketChannel以附件的形式取出
    NioServerSocketChannel#doReadMessages():调用Java原生的aacept()方法创建一个SocketChannel
    ServerBootstrapAcceptor:往子 ChannelPipeline 中添加子 ChannelHandler