Netty学习二:Netty整体框架

article/2025/9/21 11:25:57

一、Netty的整体结构和源码结构

Drawing 0.png Drawing 10.png

1. Core层

提供底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信API和支持零拷贝的ByteBuf等。

common模块是Netty的核心基础包,提供丰富的工具类,其他模块都需要依赖该模块。常用的包括:通用工具类和自定义并发包
通用工具类:包括定时器工具TimerTask、时间轮HashWheelTimer等
自定义并发包:增强的FastThreadLocal等

buffer模块中,Netty自己实现的了一个更为完备的ByteBuf工具类,用作网络通信的数据载体,该类是对Java ByteBuffer的完美替代品,解决了ByteBuffer长度固定造成的内存浪费,更安全地更改了Buffer的容量。同时Netty对ByteBuf进行了很多优化,包括缓存池化、减少数据拷贝的CompositeByteBuf 等

resolver模块,提供一些有关基础设施的解析工具,包括IP Address、Hostname、DNS 等。

2. Protocal Support协议支持层

包含主流协议的编码实现,如Http、SSL、Protobuf、压缩、大文件传输、二进制等主流协议,同时支持自定义应用协议。

codec模块主要负责编解码工作,通过编解码实现原始字节数据与业务实体对象之间的相互转化。该模块包含开箱即用的编码器,包括:HTTP、HTTP2、Redis、XML等。同时该模块提供抽象编码类:ByteToMessageDecoder和ByteToMessageEncoder,通过继承这两个类可以自定义编解码器。

handler模块主要负责数据处理工作,本质上是handler的集合。该模块提供了开箱即用的ChannelHandler实现类,如:日志、IP过滤等,可以自行在pipeline中加入相应的ChannelHandler。

3. Transport Service传输服务层

提供网络传输能力的定义和实现方法,支持Socket、Http隧道、虚拟机管道等传输方式。

transport模块是Netty提供数据处理和传输的核心模块。该模块包含很多重要的接口:BootStrap、Channel、ChannelHandler、EventLoop、ChannelPipeLine等。

二、Netty的逻辑架构

Netty的逻辑架构可以分为网络通信层、事件调度层和服务编排层,每一层包含不同的核心组件,各层之间的关系如图:

1. 网络通信层

用于执行网络I/O操作,支持多种网络协议和I/O模型的连接操作。当网络数据读到内核缓冲区之后,会触发各种网络事件,这些事件灰分发给事件调度层处理。

BootStrap和BootServerStrap组件
Drawing 2.png 两个组件都是辅助Netty程序的启动、初始化和服务连接。BootStrap用于客户端连接远端服务器,只绑定一个EventLoopGroup,BootServerStrap用于服务端启动绑定本地端口,分别绑定Boss和Worker两个EventLoopGroup,Boss会不停地接收新的连接,然后将连接分配给Worker处理

BootStrap是整个Netty的入口,串联了Netty所有核心组件的初始化工作。

Channel组件
Drawing 3.png

网络通信的载体,提供基本的API用于网络I/O操作,包括:register、bind、connect、read、write、flush等,

以JDK Channel为基础,进行了更高层次的抽象,屏蔽了底层的Socket。

channel的生命周期包含不同的状态,每个状态会绑定相应的事件回调,对应的事件由事件调度层进行处理。

2. 事件调度层

通过Reactor线程模型对各类事件进行聚合处理,通过Selector主循环线程集成多种事件,实际的业务处理逻辑交由服务编排层的Handler完成

EventLoopGroup和EventLoop组件

EventLoopGroup、EventLoop、Channel 的几点关系:

  • EventLoopGroup本质是一个线程池,包含一个或多个EventLoop。EventLoop用于处理Channel声明周期内的所有I/O事件,如accept、connect、read、write等
  • EventLoop同一时间会与一个线程绑定,每个EventLoop负责处理多个Channel
  • 每新建一个Channel,EventLoopGroup会选择一个EventLoop与其绑定,该Channel在生命周期内可以对EventLoop进行多次绑定和解绑
    Drawing 4.png

EventLoopGroup的实现类是NioEventLoopGroup,NioEventLoopGroup也是Netty中最被推荐的线程模型。NioEventLoopGroup继承自MultithreadEventLoopGroup,基于NIO模型开发
Drawing 5.png

EventLoop是Netty Reactor线程模型的实际实现方法,通过不同的参数配置,可以支持三种Reactor线程模型

  • 单线程模型:EventLoopGroup 只包含一个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup;
  • 多线程模型:EventLoopGroup 包含多个 EventLoop,Boss 和 Worker 使用同一个EventLoopGroup;
  • 注册多线程模型:EventLoopGroup 包含多个 EventLoop,Boss 是主 Reactor,Worker 是从 Reactor,它们分别使用不同的 EventLoopGroup,主 Reactor 负责新的网络连接 Channel 创建,然后把 Channel 注册到从 Reactor。

