目录
1. 目标
通过io.netty.channel和io.netty.bootstrap两个package,对netty进行总体认知。进一步查看netty对NIO的封装,了解源码实现,梳理类层次关系与源码流程。
2. io.netty.channel
3. io.netty.bootstrap
4. NIO封装
4.1. 主要类关系图
描述
一个bootstrap相当于一个client,包含一个eventloopgroup作为组,group包含多个eventloop,每个eventloop使用一个selector管理多个socketchannel的事件。
描述
一个server bootstrap 相当于一个server,包含两个eventloopgroup,一个负责serversocketChannel,一个负责socketchannel。
4.2. 写操作与读写事件时序图
4.3. NIOEventLoop行为的流程图
4.4. NioEventLoopGroup
class NioEventLoopGroup extends MultithreadEventLoopGroup
- 具有多个NIOEventLoop
- newChild,创建NioEventLoop
- rebuildSelectors,管理的child均重建selector,以绕开epoll的100%cpu bug
- super:MultithreadEventExecutorGroup
- EventExecutor[] children 其实引用的就是eventloop
- EventExecutorChooser chooser 选择器,默认时循环选择
4.5. NIOEventLoop
class NioEventLoop extends SingleThreadEventLoop
NIOEventLoop中引用selector,当前线程首次调用eventloop.execute()时,开始轮询检查是否有可用的event,据event类型,调用channel pipeline的对应操作。详细流程见上图。
4.6. NioServerSocketChannel
extends AbstractNioMessageChannel
implements io.netty.channel.socket.ServerSocketChannel
主要作用:
调用javaChannel()获取到JDK NIO ServerSocketChannel,并进行操作。
如:调用accept(),接收SocketChannel连接,生成NIOSocketChannel
4.7. NioSocketChannel
extends AbstractNioByteChannel implements io.netty.channel.socket.SocketChannel
调用javaChannel()获取JDK NIO SocketChannel,并进行操作。
如:读写bytebuf
4.8. 其他类
AbstractNioByteChannel
AbstractNioMessageChannel
AbstractNioChannel