3.1 Reactor线程模型
3.1.1 Java NIO
1.Selector
2.Buffer
- ByteBuffer
- ShortBuffer
- IntBuffer
- LongBuffer
- FloatBuffer
- DoubleBuffer
- CharBuffer
3.Channel
- ServerSocketChannel
- SocketChannel
- DatagramChannel
- FileChannel
3.1.2 单Reactor单线程模型
(1)Acceptor接收客户端的TCP连接请求消息。
(2)链路建立成功后通过Dispatcher将接收到的消息写入ByteBuffer,并派发到对应的DecoderHandler上进行消息解码和处理。
(3)消息处理完成后调用对应的EncoderHandler将请求响应进行消息的编码和下发。
3.1.3 单Reactor多线程模型
Reactor多线程模型与单线程模型的区别在于,Reactor多线程模型用于接收客户端请求的Acceptor由一个线程来负责,用于处理客户端消息的Dispatcher由一个线程池负责。
3.1.4 主从Reactor多线程模型
Reactor主从多线程模型中的Acceptor线程池(Acceptor Thread Pool)只用于客户端的鉴权、登录、握手和安全认证,一旦链路建立成功,就将链路注册到后端Sub Reactor线程池的I/O线程上,由I/O线程负责后续的I/O操作。
3.2 Netty的架构
3.2.1 Netty简介
Netty支持协议包括:HTTP、TCP、UDP、FTP、SMTP。
3.2.2 Netty的架构设计
1.Transport Services
传输服务层,主要定义了数据的传输和通信方式:
- Socket And Datagram(Socket协议和数据包)
- HTTP Tunnel(HTTP隧道)
- In-VM Pipe(本地传输管道)
2.Protocol Support
传输协议层,主要定义数据传输过程中的服务类型、数据安全、数据压缩等:
- HTTP And WebSocket(HTTP和WebSocket服务)
- SSL And StartTLS(SSL和StartTLS协议)
- zlib/gzip Compression(zlib/gzip压缩算法)
- Large File Transfer(大文件传输)
- Google ProtoBuf(Google ProtoBuf格式)
- RTSP(实时流传输协议)
- Legacy Text And Binary Protocols(传统TXT和二进制数据)
3.Core
核心层,封装了Netty框架的核心服务和API:
- Extensible Event Model(可扩展事件模型)、
- Universal Communication API(通用通信协议API)、
- Zero-Copy-Capable Rich Byte Buffer(零拷贝字节缓冲区)
3.2.3 Netty的核心组件
- ServerBootstrap、Bootstrap
启动引导:服务端、客户端
- NioEventLoopGroup、NioEventLoop
一个 NioEventLoopGroup 包含多个 NioEventLoop
一个 NioEventLoop 线程负责多个 Channel 的事件处理
- Selector
一个 NioEventLoop 包含一个 Selector
一个 Selector 管理多个 Channel
- Channel、ChannelPipeline
一个 Channel 对应一个 ChannelPipeline
ChannelPipeline 中维护了一个由 ChannelHandler 组成的双向链表
- ChannelHandler、ChannelHandlerContext
一个 ChannelHandler 对应一个 ChannelHandlerContext
ChannelInboundHandler:用于处理数据接收的I/O操作
ChannelOutboundHandler:用于处理数据发送的I/O操作
- Future、ChannelFuture
监听事件
3.2.4 Netty的原理
- BossGroup:接收客户端连接和数据、进行数据转发
- WorkerGroup:数据处理、触发I/O事件
1.Netty Server的初始化步骤
(1)初始化BossGroup和WorkerGroup。
(2)基于ServerBootstrap配置EventLoopGroup,包括连接参数设置、Channel类型设置、编解码Handler设置等。
(3)绑定端口和服务启动。
2.BossGroup的职责
BossGroup为一个事件循环组,其中包含多个事件循环(NioEventLoop),每个Boss NioEventLoop循环都执行以下3个步骤。
(1)轮询监听Accept事件。
(2)接收和处理Accept事件,包括和客户端建立连接并生成NioSocketChannel,将NioSocketChannel注册到某个Worker NioEventLoop的Selector上。
(3)处理runAllTasks的任务。
3.WorkerGroup的职责
WorkerGroup为一个事件循环组,其中包含多个事件循环(NioEventLoop),每个Worker NioEventLoop循环都执行以下3个步骤。
(1)轮询监听NioSocketChannel上的I/O事件(I/O读写事件)。
(2)当NioSocketChannel有I/O事件触发时执行具体的I/O操作。
(3)处理任务队列中的任务。
3.3 Netty的特性
- I/O多路复用模型
- 数据零拷贝
零拷贝指的是没有CPU拷贝,是从操作系统角度看的
堆外直接内存:不需要进行字节缓冲区的二次拷贝
组合 Buffer 对象:聚合多个 ByteBuffer 对象,用户可以像操作一个 Buffer 那样 方便的对组合 Buffer 进行操作,避免了传统通过内存拷贝的方式将几个小 Buffer 合并成一个大的 Buffer
transferTo方法:直接将文件缓冲区的数据发送到目标 Channel, 避免了传统方式,数据从内核缓冲区拷贝到用户缓冲区,再从用户缓冲区拷贝到内核的socket buffer导致的内存拷贝问题。
- 内存重用机制
Netty提供了基于堆外直接内存的内存池的内存重用机制。
- 无锁化设计
同时启动多个串行化的线程并行运行,局部无锁化的串行多线程设计
- 高性能的序列化框架 ProtoBuf
配置项:
- SO_RCVBUF、SO_SNDBUF:建议值为128KB或者256KB
- SO_TCPNODELAY:开启或关闭自动粘包
- 软中断:在开启软中断后,Netty会根据该连接的源地址、源端口、目的地址、目的端口计算一个Hash值,根据该Hash值选择对应的CPU来建立连接,实现连接在多个CPU上的负载均衡,以提高CPU的性能