Netty入门学习
目录
- 为什么要学习netty
- netty学习导图
- 学习netty前需要知道的知识
- I/O模型
- 主要I/O模型
- netty框架的整体结构
- netty的逻辑架构
- 网络通信层
- 事件调度层
- 服务编排层
为什么要学习netty
Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty本质是一个NIO框架,通过异步、基于事件驱动的IO,用以快速开发高性能、高可靠性的网络IO程序,主要针对在TCP协议下,面向Client端的高并发应用,或者Peer-to-Peer场景下的大量数据持续传输的应用。
作为Java后端研发同学,一定都会接触到框架和网络通信,就我接触过并看过源码的开源项目,可以说基本上都是使用Netty作为网络通信的底层框架,如Dubbo、RocketMQ、Canal、otter、HBase等等。
————————————————
版权声明:本文为CSDN博主「西木风落」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/chenwiehuang/article/details/103937396
netty学习导图

学习netty前需要知道的知识
I/O模型
I/O请求分为两个阶段:
- I/O调用阶段:用户进程向内核发起系统调用
- I/O执行阶段:内核等待I/O请求处理完成并返回
如下图

主要I/O模型
-
同步堵塞I/O (BIO)

-
同步非堵塞I/O (NIO)

-
I/O多路复用

- 信号驱动I/O

- 异步I/O

netty的IO模型是基于非堵塞IO,底层实现依赖于JDK NIO的多路复用器Selector
事件处理器(Event Handler)
负责将读写事件分发给对应的读写事件处理器(Event Handler)
Reactor (使用同步IO)和 Proactor (异步IO),主流的事件模型主要使用Reactor 或Epoll

netty框架的整体结构

Core核心层
提供底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信API、支持零拷贝的 ByteBuf等
Protocol Support 协议支持层
- 覆盖了主流协议的编解码实现如HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等
- 支持自定义应用层协议
Transport Service传输服务层
- 传输服务层提供了网络传输能力的定义和实现方法支持Socket、HTTP隧道、虚拟机管道等传输方式
- Netty的模块设计具备较高的通用性和可扩展性 支持自定义应用层协议
netty的逻辑架构

网络通信层
网络通信层的职责是执行网络I/O的操作,支持多种网络协议和I/О模型的连接操作,包括ServerBootstrap,Bootstrap,Channel组件

- Bootstrap可用于连接远端服务器,只绑定一个EventLoopGroup (Boss),负责客户端的启动
- ServerBootStrap 用于服务端启动绑定本地端口,绑定两个EventLoopGroup (Worker),负责服务端的启动
Bootstrap,ServerBootStrap是netty程序的入口
每个服务器中都会有一个Boss,会有一群做事情的 Worker
Boss 会不停地接收新的连接,将连接分配给一个个Worker处理连接
roup
√支持自定义应用层协议
Channel
Channel是网络通信的载体,提供了基本的API用于网络I/О操作
如register、bind、connect、read、write、flush等Netty自己实现的Channel是以JDKNIO Channel为基础的

Channel会有多种状态,如连接建立、连接注册、数据读写、
连接销毁等
Channel的状态
| 事件 | 说明 |
|---|---|
| channelRegistered | Channel创建后被注册到EventLoop 上 |
| channelUnregistered | Channel创建后未注册或者从EventLoop取消注册 |
| channelInactive | Channel处于非就绪状态 |
| channelRead | Channel可以从远端读取到数据 |
小结
BootStrap和ServerBootStrap 分别负责客户端和服务端的启动
Channel是网络通信的载体,提供了与底层Socket交互的能力
事件调度层
通过Reactor线程模型对各类事件进行聚合处理通过Selector主循环线程集成多种事件
核心组件包括EventLoopGroup、EventLoop


EventLoopGroup是Netty Reactor线程模型的具体实现方式

服务编排层

