Netty
异步事件驱动的网络应用程序框架。
特点
- 高并发
- 通过Reactor模型基于NIO开发的网络通信框架
- 传输快
- 零拷贝
- Netty的接受和发送bytebuffer使用堆外直接内存进行socket读写,传统堆内存进行socket读写,JVM将堆内存buffer拷贝到内存,然后写入socket。相比之下,消息在发送多了一次缓冲区的内存拷贝。
- Netty提供buffer,聚合多个bytebuffer。传统通过内存拷贝将多个小buffer合并大的buffer。
- Netty文件传输使用transferto,直接将文件缓冲区的数据发送到目标channel。传统通过循环write导致内存拷贝。
- 零拷贝
- 使用简单
- 封装NIO,提供调用接口
- 功能强大
- 预置多种编解码功能
- 支持多种主流协议
- 通过channelhandler对通信框架扩展
- 性能高
- IO线程模型
- 内存零拷贝
- 内存池设计
- 串行化处理读写
- 高性能序列化协议
- 稳定
- 修复所有NIO bug
- epoll bug,导致selector空轮询,最终导致CPU100%
- 修复所有NIO bug
应用场景
- RPC框架实现的基础通信组件,用于各进程节点间的内部通信
- 定制私有协议栈,Netty提供TCP/UDP和HTTP协议栈
- 跨界点通信
发送消息方式
- 直接写入channel,消息从channelpipeline的尾部移动
- 写入channelhandler绑定的channelhandlercontext,消息从channelpipeline的下一个channelhandler移动
事件驱动模型
- 轮询
- 事件驱动方式。boss线程和work线程,boss线程把事件放入事件队列,work线程消费事件队列中的事件,调用对应的handler处理事件。
Reactor线程模型
单Reactor单线程
单Reactor多线程
一个线程负责监听服务端,接受客户端TCP连接请求;一个线程同时处理多条链路,一个链路只对应一个线程
主从Reactor多线程
服务器Netty工作架构
每个端口对应一个boss线程