3.Netty全局入口Bootstrap
总结
- Bootstrap 用于客户端,绑定一个 EventLoopGroup;ServerBootstrap 用于服务端,绑定 Boss 和 Worker 两个
- Boss 只负责接受连接,Worker 负责处理读写,职责分离是 Netty 高性能的关键之一
- 启动流程:配置线程池 → 注册 Channel 类型 → 配置 Handler 链 → 绑定端口
1. Bootstrap vs ServerBootstrap
两者都继承自 AbstractBootstrap,区别就一个:绑定几个 EventLoopGroup。

| Bootstrap(客户端) | ServerBootstrap(服务端) | |
|---|---|---|
| 用途 | 连接远端服务器 | 监听本地端口,接受连接 |
| EventLoopGroup | 1 个 | 2 个(Boss + Worker) |
2. Boss 和 Worker 是什么关系?
可以理解成"老板"和"员工":
- Boss:只负责不停地接受新连接,连接建立后立刻交出去
- Worker:接手 Boss 分配过来的连接,负责后续所有的读写处理
Boss 不干活,专门揽活;Worker 专门干活,不管揽活。职责分离让两边都能高效运转。
对应到 2.Netty整体架构 里的 Boss EventLoopGroup 和 Worker EventLoopGroup。
3. 服务端启动代码
启动分三步:配置线程池 → 注册 Channel → 绑定端口。
public static void main(String[] args) throws InterruptedException {
// 1. 配置线程池(主从多线程模型)
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap
.group(bossGroup, workerGroup)
// 2. 注册 Channel 类型
.channel(NioServerSocketChannel.class)
.childOption(ChannelOption.SO_KEEPALIVE, true)
// 3. 配置 Handler 链(每个新连接都会执行 initChannel)
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
protected void initChannel(SocketChannel ch) {
ch.pipeline()
.addLast("codec", new HttpServerCodec()) // HTTP 编解码
.addLast("compressor", new HttpContentCompressor()) // 响应压缩
.addLast("aggregator", new HttpObjectAggregator(65536)) // 消息聚合
.addLast("handler", new HttpServerHandler()); // 业务逻辑
}
});
// 4. 绑定端口,sync() 等待绑定完成
ChannelFuture channelFuture = serverBootstrap.bind(8080).sync();
// 阻塞主线程,直到 Channel 关闭
channelFuture.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
}
}
几个细节值得注意:
childOption和childHandler是配置 Worker 处理的 Channel,option和handler(不带 child)是配置 Boss 的 ServerChannelChannelInitializer是个特殊的 Handler,连接建立时触发initChannel初始化 Pipeline,初始化完成后自动从 Pipeline 里移除自身bind().sync()是异步转同步,底层 bind 是异步的,sync()让主线程等绑定完成再往下走closeFuture().sync()让主线程挂起,服务端才能持续运行;关闭 Channel 后这里会解除阻塞,然后执行finally里的优雅关闭