ChannelPipeline负责组装各种ChannelHandler实际数据的编解码以及加工处理操作由ChannelHandler完成
当I/O读写事件触发时,ChannelPipeline会
依次调用ChannelHandler列表对Channel的数据进行拦截和处理
每一个新的Channel会对应绑定一个新的ChannelPipeline(线程安全的);一个ChannelPipeline关联一个EventLoop一个EventLoop仅会绑定一个线程
ChannelPipeline入站和出站



channel和ChannelPipeline的关系

ChannelHandlerContext的作用
- 保存ChannelHandler上下文
- 实现ChannelHandler之间的交互,包含ChannelHandler生命周期的所有事件
如connect、bind、read、flush、write、close等
组件之间的协作

小结
- Bootstrap负责客户端或服务端的启动工作,包括创建、初始化Channel等
- EventLoop负责向注册的Channel发起I/O读写操作
- channelPipeline负责ChannelHandler的有序编排
相关文章:
Netty入门学习
目录 为什么要学习nettynetty学习导图学习netty前需要知道的知识I/O模型主要I/O模型 netty框架的整体结构netty的逻辑架构网络通信层事件调度层服务编排层 为什么要学习netty Netty是由JBOSS提供的一个Java开源框架,现为Github上的独立项目。Netty本质是一个NIO框架…...
代客泊车对HUT功能交互规范
目录 1. 版本记录... 7 2. 文档范围和控制... 8 2.1 目的/范围... 8 2.2 文档冲突... 8 2.3 文档授权... 8 2.4 文档更改控制... 8 3. 系统组成... 9 3.1 IPAS系统(环视和超声波雷达)...…...
mysql的update_time
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,name VARCHAR(50) NOT NULL,age INT,update_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 更新时间 );具体解释如下: DEFAULT CURRENT_TIMESTAMP: 这部分表示当插入…...
避免安装这5种软件,手机广告频繁弹窗且性能下降
在我们使用手机的日常生活中,选择合适的应用软件对于保持良好的使用体验至关重要。然而,有些软件可能会给我们带来不必要的麻烦和困扰。特别是那些频繁弹窗广告、导致手机性能下降的应用程序,我们应该尽量避免安装它们。 首先第一种…...
kafka-事务
1. 事务的5个API // 1初始化事务 void initTransactions();// 2开启事务 void beginTransaction() throws ProducerFencedException;// 3在事务内提交已经消费的偏移量(主要用于消费者) void sendOffsetsToTransaction(Map<TopicPartition, OffsetAn…...
【安装】阿里云轻量服务器安装Ubuntu图形化界面(端口号/灰屏问题)
阿里云官网链接 https://help.aliyun.com/zh/simple-application-server/use-cases/use-vnc-to-build-guis-on-ubuntu-18-04-and-20-04 网上搜了很多教程,但是我没在界面看到有vnc连接,后面才发现官网有教程。 其实官网很详细了,不过这里还是…...
Python 扩展 快捷贴士:os模块下的创建目录的方式
Python3 os.makedirs() 方法 概述 os.makedirs() 方法用于递归创建多层目录。 如果子目录创建失败或者已经存在,会抛出一个 OSError 的异常,Windows上Error 183 即为目录已经存在的异常错误。 如果第一个参数 path 只有一级,即只创建一层目…...
Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明
目录 Hi3798MV200 恩兔N2 NS-1 (一): 设备介绍和刷机说明Hi3798MV200 恩兔N2 NS-1 (二): HiNAS海纳思使用和修改Hi3798MV200 恩兔N2 NS-1 (三): 制作 Ubuntu rootfsHi3798MV200 恩兔N2 NS-1 (四): 制作 Debian rootfs 介绍 恩兔N2是一个家庭存储的系列产品, NS-1 是其中体积…...
redis缓存雪崩和缓存击穿
目录 缓存雪崩 解决方案: 缓存击穿 解决方案 缓存雪崩 缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 解决方案: u 给不同的 Key 的 TTL 添加随机值 u 利用 Redis …...
计算机网络(5) --- http协议
计算机网络(4) --- 协议定制_哈里沃克的博客-CSDN博客协议定制https://blog.csdn.net/m0_63488627/article/details/132070683?spm1001.2014.3001.5501 目录 1.http协议介绍 1.协议的延申 2.http协议介绍 3.URL 4.urlencode和urldecode 2.HTTP协…...
ubuntu 硬盘操作
查看移动硬盘的文件系统名 以及空间使用情况 df -hl查看硬盘的格式类型,以及挂载位置 df -T挂载硬盘 fdisk -l #查看磁盘信息 mount -o rw /dev/sdb1 /home/test # 挂载硬盘-o 指定挂载文件系统时的选项 ro 以只读方式挂载 rw 以读写方式挂载 注意:…...
C#垃圾回收器GC、析构函数(Finalize 方法)和Dispose
1、垃圾回收器GC GC(Garbage Collection)是.NET中的垃圾回收器。以应用程序的root为基础,遍历应用程序在Heap上动态分配的所有对象,通过识别它们是否被引用,来确定哪些对象是已经死亡的,哪些仍需要被使用。已经不再被…...
第20周 服务容错-Hystrix
RabbitMQ 安装 1. 首先在Linux上进行一些软件的准备工作,yum下来一些基础的软件包 yum install build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c kernel-devel 2. 下载RabbitMQ所需软件包(本神在这里使用的是 RabbitM…...
浏览器不同源的页面之间如何跨域通信
目录 1,需求2,难点3,思路浏览器不同源的页面之间如何跨域通信? 4,实现第1版第2版最终版其他的问题1,页面路径需完全一致。2,事件注册问题 1,需求 现在有2个项目,页面路径…...
【云原生】K8S二进制搭建三:高可用配置
目录 一、部署CoreDNS二、配置高可用三、配置负载均衡四、部署 Dashboard 一、部署CoreDNS 在所有 node 节点上操作 #上传 coredns.tar 到 /opt 目录中 cd /opt docker load -i coredns.tar在 master01 节点上操作 #上传 coredns.yaml 文件到 /opt/k8s 目录中,部…...
HOT78-跳跃游戏
leetcode原题链接:跳跃游戏 题目描述 给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入:nums [2,3,1,1,4] 输…...
HDFS中的NAMENODE元数据管理(超详细)
元数据管理 元数据是什么元数据管理概述内存元数据元数据文件fsimage内存镜像文件edits log编辑日志 namenode加载元数据文件顺序 元数据管理相关目录文件元数据相关文件VERSIONseen_txid 元数据文件查看(OIV,OEV)SecondaryNameNode介绍checkpoint机制SN…...
区块链实验室(14) - 编译FISCO-BCOS
FISCO-BCOS是一种区块链平台,与Hyperledger和Ethereum有些不同,详见FISCO BCOS 区块链 编译FISCO BCOS源码的目的是修改或者新增其中功能模块,进行对比实验,验证新想法、新创意的效果。编译的步骤很简单,按技术文档一…...
for(auto iter:vec) 及 for(auto iter:vec) 的典型用法
【算法知识点】C11 标准引入了 auto 类型说明符。它通过变量的初始值或者表达式中参与运算的数据类型来推断变量的类型。 一、for(auto iter:vec) 的典型用法 #include <bits/stdc.h> using namespace std;int main(){string s;cin>>s;for(auto t:s){cout<<…...
【iosH5开发】IOS浏览器对于Vue3 Element-plus el-input中,input.value.focus无法聚焦问题
【iosH5开发】IOS浏览器对于Vue3 Element-plus el-input中,input.value.focus无法聚焦问题 此次项目遇到了两个问题,一个是在Vue3中el-input的input.value.focus()无法触发,但是在PC或者安卓均可触发。 // 解决方案 // 单纯的触发input.val…...
Transformer位置编码层代码详解:从正弦公式到PyTorch实现(附避坑指南)
Transformer位置编码层代码详解:从正弦公式到PyTorch实现(附避坑指南) 在自然语言处理领域,Transformer架构彻底改变了序列建模的方式。与传统RNN和LSTM不同,Transformer完全依赖自注意力机制来捕捉序列中的依赖关系。…...
政府科技管理部门如何优化区域科技创新治理?
观点作者:科易网-国家科技成果转化(厦门)示范基地 摘要 在数智时代背景下,区域科技创新治理的复杂性显著提升,传统治理模式面临资源分散、服务碎片化、匹配效率低等核心痛点。政府科技管理部门亟需借助“数智产品共享…...
论文AI率过高怎么降?实测有效方法+免费工具推荐
当前不少学生和科研人员在写论文时都遇到过AIGC率超标的问题,不用焦虑,只要找对方法,就能有效消除AI生成痕迹,顺利通过学校的AIGC检测。 一、AIGC检测的核心逻辑是什么? 很多人会疑惑:明明是自己逐字敲的论…...
YOLO26涨点改进| TPAMI 2026 |独家创新首发、Conv改进篇| 引入LPM 局部先验特征增强模块,更加聚焦于目标区域并抑制背景干扰,助力目标检测、图像分割、图像恢复、图像增强有效涨点
一、本文介绍 🔥本文给大家介绍使用 LPM 局部先验特征增强模块 改进YOLO26网络模型,通过构建重要性图对特征提取过程进行引导,使模型能够更加聚焦于目标区域并抑制背景干扰,从而提升特征表达质量和目标区分能力。其优势体现在能够有效增强关键区域信息、提升小目标和复杂…...
2026年硕士学位论文降AI率工具推荐:结论和展望部分怎么降
2026年硕士学位论文降AI率工具推荐:结论和展望部分怎么降 72%。 我收到知网检测报告那一刻,说实话有点懵。我那篇论文写了快两个月,每个字都是自己敲的。但学校的要求摆在那——AI率低于20%才能送审。折腾了几天之后,靠嘎嘎降AI…...
新手入门指南:在快马平台上通过openclaw切换模型理解ai编程差异
作为一个刚开始接触AI编程的新手,我最近在InsCode(快马)平台上尝试了openclaw切换模型的功能,发现这个功能特别适合用来理解不同AI模型的代码生成特点。整个过程就像有个耐心的老师在旁边手把手教学,完全不需要任何编程基础就能上手。下面我就…...
S-UI缓存策略设计:API响应与静态资源缓存
S-UI缓存策略设计:API响应与静态资源缓存 还在为S-UI面板加载缓慢而烦恼?本文将为你深度解析S-UI的缓存策略设计,帮你提升系统性能和用户体验。 读完本文你将获得: S-UI现有缓存机制全面解析静态资源优化配置技巧API响应缓存最…...
2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB
2024IEEE 《基于二次规划的安全关键型多智能体系统的控制》四旋翼 无人机 MATLAB 代码复现(文献代码)协同控制 规划 无人机 研究了基于二次规划的安全关键型多智能体系统的控制问题。 每个被控智能体被建模为一个积分器和一个不确定非线性驱动系统的级联…...
FIFA 23 Live Editor终极指南:10分钟掌握实时游戏修改技巧
FIFA 23 Live Editor终极指南:10分钟掌握实时游戏修改技巧 【免费下载链接】FIFA-23-Live-Editor FIFA 23 Live Editor 项目地址: https://gitcode.com/gh_mirrors/fi/FIFA-23-Live-Editor FIFA 23 Live Editor 是一款专为FIFA 23玩家设计的革命性实时编辑工…...
Phi-3-mini-4k-instruct-gguf入门指南:轻量模型为何更适合中小团队AI能力快速验证
Phi-3-mini-4k-instruct-gguf入门指南:轻量模型为何更适合中小团队AI能力快速验证 1. 为什么选择轻量模型 在AI技术快速发展的今天,中小团队常常面临一个困境:既想快速验证AI能力,又受限于计算资源和时间成本。这正是Phi-3-mini…...
