Netty
你可能会说
Java 里为什么动不动就要提 Netty?写业务又用不上它?
Java 上基于 NIO 的异步事件驱动网络框架把 NIO 的 Selector、线程模型和缓冲区封装好,用 Channel / EventLoop / ByteBuf 组织代码。Spring Boot 内嵌的 Reactor Netty、gRPC-Java、Dubbo 底层都是它。日常写 CRUD 感知不到,写网关、RPC、推送这类长连接中间件才会直接碰。
也常被叫作Netty 框架
什么时候选它
- 网关、RPC、推送、游戏服务器等长连接中间件
- 要自己实现自定义 TCP / WebSocket 协议
- 连接数大,一连接一线程扛不住
什么时候别选
- 普通 Web 服务,Spring Boot 已经够用
- 团队没有网络编程经验,排错成本高
- 短连接、低 QPS,异步的复杂度换不来收益
容易混在一起 · 怎么分
Netty≠Tomcat
Tomcat 是 Servlet 容器,一个请求一个线程;Netty 是 NIO 框架,一个线程管一批连接。
Netty≠Spring WebFlux
WebFlux 是基于 Reactor 的编程模型,默认跑在 Netty 上;Netty 是更底层的网络框架。
Netty≠Java NIO
NIO 是 JDK 的 API;Netty 在它之上封装了线程模型、缓冲区池和协议编解码。
Q面试会问什么
- 问:Netty 为什么快?
答:主从 Reactor 多线程模型、ByteBuf 池化复用、零拷贝(CompositeByteBuf / FileRegion)减少内存复制。 - 问:粘包拆包怎么解决?
答:协议上约定长度字段、分隔符或定长,用 Netty 的 LengthFieldBasedFrameDecoder 等解码器处理。 - 问:EventLoop 和 Channel 什么关系?
答:一个 Channel 绑定一个 EventLoop,同一 EventLoop 串行处理它的 IO 事件,所以单连接内不用加锁。 - 问:写缓冲水位是什么?
答:Channel.isWritable 反映写缓冲是否过高,可据此做背压,避免内存被打爆。
延伸阅读 · 权威出处