基本组成

从图中可以看出,netty主要涉及以下几个部分
- NioEventLoop:netty的核心发动机,在死循环中select OP_READ/OP_ACCEPT事件
- Channel:把NIO中SocketChannel封装成netty的NioSocketChannel(接收客户端连接后创建的channel);把NIO中ServerSocketChannel封装成netty的NioServerSocketChannel(netty server端启动时创建,绑定服务端端口);
- ByteBuf:对channel中数据进行读写
- Pipeline:把用户业务逻辑使用责任链串联起来,后面用户读写用户数据时会经过责任链中每个节点进行处理(接收到客户端连接创建NioSocketChannel时创建)
- ChannelHandler:pipeline中的节点,负责处理具体的业务逻辑
基本流程

NioEventLoop结构

- Group相关类:都从JDK提供的ExecutorService继承而来,因此明显是提供线程池相关的能力;
- Executor相关类:都从JDK提供的AbstractExecutorService继承而来
Channel结构

- AbstractChannel:提供channel的基础功能包含unsafe/pipeline/eventLoop等
- AbstractNioChannel:增加了Nio相关功能包含SelectableChannel/SelectionKey/readInterestOp等
- AbstractNioMessageChannel:服务端channel基础类,提供服务端channel的doReadMessages/doWriteMessage抽象方法
- AbstractNioByteChannel:客户端channel基础类,提供客户端channel的doReadBytes/doWriteBytes抽象方法
- NioServerSocketChannel:服务端channel具体类,主要个性化的重写各个父类提供的抽象方法
- NioSocketChannel:客户端channel具体类,主要个性化的重写各个父类提供的抽象方法
- Unsafe相关类:Channel ~> AbstractChannel ~> AbstractNioChannel ~> AbstractNioByteChannel ~> NioSocketChannel 中分别有一个对应的内部类 Unsafe ~> AbstractUnsafe ~> AbstractNioUnsafe ~> NioByteUnsafe ~> NioSocketChannelUnsafe;Channel的IO操作都是委托给Unsafe,例如:read/write/bind/register/close等等
- NioServerSocketChannel和NioSocketChannel几点区别:
- 向父类注册的事件不同,NioServerSocketChannel是accept, NioSocketChannel是read
- NioServerSocketChannel的read操作是指读取一条连接,NioSocketChannel是指读取IO数据
网友评论