netty 框架是 Java 生态里面非常主流的异步事件驱动网络通信框架,核心作用就是简化 TCP UDP 自定义协议的网络编程,底层基于 NIO 实现,帮开发者封装好原生 Java NIO 里面复杂的 Selector 通道 缓冲区 线程模型这些繁琐代码,不用自己手写底层 IO 轮询 拆包粘包处理 连接管理 心跳重连 编解码逻辑,就可以快速开发高并发长连接服务端和客户端,很多中间件和分布式系统底层都在用 netty 框架,比如 dubbo rocketmq grpc elasticsearch,它适合海量客户端同时保持长连接的业务场景,像即时通讯 游戏服务器 物联网设备通信 消息推送,相比传统 BIO 阻塞 IO,netty 框架单台服务器可以支撑几万甚至几十万并发连接,资源消耗更低,吞吐量更高,原生 JDK NIO 虽然也能写网络程序,但是代码复杂容易出现空轮询 bug,netty 框架把这些坑都做了修复和封装,开发效率和稳定性都提升很多。
核心能力表格
| 能力项目 | 详细说明 |
|---|---|
| 异步非阻塞 IO | 基于 NIO,单线程可以管理大量连接,不会因为等待读写阻塞线程 |
| Channel 通道 | 代表一条网络连接,所有读写操作都绑定在 Channel 对象上 |
| Pipeline 管道 | 责任链设计模式,多个 Handler 依次处理入站出站数据 |
| 编解码支持 | 内置常用解码器,解决粘包拆包,支持自定义协议编解码 |
| 线程模型 | 主从 Reactor 多线程模型,boss 线程接收连接,worker 线程处理读写 |
| 内置工具 | 心跳检测 空闲连接回收 重连 SSL 加密 流量控制 |
深度详细说明
为什么要使用 netty 框架
原生 Java NIO 写网络服务,开发者需要自己维护 Selector 注册事件,处理 IO 就绪事件,还要手动处理半包粘包,处理异常断连,编写大量重复样板代码,稍微不注意就会出现内存泄漏 线程阻塞 空轮询 CPU 跑满这类问题。netty 框架把这些通用能力全部封装,开发者只需要编写业务 Handler,重点处理业务消息,不用关心底层 IO 细节。它不是 Web 框架,不能替代 SpringMVC,netty 专注底层网络传输,不负责 HTTP 业务路由 MVC 控制器,当然 netty 也内置 HTTP codec,可以实现简易 HTTP 服务,但是它主战场还是 TCP 长连接自定义协议通信。
典型应用场景
1 分布式 RPC 框架底层通信层,dubbo 就是依靠 netty 框架完成服务提供者和消费者之间的数据传输
2 即时通讯 IM 系统,支撑大量手机客户端长连接,实现消息实时推送
3 游戏服务器,玩家客户端和服务器维持长连接,实时同步游戏数据
4 物联网平台,大量传感器设备 TCP 上报数据,设备在线管理心跳保活
5 消息队列客户端和服务端通信,rocketmq 底层通信模块使用 netty 框架
6 代理服务,反向代理 隧道代理 内网穿透程序底层通信
核心组件运行原理
BossGroup 负责接收新的客户端连接请求,拿到连接之后注册到 WorkerGroup,WorkerGroup 里面的线程负责后续读写业务处理,每一条连接对应 Pipeline,Pipeline 里面挂载多个 ChannelHandler,入站 Handler 处理接收的数据,出站 Handler 处理要发送出去的数据,编解码 Handler 放在管道最前面,先把二进制字节流转换成业务对象,业务 Handler 拿到对象之后执行业务逻辑,业务处理完成之后再通过出站编码器转回字节流发送给对端。
优缺点说明
优点 高并发性能优秀,社区成熟稳定,组件丰富,扩展性强,自定义协议灵活。
缺点 学习门槛偏高,需要理解 NIO 责任链 线程模型概念,代码调试比普通同步程序麻烦,业务开发如果只是简单短连接 HTTP 接口,使用 netty 框架会增加开发成本,属于杀鸡用牛刀。
最小开发理解步骤
第一步 引入 netty 框架对应的 maven 依赖,确认版本和 JDK 版本匹配
第二步 创建 BossGroup 和 WorkerGroup 线程组,构建 ServerBootstrap 启动引导类
第三步 配置 Channel 初始化器,在 Pipeline 里面添加编解码 Handler 和业务 Handler
第四步 绑定监听端口,启动服务端,等待客户端连接
第五步 客户端同样创建 Bootstrap,配置 Handler,连接服务端地址端口,收发消息
第六步 业务测试完成之后优雅关闭线程组,释放资源,防止内存泄漏
重要注意事项
开发 netty 框架程序,必须注意内存泄漏,ByteBuf 对象如果没有正确释放,长时间运行会占用大量堆外内存。粘包拆包是 TCP 流式传输固有问题,必须通过长度字段分隔符或者固定长度解码器解决。生产环境要配置空闲心跳检测,及时清理无效死连接。版本选择尽量使用官方稳定版,不要随意使用测试版本,旧版本存在已知安全漏洞。
综合来说,netty 框架就是高性能长连接网络通信的底层开发框架,适合高并发 TCP UDP 自定义协议项目,如果项目只是普通 HTTP 网页接口,不需要引入 netty 框架,只有需要大量长连接实时通信的时候,才选择 netty 框架进行开发。
【常见问题】
问题 1 netty 框架干什么的 它可以替代 Spring 吗
回答 1 netty 框架干什么的,netty 框架专注底层网络通信,不能替代 Spring,Spring 是业务容器 MVC 框架,很多项目是 Spring 和 netty 框架组合使用,Spring 负责业务管理,netty 框架负责长连接通信。
问题 2 netty 框架干什么的 是不是只能做 TCP 服务
回答 2 netty 框架干什么的,netty 框架不只是支持 TCP,同时支持 UDP,还内置 HTTP WebSocket 编解码器,可以开发 WebSocket 实时推送服务,支持多种网络协议。
问题 3 netty 框架干什么的 为什么 RPC 框架都选择它
回答 3 netty 框架干什么的,RPC 需要跨进程高并发通信,netty 框架异步非阻塞,支持自定义协议编解码,性能高稳定成熟,所以 dubbo 这类 RPC 框架底层通信层都会选用 netty 框架。
问题 4 netty 框架干什么的 新手容易踩什么坑
回答 4 netty 框架干什么的,新手使用 netty 框架最常见坑是 ByteBuf 没有释放造成内存泄漏,没有处理粘包拆包,线程组没有优雅关闭,还有阻塞业务代码写在 worker 线程导致整个 IO 线程卡住。
【免责申明】
本文介绍 netty 框架基础原理与应用场景,属于技术科普内容,不同版本 netty 框架 API 存在差异,生产项目开发请参考官方文档,代码编写部署需要结合业务压测验证性能,所有开发部署产生的问题由使用者自行承担。


