学习笔记:《Offer来了(框架篇)》第3章 Netty网络编程原理及应用

3.1 Reactor线程模型

3.1.1 Java NIO

1.Selector

2.Buffer

  • ByteBuffer
  • ShortBuffer
  • IntBuffer
  • LongBuffer
  • FloatBuffer
  • DoubleBuffer
  • CharBuffer
    Java NIO Buffer的写入流程

3.Channel

  • ServerSocketChannel
  • SocketChannel
  • DatagramChannel
  • FileChannel

3.1.2 单Reactor单线程模型

在这里插入图片描述

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的性能

3.4 Netty的使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值