Netty基础
Netty基础
- 一级目录
- I/O请求基础知识
- Netty如何实现自己的I/O模型
- 网络框架的选型
- Netty整体架构
- Netty逻辑处理架构
- 网络通信层
- 事件调度层
- 服务编排层
- 组件关系梳理
- Netty源码结构
netty是目前最流行的一款高性能java网络编程框架,广泛使用于中间件、直播、社交、游戏等领域。
是Dubbo、RocketMQ、Elasticsearch、Hbase等
netty的高性能表现在哪些方面?
netty中有哪些重要组件,他们之间的联系
netty的内存池、对象池是如何设计的
针对netty有哪些印象深刻的系统调优案例
一级目录
netty对于:数据编解码、拆包/粘包、TCP断线重连
提供了现成的解决方案
遇到问题可以在社区讨论
netty的迭代周期短修复问题快
可靠性和健壮性
为什么选择netty
I/O模型、线程模型和事件处理机制
易用性API接口
对数据协议、序列化的支持
I/O请求基础知识
- I/O调用阶段:用户进程向内核发起系统调用
- I/O执行阶段:内核等待I/O请求处理完成返回
Linux的五种I/O模式
-
同步阻塞I/O(BIO)
-
同步非阻塞I/O(NIO)
-
I/O多路复用
-
信号驱动I/O
-
异步I/O
Netty如何实现自己的I/O模型
基于非阻塞I/O实现
底层依赖的是JDK NIO框架的多路复用器Selector
一个多路复用器Selector可以同时轮询多个Channel
在I/O多路复用的场景下,当有数据处于就绪状态后,需要一个事件分发器(Event Dispather)
负责将读写事件分发给对应的读写事件处理器(Event Handler)
事件分发器有两种设计模式
Reactor(采用同步I/O)和Proactor(采用异步I/O)
netty采用主从reactor多线程模型,所有的I/O事件都注册到一个I/O多路复用器上,当有I/O事件就绪后I/O多路复用器会将该I/O事件通过事件分发器,分发到对应的事件处理器中,该线程模型避免了同步问题以及多线程切换带来的资源开销,真正做到高性能低延迟
更低的资源消耗:
面临大量的网络对象创建和销毁的问题
- 对象池复用技术
- 零拷贝技术
网络框架的选型
Netty整体架构
主要分为三个模块:
Core核心层
提供底层网络通信的通用抽象和实现,包括可扩展的事件模型、通用的通信API、支持零拷贝的ByteBuf等
Protocol Support 协议支持层
覆盖了主流协议的编解码实现,如HTTP、SSL、Protobuf、压缩、大文件传输、WebSocket、文本、二进制等
支持自定义应用层协议
TransportService传输服务层
传输服务层提供了网络传输能力的定义和实现方法,支持Socket、HTTP隧道、虚拟机管道等传输方式
netty的模块设计具有较高的通用性和可扩展性
Netty逻辑处理架构
网络通信层
职责是执行网络I/O的操作,支持多种网络协议和I/O模型的连接操作
事件调度层
通过Reactor线程模型对各类事件进行聚合处理
通过Selector主循环线程集成多种事件
核心组件包括EventLoopGroup、EventLoop
eventLoopGroup本质是一个线程池,主要负责接收I/O请求,并分配线程执行处理请求
- 一个eventLoopGroup往往包含一个或多个EventLoop,EventLoop用于处理channel生命周期内的所有I/O事件,如accept、read、write等等
- EventLoop同一个时间会与一个线程绑定,每个EventLoop负责处理多个channel
- 每新建一个channel,EventLoopGroup会选择一个EventLoop与其绑定,该channel在生命周期内都可以对eventLoop进行多次绑定和解绑
EventLoopGroup是Netty Reactor线程模型的具体实现方式
事件调度层负责监听网络连接和读写操作,然后触发各种类型的网络事件,需要一种机制管理这种错综复杂的事件,并有序地执行
服务编排层
负责组装各类服务,用以实现网络事件的动态编排和有序传播
ChannelPipeline负责组装各种ChannelHandler
实际数据的编解码以及加工处理操作由ChannelHandler完成
当I/O读写事件触发时,ChannelPipeline会依次调用ChannelHandle列表对Channel的数据进行拦截和处理
ChannelPipeline是线程安全的,因为每一个新的Channel会对应绑定一个新的ChannelPipeline
一个ChannelPipeline关联一个EventLoop,一个EventLoop仅会绑定一个线程
以客户端为例:数据从客户端发往服务端,该过程称为出站,反之为入站
数据入站有一系列InboundHandler处理,再以一系列相反方向的outboundHandler处理后完成出站,我们经常使用的编码encoder是编码操作,解码decoder是入站操作
服务端接收到客户端数据后,需要先经过decoder入站处理后,再通过encoder出站通知客户端
每创建一个Channel都会绑定一个新的ChannelPipeline;
ChannelPIpeline中每加入一个ChannelHandler都会绑定一个ChannelHandleContext
每个Handler绑定Context的作用是什么?
- context 用于保存ChannelHandler上下文,通过它可以知道ChannelPipeline和ChannelHandler的关联关系
- context实现了ChannelHandler之间的交互
- context包含了ChannelHandler生命周期的所有事件,如connect、bind、read、flush、write、close等
组件关系梳理
Netty源码结构
相关文章:

