一、Netty基础概念
1、简介
(1)、Netty是一个高性能、异步事件驱动的NIO框架,基于JAVA NIO提供的API实现。它提供了对TCP、UDP和文件传输的支持,作为一个异步NIO框架,Netty的所有IO操作都是异步非阻塞的,通过Future-Listener机制,用户可以方便的主动获取或者通过通知机制获得IO操作结果。 作为当前最流行的NIO框架,Netty在互联网领域、大数据分布式计算领域、游戏行业、通信行业等获得了广泛的应用,一些业界著名的开源组件也基于Netty的NIO框架构建。
(2)、JDK原生也有一套网络应用程序API,但是存在一系列问题,Netty是对JDK自带的NIO的API进行封装,解决JDK原生API的一系列问题。
①、NIO的类库和API繁杂,使用麻烦。你需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。
②、需要具备其他的额外技能做铺垫。例如熟悉Java多线程编程,因为NIO编程涉及到Reactor模式,你必须对多线程和网路编程非常熟悉,才能编写出高质量的NIO程序。
③、可靠性能力补齐,开发工作量和难度都非常大。例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常码流的处理等等。NIO编程的特点是功能开发相对容易,但是可靠性能力补齐工作量和难度都非常大。
④、JDK NIO的Bug。例如臭名昭著的Epoll Bug,它会导致Selector空轮询,最终导致CPU 100%。 官方声称在JDK 1.6版本的update 18修复了该问题,但是直到JDK 1.7版本该问题仍旧存在,只不过该Bug发生概率降低了一些而已,它并没有被根本解决。
(3)、使用场景
①、阿里分布式服务框架Dubbo的RPC框架使用Dubbo协议进行节点间通信,Dubbo协议默认使用Netty作为基础通信组件,用于实现各进程节点之间的内部通信。
②、游戏行业,无论手游服务端还是大型的网络游戏,Netty作为高性能的基础通信组件,它本身提供了TCP/UDP和HTTP协议栈。非常方便定制和开发私有协议栈,账号登录服务器,地图服务器之间可以方便的通过Netty进行高性能的通信。
③、大数据领域
经典的Hadoop的高性能通信和序列化组件Avro的RPC框架,默认采用Netty进行跨界点通信,它的Netty Service基于Netty框架二次封装实现。
2、Socket通信:网络分层
3、I/O流程
(1)、整体分为两步
①、磁盘把数据装载进内核的内存空间。
②、内核的内存空间的数据copy到用户的内存空间中(此过程才是真正I/O发生的地方)。
注意: I/O调用大多数都是阻塞的。
(2)、I/O完整步骤
①、进程向内核发起一个系统调用。
②、内核接收到系统调用,知道是对文件的请求,于是告诉磁盘,把文件读取出来。
③、磁盘接收到来着内核的命令后,把文件载入到内核的内存空间里面。
④、内核的内存空间接收到数据之后,把数据copy到用户进程的内存空间(此过程是I/O发生的地方)。
⑤、进程内存空间得到数据后,给内核发送通知。
⑥、内核把接收到的通知回复给进程,此过程为唤醒进程,然后进程得到数据,进行下一步操作。
5、其他
(1)、相关资料参考记录
①、Github:Home · netty/netty Wiki · GitHub(基于Netty4.1)
②、网络模型
a、理解高性能网络模型https://www.jianshu.com/p/2965fca6bb8f
b、聊聊NIO:https://www.jianshu.com/p/dd2d7b46cc7b
c、Netty堆外内存泄漏排查,这一篇全讲清楚了:https://www.jianshu.com/p/8c4e6da0e634
d、Netty如何实现高性能内存管理:https://www.jianshu.com/p/7d6fbd3f501e
e、图解I/O的五种模型:图解I/O的五种模型
③、Netty原理分析