Netty使用和常用组件辨析
Netty的线程模型
- Netty通过Reactor模型基于多路复用器接收并处理用户请求,内部主要实现了两个线程池
- boss线程池
- 负责处理请求的接收工作,当收到请求时,会把对应的socket封装成一个NioSocketChannel,并交给work线程池处理
- work线程池
- 负责处理请求的读写操作,然后交给对应的Handler处理
- boss线程池
- Reactor模型有三种
- 单线程模式
- 一个线程负责多个事件处理,当连接数过多时会造成性能瓶颈,适用于连接数较少、复杂度较低的场景
- 多线程模式(单线程、工作线程池)
- 在单线程Reactor模式的基础上,将业务处理部分交给了线程池,提升并发能力,但是要注意线程安全
- 主从多线程模式
- 将整体拆分为主、从Reactor,主Reactor负责监听连接事件,将事件分发给从Reactor去处理,从Reactor负责与客户端读写操作,充分利用多核CPU,提升并发能力
- 单线程模式
TCP粘包/拆包
- TCP是以流的方式来处理数据,一个完整的包可能会被TCP拆分成多个包进行发送,也可能把小的封装成一个大的数据包发送
- 粘包/拆包的原因
- 用户写入的数据大小 大于 发送到缓冲区的大小,会发生拆包的现象(一个放不下)
- 用户写入的数据大小 小于 发送到缓冲区的大小,会发生粘包(多个合并到一起)
- 解决粘包/拆包的方法
- 消息定长
- 用特殊字符进行分割
Netty的重要组件
- Channel
- 主要负责网络操作,比如连接、IO读写等
- EventLoop
- 配合Channel处理I/O操作
- ChannelFuture
- 通过ChannelFuture注册监听事件,对于执行结果自动触发返回结果
- ChannelHandler
- 处理各种事件,比如连接、异常、数据处理等
- ChannelPipeline
- Channel创建时会分配专属的ChannelPipeline进行关联,相当于放到了容器内
Netty的零拷贝实现
- 在网络通信上,接收和发送数据通过直接内存进行操作
- 在缓存操作上,通过合并多个缓冲数据,避免重复拷贝
- 在文件传输上,直接通过文件缓冲数据传输到管道,避免拷贝