Netty基础
Netty基础 一级目录I/O请求基础知识Netty如何实现自己的I/O模型 网络框架的选型 Netty整体架构Netty逻辑处理架构网络通信层事件调度层服务编排层 组件关系梳理Netty源码结构 netty是目前最流行的一款高性能java网络编程框架,广泛使用于中间件、直播、社交、游戏等领…...
602,好友申请二:谁有最多的好友
好友申请二:谁有最多的好友 实现 with tmp as (selectrequester_id idfrom RequestAcceptedunion allselectaccepter_id idfrom RequestAccepted )selectid,count(*) num from tmp group by id order by num desc limit 1;...
【Matlab算法MATLAB实现的音频信号时频分析与可视化(附MATLAB完整代码)
MATLAB实现的音频信号时频分析与可视化 前言正文:时频分析实现原理代码实现代码运行结果图及说明结果图:结果说明:总结前言 音频信号的时频分析是信号处理领域中的一个重要研究方向。它允许我们同时观察信号在时间和频率域的特性,为音频处理、语音识别、音乐分析等应用提供…...

界面耻辱纪念堂--可视元素03
更多的迹象表明,关于在程序里使用新的动态界面元素,微软的态度是不确定的,其中一个是仅仅需要对比一下Office97 里的“Coolbars”和“标准工具条”。Coolbar 按钮直到用户指针通过的时候才成为按钮(否则是平的)。 工具…...

国产龙芯处理器选择迅为2K1000开发板有资料
硬件配置国产龙芯处理器,双核64位系统,板载2G DDR3内存,流畅运行Busybox、Buildroot、Loognix、QT5.12 系统!接口全板载4路USB HOST、2路千兆以太网、2路UART、2路CAN总线、Mini PCIE、SATA固态盘接口、4G接口、GPS接口WIF1、蓝牙、Mini HDMI…...
MySQL 命令(持续更新)
将 MySQL 命令结果输出到文件中 通过 k8s MySQL pod 里的客户端连接到 MySQL 服务器 kubectl exec mysql-pod -- mysql -hx.x.x.x -uroot -proot -e SELECT * FROM db.table; > result.txt通过 k8s MySQL pod 的客户端连接 MySQL 服务器,直接进入到 MySQL 客户端…...

Linux下Docker方式Jenkins安装和配置
一、下载&安装 Jenkins官方Docker仓库地址:https://hub.docker.com/r/jenkins/jenkins 从官网上可以看到,当前最新的稳定版本是 jenkins/jenkins:lts-jdk17。建议下在新的,后面依赖下不来 所以,我们这里,执行doc…...

低代码框架参考
企业管理信息系统作为一类重要的应用软件系统,具有自己的特点,主要有两个方面: 1. 系统规模大,目前市场上常见的ERP系统一般都有几千个页面。 2. 页面逻辑相似性强。经过比较可以发现,大部分页面具有类似的功能&…...

