选型

Netty

你可能会说

Java 里为什么动不动就要提 Netty?写业务又用不上它?

Java 上基于 NIO 的异步事件驱动网络框架把 NIO 的 Selector、线程模型和缓冲区封装好,用 Channel / EventLoop / ByteBuf 组织代码。Spring Boot 内嵌的 Reactor Netty、gRPC-Java、Dubbo 底层都是它。日常写 CRUD 感知不到,写网关、RPC、推送这类长连接中间件才会直接碰。
也常被叫作Netty 框架
先问一句要写高并发长连接的中间件?
默认Netty→擅长异步 + 自定义协议→别用普通 CRUD 业务
成熟度采用

什么时候选它

  • 网关、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 反映写缓冲是否过高,可据此做背压,避免内存被打爆。
延伸阅读 · 权威出处