服务编排层

负责组装各类服务,是Netty的核心处理链,用以实现网络时间的动态编排和有序传播

ChannelPipeLine组件

负责编排组装各种ChannelHandler,通过双向链表将不同的ChannelHandler连接在一起。当I/O读写时间触发时,一次调用ChannelHandler列表对Channel的数据进行拦截和处理。

每一个新的Channel对应绑定一个新的ChannelPipeLine,因此ChannelPipeLine是线程安全的。一个ChannelPipeLine关联一个EventLoop,一个EventLoop绑定一个线程。

ChannelPipeline 中包含入站 ChannelInboundHandler 和出站 ChannelOutboundHandler 两种处理器。数据入站会有一系列ChannelInboundHandler 处理,再以相反的ChannelOutboundHandler 处理完后完成出站。
Drawing 7.png

ChannelHandler和ChannelHandlerContext

ChannelHandler用于实际的业务处理逻辑,包括数据的编解码和其他转换工作,开发者只需要关心ChannelHandler的逻辑即可。

ChannelHandlerContext 用于保存 ChannelHandler 上下文,包含了 ChannelHandler 生命周期的所有事件,如 connect、bind、read、flush、write、close 等,可以实现ChannelHandler之间的交互。

每创建一个Channel就会绑定一个新的ChannelPipeLine,ChannelPipeLine每加入一个ChannelHandler都会绑定一个ChannelHandlerContext。
Drawing 8.png

组件关系梳理

  1. 服务端启动初始化时有 Boss EventLoopGroup 和 Worker EventLoopGroup 两个组件,其中 Boss 负责监听网络连接事件。当有新的网络连接事件到达时,则将 Channel 注册到 Worker EventLoopGroup。
    Worker EventLoopGroup 会被分配一个 EventLoop 负责处理该 Channel 的读写事件。每个 EventLoop 都是单线程的,通过 Selector 进行事件循环。
  2. 当客户端发起 I/O 读写事件时,服务端 EventLoop 会进行数据的读取,然后通过 Pipeline 触发各种监听器进行数据的加工处理。
  3. 客户端数据会被传递到 ChannelPipeline 的第一个 ChannelInboundHandler 中,数据处理完成后,将加工完成的数据传递给下一个 ChannelInboundHandler。
  4. 当数据写回客户端时,会将处理结果在 ChannelPipeline 的 ChannelOutboundHandler 中传播,最后到达客户端。
    以上便是 Netty 各个组件的整体交互流程,你只需要对每个组件的工作职责有所了解,心中可以串成一条流水线即可,具体每个组件的实现原理后续课程我们会深入介绍。
    Drawing 9.png

http://chatgpt.dhexx.cn/article/PBAFrQRh.shtml

相关文章

Netty框架

概述 Netty 是由 JBOSS 提供的一个 Java 开源框架。Netty 提供异步的、基于事件驱动的网络应用程序框架,用以快速开发高性能、高可靠性的网络 IO 程序。 Netty 是一个基于 NIO 的网络编程框架,使用 Netty 可以帮助你快速、简单的开发出一个网络应用&…

Netty框架基本介绍

NIO 1.概述:NIO全称java non-blocking IO ,是指JDK1.4开始,java提供了一系列改进的输入/输出的新特性,被统称为NIO(即New IO )。新增了许多用于处理输入输出的类,这些类都被放在java.nio包及子包下,并且对j…

超详细Netty入门,看这篇就够了!

思维导图 前言 本文主要讲述Netty框架的一些特性以及重要组件,希望看完之后能对Netty框架有一个比较直观的感受,希望能帮助读者快速入门Netty,减少一些弯路。 一、Netty概述 官方的介绍: Netty is an asynchronous event-drive…

SPI通信协议详解(一)

SPI是一个同步的数据总线,也就是说它是用单独的数据线和一个单独的时钟信号来保证发送端和接收端的完美同步。 时钟是一个振荡信号,它告诉接收端在确切的时机对数据线上的信号进行采样。 产生时钟的一侧称为主机,另一侧称为从机。总是只有一个…

SPI协议的介绍

学习内容: 学习SPI协议记录 学习清单: 提示:这里可以添加要学的内容 例如: SPI协议的介绍三根线还是四根线两个概念四种模式SPI时序图SPI优缺点SPI和IIC的对比 学习详细内容: 1.SPI协议的介绍 SPI是串口外设接口…

SPI 通信协议

文章目录 【 1. 概述 】【 2. 原理 】1. 全双工特征下的传输特点2. 二线式、三线式的SPI3. SPI 模式CPOL(Clock Polarity),时钟极性CPHA (Clock Phase),时钟相位通信模式_时序 4. 通信过程5. 底层数据传输演示 【 3. SPI底层驱动 】 【 1. 概述 】 SPI …

SPI通信协议基础