2024 年 9 月区块链游戏研报:行业回暖,Telegram 游戏引发热潮
作者:Stella L (stellafootprint.network) 数据来源:Footprint Analytics Games Research Page 9 月份,区块链游戏代币的市场总值增长了 29.2%,达到 232 亿美元,日活跃用户(DAU)数量上升了 1…...
python爬虫登录校验之滑块验证、图形验证码(OCR)
在爬虫过程中,验证码和滑块验证是常见的反爬措施。针对这些挑战,通常采用OCR识别图形验证码和模拟滑块拖动来处理滑块验证。以下是如何处理这两种类型验证的详细方法。 1. 图形验证码(OCR) a. 使用 tesserocr 和 Pillow 处理图形…...
(一)Python程序结构
1、Python写模块 使用缩进分层来写模块; 2、缩进规范 最好使用同一种缩进方式,统一使用tab或者空格键; 3、换行符:\n; print("窗前明月光\n疑似地上霜") 4、续行符号:\; 注意1…...

二叉树——相同的树
还是应用递归的思想,将这个问题拆分为三个部分,第一:当两棵树均为空树,或者访问到最后的子树时均为空树时,则返回true。第二:当两棵树中其中一棵树为空树,另一棵树不是空树,证明两棵…...
探秘 1688 商品详情接口:高并发批量采集的实战攻略
在进行 1688 商品详情接口批量采集并考虑高并发使用时,你可以从以下几个方面着手: 一、技术选型 选择合适的编程语言和框架:例如 Python 的 Scrapy 框架或者 Java 的 Spring Boot 结合相关爬虫库等,这些工具可以帮助你高效地实现…...
【C语言】sizeof
tmp_buf = (char *)malloc(size)不可以直接使用`sizeof`来查看动态分配内存的大小。在C语言中,`sizeof`操作符是在编译时确定类型或对象的大小,并不能用于动态获取malloc分配的内存大小。 下面解释为什么不能用`sizeof(tmp_buf)`查看动态分配的内存大小: 1. 编译时 vs 运行时…...
2024-10-15 问AI: [AI面试题] 人工智能中使用了哪些不同的搜索算法?
文心一言 人工智能中使用了多种不同的搜索算法来解决问题,这些算法各有特点,适用于不同的场景和问题类型。以下是一些常见的人工智能搜索算法: 深度优先搜索(DFS): 是一种基于树或图的搜索算法。核心思想是…...

2024 年 04 月编程语言排行榜,PHP 排名创新低?
编程语言的流行度总是变化莫测,每个月的排行榜都揭示着新的趋势。2024年4月的编程语言排行榜揭示了一个引人关注的现象:PHP的排名再次下滑,创下了历史新低。这种变化对于PHP开发者和整个技术社区来说,意味着什么呢? P…...

Element中el-table组件设置max-height右侧出现空白列的解决方法
之前就出现过这个情况,没理过,因为不影响啥除了不美观...但今天看着实在是难受,怎么都不顺眼(可能是我自己烦躁--) 试了很多网上的方法,都不得行,后面发现了这篇文章,解决了! 感谢! Element中t…...

unity学习-全局光照(GI)
在全局光照(Lighting)界面有两个选项 Realtime Light(实时光照):在项目中会提前计算好光照以及阴影的程序,当你需要调用实时全局光照的时候会将程序调用出来使用 Mixed Light(烘焙光照&#x…...

记录Centos7 漫漫配置路
记录Centos7 漫漫配置路 一、 配置源二、 clinfo三、 PCL 配置1. 依赖2. eigen3. boost4. flann5. pcl 四、YAML-CPP五、 miniconda 安装 python3.6 和 pytorch六、libbot 配置1. 容易安装的依赖2. 需要源码安装的依赖3. [libbot](https://github.com/libbot2/libbot2) 简单地说…...

论文 | OpenICL: An Open-Source Framework for In-context Learning
主要内容: 2. 提供多种 ICL 方法: 3. 完整的教程: 4. 评估和验证: 背景: 随着大型语言模型 (LLM) 的发展,上下文学习 (ICL) 作为一种新的评估范式越来越受到关注。问题: ICL 的实现复杂…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
第25节 Node.js 断言测试
Node.js的assert模块主要用于编写程序的单元测试时使用,通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试,通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...