当你开始做长连接TCP/WebSocket或高并发网关时Java 原生 NIO 很快会让你陷入“Selector、ByteBuffer、状态机、粘拆包、异常处理”这些细节里。Netty 的价值是把这些复杂度抽象成可组合的组件让你专注业务协议和连接治理。这篇文章按“面试能说清 实战能落地”的顺序梳理 Netty 的核心。阅读目标看完能讲清Reactor 线程模型、Pipeline、粘拆包、ByteBuf、背压分别在解决什么问题看完能落地你能写出一套“可上线”的 Pipeline 结构编解码 心跳 鉴权 业务目录一句话理解 Netty为什么用 NettyReactor 线程模型Channel / Handler / Pipeline粘包/拆包与解码器ByteBuf 与内存管理背压Backpressure一套可复用的 Pipeline 结构示例常见坑与排障清单30 秒面试模板1. 一句话理解 NettyNetty 是一个高性能 Java 网络通信框架基于 NIO 的事件驱动模型封装 TCP/UDP/WebSocket 等协议实现核心是Reactor 线程模型Boss/Worker/EventLoopChannelPipeline责任链式处理2. 为什么用 Netty它替你解决了什么原生 NIO 能做但很难“写对、写稳、写可维护”。Netty 提供线程模型封装Boss/WorkerPipeline 编排入站/出站 handler编解码与粘拆包处理更好用的 BufferByteBuf与内存管理高并发下的背压控制能力3. Reactor 线程模型必考你可以按这段背BossGroup负责 accept 新连接WorkerGroup负责读写事件read/writeEventLoop一个线程可以管理多个 Channel负责事件循环为什么它能抗并发少量线程复用处理大量连接避免“1 连接 1 线程”的线程上下文切换与内存开销4. Channel / Handler / Pipeline核心抽象Channel连接抽象TCP 连接Handler处理单元入站/出站ChannelPipeline按顺序组织 handler 的处理链事件传播规则经典面试点Inbound读、channelActive 等从头到尾Outbound写、flush 等从尾到头5. 粘包/拆包TCP 经典必问5.1 为什么会粘拆包TCP 是字节流协议发送端 write 的“消息边界”不保证在接收端保持接收端读到的是一段连续字节需要你自己划分消息5.2 解决方案背 3 种就够定长消息每条固定长度分隔符如\n行协议长度字段包头带 length最通用Netty 常用LengthFieldBasedFrameDecoder5.3LengthFieldBasedFrameDecoder怎么讲面试加分它的核心思想是先从字节流里读出“长度字段”再按该长度切出一帧完整消息交给后续 Handler你只要能说清 3 个参数就够lengthFieldOffset长度字段在包头的偏移lengthFieldLength长度字段本身占几个字节lengthAdjustment总长度与业务长度的差有没有包含包头6. ByteBuf 与内存管理加分点ByteBuf 相比 ByteBuffer 的优势读写指针更好用支持池化减少频繁分配但 ByteBuf 有“引用计数”概念忘记release()会造成内存泄漏重复释放会导致异常排障建议打开 leak detector开发/压测阶段统一在 handler 中明确谁负责释放7. 背压Backpressure线上稳定性关键高并发下“写得比网络发送快”会导致发送缓冲区堆积最终 OOM 或延迟暴涨Netty 提供的背压信号Channel.isWritable()ChannelWritabilityChanged事件常见策略降速丢弃可接受的场景排队要有上限熔断/降级补一句更“线上化”的背压不是为了“更快”是为了“在流量洪峰下不崩”保证系统能降级而不是 OOM。8. 一套可复用的 Pipeline 结构示例更像真实项目下面是一套“长连接/自定义协议”常见的 Pipeline 结构思路级别帧解码解决粘拆包业务编解码ByteBuf - Message空闲检测/心跳保活 断线发现鉴权绑定 userId业务 Handler推送/订阅/路由示例伪代码结构强调顺序ChannelPipelinepch.pipeline();// 1) 粘拆包长度字段协议示例p.addLast(newLengthFieldBasedFrameDecoder(1024*1024,// maxFrameLength0,// lengthFieldOffset4,// lengthFieldLength0,// lengthAdjustment4// initialBytesToStrip去掉长度字段));// 2) 编解码ByteBuf - Messagep.addLast(newMessageDecoder());p.addLast(newMessageEncoder());// 3) 心跳/空闲检测p.addLast(newIdleStateHandler(60,0,0));p.addLast(newHeartbeatHandler());// 4) 鉴权p.addLast(newAuthHandler());// 5) 业务处理p.addLast(newBusinessHandler());如果你的场景是 WebSocket而不是自定义 TCP 协议则解码器会换成 WebSocket 的 codec但“心跳 鉴权 业务 handler”的结构仍然类似。9. 常见坑与排障清单粘拆包没处理表现为消息随机截断/合并解决定长/分隔符/长度字段首推长度字段ByteBuf 泄漏压测一会儿就内存涨解决明确 release 责任开发阶段打开 leak detector业务 Handler 里做阻塞操作导致 EventLoop 卡死解决把耗时任务丢到业务线程池EventLoop 只做 IO 与轻量逻辑写入过快导致缓冲区堆积解决用isWritable做背压队列必须有上限连接保活问题NAT/LB timeout解决IdleState 心跳心跳周期小于网关 idle timeout10. 30 秒面试模板如果你项目里有 WebSocket/长连接网关你可以这样表达我用 Netty或 Netty 思想处理长连接核心是 Reactor 线程模型和 Pipeline。Pipeline 里按顺序挂编解码、鉴权、心跳、业务 handler。针对 TCP 粘拆包用长度字段协议/解码器保证消息边界。针对高并发写入用isWritable做背压治理避免缓冲区堆积。Netty 是基于 NIO 的高性能网络框架核心是 Reactor 线程模型Boss/Worker/EventLoop和 ChannelPipeline。它把线程模型、编解码、粘拆包、Buffer 管理这些复杂点封装好。面试我会重点讲线程模型、Pipeline 入站/出站传播、长度字段解决粘拆包、ByteBuf 引用计数以及用isWritable/事件做背压治理保证高并发下系统不崩。