文章目录 引言正文串行与并行通信SPI通信简介SPI如何运作?时钟从机选择多个从机MOSI和MISOSPI数据传输步骤 SPI的优缺点优点缺点 好文推荐参考 引言 当您将微控制器连接到传感器,显示器或其他模块时,您是否考虑过这两种设备如何相互通信&…

SPI、I2C、UART(即串口)三种串行总线详解

以下内容均来源于网络资源的学习与整理,如有侵权请告知删除。 参考博客 几个串口协议学习整理 UART IIC SPI_mainn的博客-CSDN博客 SPI、I2C、UART三种串行总线的原理、区别及应用_嵌入式Linux,的博客-CSDN博客 RS-232 和 UART 之间有什么区别? - 知乎…

uart、spi、i2c通信协议详解

文章目录 前言一、uart(串口)介绍使用rs232、rs485拓展 二、I2C介绍1.宏观流程2.时序上3.典型操作 三、spi(串行外设接口)介绍使用1.宏观上2.微观上 总结1.i2c和spi对比 前言 之前对于各种通信协议学习了就忘,学了就忘…

普通GPIO模拟SPI通信协议(软件SPI)

在工作中偶尔会遇到SPI不够用的情况,而我们又要去使用SPI通信协议,此时就需要我们自己去模拟SPI通信协议。我们知道SPI通信协议有四种模式,它们分别如下所示: 下面是我基于ATSAM4SD16B芯片在Atmel Studio上用普通GPIO模拟的SPI…

SPI 协议

一. 概念 1. 通常SPI通信要求4根线,分别是MOSI(mast output salve input), MISO, CLK, CS。 2. 当发送和接受数据的工作都准备好了,只要有时钟CLK,就发送数据,没有时钟就不发送,而且一个时钟周期发送一位(bit)数据,所…

SPI通信协议(SPI总线)学习

转载自:https://www.cnblogs.com/deng-tao/p/6004280.html 1、什么是SPI? SPI是串行外设接口(Serial Peripheral Interface)的缩写。是 Motorola 公司推出的一 种同步串行接口技术,是一种高速的,全双工,同步的通信总…

SPI通信

1 SPI的简介及基本特点 1 SPI的简单介绍 最近工作中使用了SPI通信方式来做TM4C129和STM32之间的通信,为了更好地解决问题就学习了SPI原理的相关内容,完成了项目之后,也对这种通信方式有了较为深入的了解,现在来对SPI的使用方法进…

详解SPI通信协议

一、SPI简介 SPI,即Serial Peripheral Interface的英文缩写。从字面意思看就是串行外部设备接口,是一种全双工、高速、同步的通信总线。 SPI最早是摩托罗拉公司开发的全双工同步串行总线,用于微控制器(MCU)连接外部设…

stm32中常见的通信协议之SPI

目录 1.SPI总线2.SPI的寻址方式3.SPI的工作原理总结4.SPI的通讯过程5.SPI的极性和相位6.IIC和SPI的异同7.stm32中SPI配置中常用的寄存器8.stm32中相关库函数 1.SPI总线 SPI是串行外设接口的缩写,SPI是一种高速的、全双工、同步的串行通信协议;SPI采用主…

【通信协议】一文搞懂SPI

SPI总线简介 SPI(Serial Peripheral Interface)是 Motorola 公司推出的一种同步串行接口技术,是一种高速的,全双工,同步的通信总线。 接口定义 SPI接口共有4根信号线,分别是:片选信号、时钟信号、串行输出信号、串行…

SPI 通信协议 最详细解读!!!

SPI(Serial Peripheral Interface,串行外围接口)是一种高速、全双工、同步的通信总线,主要应用在EEPROM、FLASH、实时时钟、AD转换器上,以及数字信号处理器和数字信号解码器之间。 信号线 SPI有四根信号线:…

SPI 通信协议详解

SPI通信协议详解 写在最前: 本文讲述了SPI通信协议的基本内容包括如下 SPI的基础知识SPI的读写时序 本文重点参考 英文维基百科 中文维基百科 百度百科 注意: 倘若读者有足够的耐心和英文水平,强烈建议自行去英文维基百科去阅读相关知识。 相关链接: SPI…

通信协议篇——SPI通信

通信协议篇——SPI通信 1.简介 SPI(Serial Peripheral Interface)是一种高速、同步、全双工串行通信总线,采用主从机通信模式,主要应用在EEPROM,FLASH,实时时钟,AD转换器等。 2.原理 通信方…

SPI接口通信协议详解:SPI时序、2线、3线、4线SPI及4种常用工作模式

简介 SPI通信原理比I2C要简单,它主要是主从方式通信。这种模式通常只有一个主机和一个或者多个从机,标准的SPI是4根线,分别是SSEL(片选,也写作 SCS)、SCLK(时钟,也写作SCK)、MOSI(主机输出从机输入Master Output/Slav…