Netty主要组件和服务器启动源码分析
1. Netty服务端启动代码
public class NettyServer {public static void main(String[] args) throws InterruptedException {EventLoopGroup bossGroup = new NioEventLoopGroup(1); // 只处理 acceptEventLoopGroup workerGroup = new NioEventLoopGroup(); // 处理读写try {ServerBootstrap bootstrap = new ServerBootstrap();bootstrap.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) {ch.pipeline().addLast(new SimpleServerHandler());}});ChannelFuture future = bootstrap.bind(8080).sync();future.channel().closeFuture().sync();} finally {bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}
2. 核心组件结构解析和继承结构图
2.1 NioEventLoopGroup是什么
NioEventLoopGroup是Netty的线程组抽象,本质是一个线程池,管理多个NioEventLoop。
-
bossGroup:用于接收连接(注册 NioServerSocketChannel)
-
workerGroup:处理读写请求(绑定 NioSocketChannel)
每个 NioEventLoop 是一个线程,绑定多个 channel,负责事件循环。
2.2 NioEventLoopGroup继承结构图
从继承类图上看,NioEventLoopGroup通过继承EventExecutorGroup实现了Iterable 和 ScheduledExecutorService 接口,因此它是一个可迭代的事件执行器组,并支持定时任务和延迟任务调度功能,用于事件循环线程模型中。
2.3 NioEventLoop是什么
-
实现了 Runnable,每个线程在run()中使用Selector.select() 轮询事件。
-
内部维护一个任务队列(runAllTasks() 执行)
职责:
-
监听 selector 的事件(OP_ACCEPT, OP_READ 等)
-
执行 IO 操作(读、写)
-
执行任务队列(如异步 execute() 的任务)
2.4 NioEventLoop继承结构图
这个类本质上就是一个线程,它实现各个类主要有以下这些
1.AbstractEventExecutor
-
是EventExecutor的基础实现
-
提供默认的 schedule()、next() 等通用方法
-
支持异步执行和定时任务接口
2. SingleThreadEventExecutor
-
真正管理线程执行循环的地方。
-
封装了Thread、BlockingQueue 等核心成员。
-
实现了任务队列、线程启动、线程终止等控制逻辑。
-
提供核心的runAllTasks()、execute()、shutdown()等方法。
3.SingleThreadEventLoop
-
是EventLoop的基础实现,添加了和Channel绑定的逻辑。
-
每个EventLoop绑定多个 Channel,控制生命周期。
-
提供register(Channel) 方法。
4.NioEventLoop
-
最终实现类,专门用于 Java NIO 的事件处理(使用 Selector)
-
线程循环中调用 selector.select() 检查就绪事件(如 OP_ACCEPT、OP_READ)
-
处理IO操作,并执行 runAllTasks() 执行任务队列
2.5 NioServerSocketChannel是什么
NioServerSocketChannel是Netty提供的服务端Channel类型,主要用于在服务器端监听客户端连接请求的通道,本质上是对java.nio.channels.ServerSocketChannel的封装。
2.6 ChannelPipeline是什么
ChannelPipeline 是 Netty 中的核心组件之一,可以理解为:
- 一个责任链模式(链式处理器结构),用来管理和调度所有的ChannelHandler,从而对Channel中的数据进行编码、解码、业务处理等操作。
它的核心职责主要是:
- 管理Handler维护一个双向链表结构的多个ChannelHandlerContext。
- 分发事件把Netty I/O 事件(读、写、连接等)分发给对应的 ChannelHandler。
- 支持链式操作addLast, addFirst, remove, replace等动态操作。
- 分离 I/O 和业务 把编码解码逻辑、业务逻辑分散在不同 Handler 中,解耦合
数据进出流程
入站(Inbound)事件传播: 比如:收到数据,触发 channelRead():调用的顺序是HeadContext → Decoder → BusinessHandler → TailContext,每个Handler都可以调用ctx.fireChannelRead(msg)
把事件传播下去。
出站(Outbound)事件传播: 比如:调用 ctx.write() 或 channel.write():调用顺序是TailContext → Encoder → BusinessHandler → HeadContext,写数据一般从尾部逆向传播,直到HeadContext调用底层写操作。
2.7 Unsafe是什么
Channel.Unsafe是Netty提供的底层通道操作接口,封装了 I/O 原语、Selector 注册、读写、关闭等敏感操作。它是Channel的一个内部接口,只有 Netty自己框架内部使用,用户不应该直接调用。
它的主要作用有这些,我画个表格说明:
方法 | 功能说明 |
---|---|
register() | 向 Selector 注册 Channel |
bind() | 绑定端口 |
connect() | 客户端连接远程地址 |
beginRead() | 注册读事件 |
write() / flush() | 执行底层写操作 |
close() | 关闭连接 |
2.8 ByteBuf是什么
所有数据收发都基于ByteBuf,而非传统的Java NIO ByteBuffer,下面给出一个表格说明一下:
类名 | 描述 |
---|---|
ByteBuf | Netty 自定义缓冲区,替代 ByteBuffer |
Unpooled | 创建非池化的 ByteBuf |
PooledByteBufAllocator | 池化内存分配器(性能更优) |
2.9 Future Promise是什么
Netty 所有操作都是异步的,比如 bind(), write() 都返回 ChannelFuture,下面给出一个表格说明一下:
类名 | 描述 |
---|---|
ChannelFuture | 异步操作的结果,比如 bind、connect |