Netty源码剖析与实战(一):初识Netty
Netty的起源
Netty项目起源于2004年,Java社区第一个基于事件驱动的网络应用开发框架。Hadoop、Cassandra、Spark、Dubbo、gRPC、RocketMQ、Zookeeper、Spring5等都在使用Netty,是开发高性能Java服务器的必学框架。
学习Netty的基础知识
- 协议知识:TCP的keeplive、粘包/半包现象、封帧等;
- 网络编程知识:三种IO、三种Reactor模式;
- Java高阶编程知识:对象池、堆外内存、锁等知识
Netty是什么
- 本质:网络应用程序框架
- 实现:异步、事件驱动
- 特性:高性能、可维护、快速开发
- 用途:开发服务器和客户端
Netty的架构
JDK NIO与Netty
- Netty支持常用应用层协议;解决传输问题:粘包、半包现象;支持流量整形;完善的锻炼、Idle等异常处理;
- 规避JDK NIO bug:经典的epoll bug:异常唤醒空转导致CPU 100%;IP_TOS参数(IP包的优先级和QoS选项)使用时抛出异常;
- API更友好更强大:JDK的NIO一些API不友好,功能薄弱,例如ByteBuffer > Netty's ByteBuf;其他的增强:ThreadLocal > Netty's FastThreadLocal;
- 隔离变化、屏蔽细节:JDK NIO的实现变化:NIO > NIO2(AIO) > .....;屏蔽JDK NIO的实现细节;
为什么只选择Netty
- Apache Mina:Netty作者本人解答:Netty是Mina的重新打造版本,提高了扩展性并解决了一些已知的问题,Netty使用起来也比Mina简单的更多;
- Sun Grizzly:三少:用的少、文档少、更新少;
- Apple SwiftNIO或者ACE:其他语言,Java领域不会考虑;
- Cindy:生命周期不长;
- Tomcat、Jetty:与Netty不属于同一个层次,有自己的通信层实现,且专门与Servlet容器实现的,通用性不高。