1. 啥是netty?
Netty 由韩国奥巴 Trustin Lee (Line公司)研发的。
官网对Netty的描述:Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients.
翻译过来:Netty 是一个异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。
我稍微总结一下:
- 本质:网络应用程序框架
- 实现:异步、基于事件驱动
- 特点:高性能、可维护、快速开发
- 用途:开发服务器和客户端
2. 为啥不用JDK NIO?重复造轮子?
1. Netty 比 JDK NIO 支持更丰富
- 支持应用层协议:http、http2、mqtt、websocket;
- 网络传输处理的问题:粘包、半包;
- idle 处理:read idle、write idle、all idle;
- ssl 支持;
- ip filter,可基于 CIDR 实现黑白名单;
- 高低水位线;
- 流量整形;
2. Netty 更好地规避 JDK NIO bug
2.1. epoll bug :异常唤醒空转导致 CPU 100%
异常唤醒空轮训的问题, JDK NIO 已经放弃治疗了。
io.netty.channel.nio.NioEventLoop#select:
对于此问题,netty的解决方式,当空轮训到达阀值(默认3,可以通过参数 -Dio.netty.selectorAutoRebuildThreshold设置)时,选择rebuild selector,重新 select 。
2.2. IP_TOS参数设置时,抛出异常
IP_TOS 参数,设置于IP头部的Type-of-Service字段,用于描述IP
io.netty.channel.socket.nio.NioChannelOption#setOption
遇到IP_TOS参数设置时,netty直接返回设置失败,避免了问题出现。
2. Netty 的 API 更友好强大
- Netty 对 NIO buff 的操作更强大:ByteBuffer -> ByteBuf
- Netty 对线程本地的增强:ThreadLocal -> FastThreadLocal
- Netty 对 Future 的支持增强:Future —> Promise
3. Netty 相比 JDK NIO 更为稳定
Netty 维护多年,解决了多少 nio 问题,踏平了多少坑坑洼洼,如果你选择使用 JDK NIO 搭建属于自己的网络通信框架,相当于你在王者峡谷1V5没什么区别,其他队友都挂机了。