Netty基本原理
目录
前言
原生NIO VS Netty
原生NIO存在的问题
Netty的优点
线程模型
传统阻塞 I/O (Blocking I/O)
2. 非阻塞 I/O (Non-blocking I/O)
3. 多路复用 I/O (Multiplexed I/O)
4. Reactor 模式
常见的 Reactor 模式的变体:
Netty线程模型
工作原理
前言
Netty是一个高性能、异步、高可靠性,基于事件驱动的网络应用程序框架和工具,用于快速开发可维护的高性能和高可扩展性的协议服务器和客户端,换句话说,Netty是一个基于NIO客户端服务器框架,它简化Java 原生NIO开发难度,是目前最流行的NIO框架,Netty在互联网应用领域、游戏领域、大数据分布式计算领域都有广泛的应用,比如分布式服务框架Dobbo,分布式检索引擎ElasticSearch,大数据计算引擎Spark、Flink等都采用Netty作为网络通信的框架。
原生NIO VS Netty
原生NIO存在的问题
- 复杂性:
-
- NIO设计相对复杂,开发者需要处理许多底层细节,如缓冲区管理,通道操作等。
- 需要手动管理资源,容易出现资源泄露。
- 缺乏直观API设计
- 开发工作量大:
-
- NIO涉及多线程和异步编程,学习成本高,开发者需要更多的代码实现相同的功能
- 编解码繁琐,NIO本身不提供高级的编解码能力,开发者需要自己实现数据的序列化和反序列化
- 缺少内置协议的支持,不支持Http,Ftp协议的支持
Netty的优点
- 设计优雅:适用于各种传输类型的统一 API 阻塞和非阻塞 Socket;基于灵活且可扩展的事件模型,可以清晰地分离关注点;高度可定制的线程模型 - 单线程,一个或多个线程池.
- 性能优秀:Netty 设计用于处理大量的并发连接,并且能够在较低的资源消耗下实现高吞吐量,利用了操作系统级别的多路复用技术,减少了线程上下文切换的开销。
- 丰富的功能:
-
- 内置了许多常用的编解码器,支持多种协议,如 HTTP、WebSocket、SMTP
- Netty 支持 SSL/TLS 加密,确保数据传输的安全性
- Netty 提供了灵活的 ChannelPipeline 模型,允许开发者轻松地添加、删除或替换处理逻辑
- 强大的社区支持:Netty 拥有一个活跃的开源社区,提供了丰富的文档、教程和支持,社区贡献了大量的示例代码和插件,帮助开发者快速上手。
线程模型
传统阻塞 I/O (Blocking I/O)
- 特点:
-
- 每个连接由一个独立的线程处理。
- 线程在等待 I/O 操作完成时会被阻塞。
- 优点:
-
- 实现简单,易于理解。
- 缺点:
-
- 高并发情况下需要大量的线程,导致资源消耗大。
- 线程上下文切换开销高,影响性能。
2. 非阻塞 I/O (Non-blocking I/O)
- 特点:
-
- 使用 NIO 技术,I/O 操作不会阻塞线程。
- 通过选择器(Selector)管理多个通道(Channel),实现单线程或多线程处理多个连接。
- 优点:
-
- 更高效地处理大量并发连接。
- 减少线程数量和上下文切换开销。
- 缺点:
-
- 实现复杂,开发者需要手动管理状态和缓冲区。
- 调试困难,错误处理复杂。
3. 多路复用 I/O (Multiplexed I/O)
- 特点:
-
- 使用操作系统级别的 I/O 多路复用机制(如
select
、poll
、epoll
)来监视多个文件描述符。 - 单个线程可以同时处理多个连接的 I/O 事件。
- 使用操作系统级别的 I/O 多路复用机制(如
- 优点:
-
- 高效地处理大量并发连接。
- 减少了线程的数量和上下文切换。
- 缺点:
-
- 实现相对复杂。
- 性能受限于操作系统的 I/O 多路复用机制。
4. Reactor 模式
- 特点:
-
- 主要用于构建高并发服务器。
- 使用一个或多个 Reactor 线程来分派 I/O 事件到相应的处理器。
- 优点:
-
- 可以处理大量并发连接。
- 分离了 I/O 处理和业务逻辑处理。
- 缺点:
-
- 实现复杂,特别是对于复杂的业务逻辑。
- 错误处理和调试较为困难。
常见的 Reactor 模式的变体:
- 单线程 Reactor:
-
- 所有的 I/O 事件和业务逻辑都在一个线程中处理。
- 适合简单的应用场景,但不适合高负载场景。
- 多线程 Reactor:
-
- 使用多个工作线程来处理业务逻辑。
- 提高了吞吐量,但仍需处理线程同步问题。
- 主从 Reactor:
-
- 主 Reactor 处理新连接请求,从 Reactor 处理已建立连接的 I/O 事件。
- 提高了系统的可伸缩性和稳定性
1.Reactor主线程 MainReactor 对象通过select 监听连接事件, 收到事件后,通过Acceptor 处理连接事件
2.当 Acceptor 处理连接事件后,MainReactor 将连接分配给从Reactor
3.从Reactor 将连接加入到连接队列进行监听,并创建handler进行各种事件处理
4.当有新事件发生时, 从reactor 就会调用对应的handler处理
5.handler 通过read 读取数据,分发给后面的worker 线程处理
6.worker 线程池分配独立的worker 线程进行业务处理,并返回结果
7.handler 收到响应的结果后,再通过send 将结果返回给client
8.Reactor 主线程可以对应多个Reactor 子线程, 即MainRecator 可以关联多个SubReactor
Netty就是基于Reactor模式实现的线程模型。
Netty线程模型
工作原理
Netty抽象出两组线程池,Boss Group负责接收客户端的连接,Worker Group负责网络的读写,Boss Group和Worker Group的类型都是NioEventLoop
NioEventLoopGroup是一个事件循环组,这个组有多个线程,每个线程包含一个NioEventLoop
NioEventLoop表示一个不断执行任务的循环线程,每个NioEventLoop都有一个Selector,用于监听绑定在该通道上的socket网络通讯
BossNioEventLoop循环执行步骤:
1.轮询accept事件
2.处理accept事件,与客户端建立连接,生成NioSocketChannel,并将其注册某个worker NioEventLoop上的selector上
3.处理任务队列的任务,即runAllTasks
每个WorkerNioEventLoop循环执行步骤
1.轮询read/write事件
2.处理read/write事件,在对应的NioSocketChannel上处理
3.处理任务队列的任务,即runAllTasks
每个WorkerNioEventLoop处理业务时,会使用Pipeline,pipeline中包含了bossGroup上NioEventLoop注册到Worker的selector的channel,即通过pipeline可以获取到对应的channel,channel中维护了很多Hander
Netty ChannelHandler组件
ChannelHandler UML图如下:
Netty 中的 ChannelHandler 的作用是,在当前 ChannelHandler 中处理 IO 事件,并将其传递给 ChannelPipeline 中下一个 ChannelHandler 处理,因此多个 ChannelHandler 形成一个责任链,责任链位于 ChannelPipeline 中。
数据在基于 Netty 的服务器或客户端中的处理流程是:读取数据-->解码数据-->处理数据-->编码数据-->发送数据。其中的每个过程都用得到 ChannelHandler 责任链。
相关文章:
Netty基本原理
目录 前言 原生NIO VS Netty 原生NIO存在的问题 Netty的优点 线程模型 传统阻塞 I/O (Blocking I/O) 2. 非阻塞 I/O (Non-blocking I/O) 3. 多路复用 I/O (Multiplexed I/O) 4. Reactor 模式 常见的 Reactor 模式的变体: Netty线程模型 工作原理 前言 N…...
图论入门编程
卡码网刷题链接:98. 所有可达路径 一、题目简述 二、编程demo 方法①邻接矩阵 from collections import defaultdict #简历邻接矩阵 def build_graph(): n, m map(int,input().split()) graph [[0 for _ in range(n1)] for _ in range(n1)]for _ in range(m): …...
Haproxy
一、haproxy简介 HAProxy 是法国开发者 威利塔罗 (Willy Tarreau) 在 2000 年使用 C 语言开发的一个开源软件 是一款具备高并发 ( 万级以上 ) 、高性能的 TCP 和 HTTP 负载均衡器 支持基于 cookie 的持久性,自动故障切换,支持正则表达式及 web 状态统…...
旋转磁体产生的场 - 实验视频资源下载
先发几个视频,是2019年所作的实验内容 更多视频,到某宝找我吧。注意:是收费的。 20190312-180244-旋转磁体产生的场造成激光功率减小 https://download.csdn.net/download/u014161757/90038058 20190313-090956-旋转磁体产生的场对真空介电…...
Java Map
在Java的集合框架中,Map接口用于存储键值对,提供了一种基于键进行查找和操作的数据结构。Map接口的实现类提供了丰富的方法来操作键值对,例如添加、删除、更新和查找。本文将详细介绍Java中的Map接口及其常见实现类,包括HashMap、…...
长三角文博会:Adobe国际认证体系推动设计人才评价新标准
2024年11月22日,由上海、江苏、浙江、安徽三省一市党委宣传部共同发起的第五届长三角文化博览会(简称“长三角文博会”)在上海国家会展中心盛大启幕。长三角文博会自2018年起已成功举办多届,已成为展示区域文化产业发展成果、推动…...
GoogleTest做单元测试
目录 环境准备GoogleTest 环境准备 git clone https://github.com/google/googletest.git说cmkae版本过低了,解决方法 进到googletest中 cmake CMakeLists.txt make sudo make installls /usr/local/lib存在以下文件说明安装成功 中间出了个问题就是,…...
CSDN 博客自动发布脚本(Python 含自动登录、定时发布)
文章目录 关于 csdn auto publisher使用 关于 csdn auto publisher 源码地址:https://github.com/ezscode/csdn_auto_publisher 使用 def test_simple_pub():file_path /Users/xx/Documents/xxx/tool.md article Article(file_path) article.tags [python] art…...
RL78/G15 Fast Prototyping Board Arduino IDE 平台开发过程
这是一篇基于RL78/G15 Fast Prototyping Board的Arduino IDE开发记录 RL78/G15 Fast Prototyping Board硬件简介(背景)基础测试(方法说明/操作说明)开发环境搭建(方法说明/操作说明代码结果)Arduino IDE RL…...
VsCode 插件推荐(个人常用)
VsCode 插件推荐(个人常用)...
零基础学安全--云技术基础
目录 学习连接 前言 云技术历史 云服务 公有云服务商 云分类 基础设施即服务(IaaS) 平台即服务(PaaS) 软件即服务(SaaS) 云架构 虚拟化 容器 云架构设计 组件选择 基础设施即代码 集成部署…...
docker如何安装redis
第一步 如果未指定redis,则安装的是最新版的 docker pull redis 创建一个目录 mkdir /usr/local/docker/redis 然后直接可以下载redis,这是方式确实不怎么好,应该找在官网上找对应的redis配置文件 wget http://download.redis.io/redis-stab…...
搜维尔科技:仿人双臂遥操作系统,力反馈灵巧手操作解决方案
仿人双臂遥操作系统,力反馈灵巧手操作解决方案 搜维尔科技:仿人双臂遥操作系统,力反馈灵巧操作解决方案...
C++ 优先算法 —— 无重复字符的最长子串(滑动窗口)
目录 题目: 无重复字符的最长子串 1. 题目解析 2. 算法原理 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口(同向双指针) 3. 代码实现 Ⅰ. 暴力枚举 Ⅱ. 滑动窗口 题目: 无重复字符的最长子串 1. 题目解析 题目截图: 此题所说的…...
R语言绘图过程中遇到图例的图块中出现字符“a“的解决方法
R语言绘图过程中遇到图例的图块中出现字符的解决方法 因为我遇到这个问题的时候没在网上找到合适的方法,找到个需要付费的,算了。也许是因为问的方式不同,问了半天AI也回答出来,莫名有些烦躁,打算对代码做个分析&…...
海康面阵、线阵、读码器及3D相机接线说明
为帮助用户快速了解和配置海康系列设备的接线方式,本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口,其功能设计包括电源输入、光耦隔离信号输入输出…...
Lua--1.基础知识
Lua基础知识 变量简单的4种变量类型复杂的4种变量类型type函数 字符串操作长度获取--#多行打印字符串拼接别的类型转字符串-- tostring()字符串提供的公共方法 运算符算术运算符-- - * / % ^条件运算符-- > < > < ~(不等于 是 ~)逻辑运算符-- and or not位运算、…...
从Full-Text Search全文检索到RAG检索增强
从Full-Text Search全文检索到RAG检索增强 时光飞逝,转眼间六年过去了,六年前铁蛋优化单表千万级数据查询性能的场景依然历历在目,铁蛋也从最开始做CRUD转行去了大数据平台开发,混迹包装开源的业务,机缘巧合下做了实时…...
Qt桌面应用开发 第八天(读写文件 文件编码 文件流)
目录 1.读文件 2.写文件及编码格式 2.1写文件 2.2编码格式 3.文件信息读取 4.文件流 4.1QTextStream 4.2QDataStream 1.读文件 需求:一个pushButton,点击之后可以选择一个txt文件的路径,路径会显示在lineEdit上,txt文件的…...
玩转 Burp Suite (1)
内容预览 ≧∀≦ゞ 玩转 Burp Suite (1)声明Burp Suite 简介Dashboard(仪表盘)1. 默认任务管理2. 暂停任务3. 新建扫描任务4. 使用总结 Target(目标)1. SIte Map (站点地图)2. Scope(范围&#…...
MyBatis高级扩展
一、Mapper批量映射优化: 1.需求: Mapper 配置文件很多时,在全局配置文件中一个一个注册太麻烦,希望有一个办法能够一劳永逸 2.配置方式: Mybatis允许在指定Mapper映射文件时,只指定其所在的包: <mappers><package name"c…...
蓝桥杯c++算法秒杀【6】之动态规划【下】(数字三角形、砝码称重(背包问题)、括号序列、异或三角:::非常典型的必刷例题!!!)
别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! ! ! 关注博主,更多蓝桥杯nice题目静待更新:) 动态规划 三、括号序列 【问题描述】 给定一个括号序列,要求尽可能少地添加若干括号使得括号序列变得合…...
MR30分布式 IO 模块在冷却水泵系统中的卓越应用
在当今各类工业生产以及大型设施运行的场景中,冷却水泵系统起着至关重要的作用,它犹如保障整个运转体系顺畅运行的 “血液循环系统”,维持着设备适宜的温度环境,确保其稳定、高效地工作。而随着科技的不断发展,明达技术…...
微前端基础知识入门篇(二)
概述 在上一篇介绍了一些微前端的基础知识,详见微前端基础知识入门篇(一)。本文主要介绍qiankun微前端框架的实战入门内容。 qiankun微前端实践 通过Vite脚手架分别创建三个程序,主应用A为:vite+vue3+ts,两个微应用分别为B:vite+vue3+ts;C:vite+React+ts。因为qiankun的…...
直接抄作业!Air780E模组LuatOS开发:位运算(bit)示例
在嵌入式开发中,位运算是一种高效且常用的操作技巧。本文将介绍如何使用Air780E模组和LuatOS进行位运算,并通过示例代码帮助读者快速上手。 一、位运算概述 位运算是一种在计算机系统中对二进制数位进行操作的运算。由于计算机内部数据的存储和处理都是…...
从零开始理解JVM:对象的生命周期之对象销毁(垃圾回收)
一、JVM参数 在学垃圾回收器之前,我们先要知道,jvm参数是怎么回事。因为配置各种回收器,必须对应各种参数设置。 标准参数(-) 所有的JVM实现都必须实现这些参数的功能,而且向后兼容 -help-version 非标准参…...
计算机网络的发展
目录 起源与早期发展 ARPANET与TCP/IP协议的诞生 互联网的诞生与普及 高速互联网与无线网络的兴起 移动互联网与云计算的崛起 物联网、区块链与自动驾驶技术的兴起 起源与早期发展 计算机网络的雏形最早可以追溯到20世纪60年代,主要是为了共享大型计算资源。当…...
python3 自动更新的缓存类
这个类会在后台自动更新缓存数据,你只需要调用方法来获取数据即可。 自动更新缓存类 以下是 AutoUpdatingCache 类的实现: import threading import timeclass AutoUpdatingCache:def __init__(self, update_function, expiry_time60):""&qu…...
PICO 获取设备号 SN码
Unity版本 2020.3.42f1c1PICO SDK版本PICO Unity Integration SDK-3.0.5-20241105Pico设备pico 4ultra 注意 此api暂时只测试企业版本 pico 4ultra 代码 using Unity.XR.PICO.TOBSupport;private void Awake() {bool result PXR_Enterprise.InitEnterpriseService();Debug.L…...
spf算法、三类LSA、区间防环路机制/规则、虚连接
1.构建spf树: 路由器将自己作为最短路经树的树根根据Router-LSA和Network-LSA中的拓扑信息,依次将Cost值最小的路由器添加到SPF树中。路由器以Router ID或者DR标识。广播网络中DR和其所连接路由器的Cost值为0。SPF树中只有单向的最短路径,保证了OSPF区域内路由计管不…...
计算机基础(下)
内存管理 内存管理主要做了什么? 操作系统的内存管理非常重要,主要负责下面这些事情: 内存的分配与回收:对进程所需的内存进行分配和释放,malloc 函数:申请内存,free 函数:释放内存…...
OpenCV从入门到精通实战(七)——探索图像处理:自定义滤波与OpenCV卷积核
本文主要介绍如何使用Python和OpenCV库通过卷积操作来应用不同的图像滤波效果。主要分为几个步骤:图像的读取与处理、自定义卷积函数的实现、不同卷积核的应用,以及结果的展示。 卷积 在图像处理中,卷积是一种重要的操作,它通过…...
Java基础——(一)Java概述
Java特性 简单性:Java与C很相似,但剔除了C中许多比较复杂并且很少使用的功能,比如头文件、指针运算、结构、联合、操作符重载、虚基类等,从而使Java更易于上手、学习。面向对象:Java是一门面向对象语言,具…...
关于IDE的相关知识之三【插件安装、配置及推荐的意义】
成长路上不孤单😊😊😊😊😊😊 【14后😊///C爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于ide插件安装、配置及推荐意义的相关内容…...
C++设计模式之组合模式的基本结构
组合模式的UML类图表示如下: ------------------ ------------------ | Component | <----- | Leaf | ------------------ ------------------ | operation() | | operation() | ------------------ --…...
Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)
目录 1、漏洞描述 2、EXP下载地址 3、EXP利用 1、漏洞描述 Apache OFBiz是一套企业资源计划(ERP)系统。它提供了广泛的功能,包括销售、采购、库存、财务、CRM等。 Apache OFBiz还具有灵活的架构和可扩展性,允许用户根据业务需求…...
梯度——多元函数偏导数——梯度算子的理论基础
梯度是一个数学概念,在多维空间中表示函数在某一点处变化最快的方向和变化率。 对于一个多元函数 f ( x 1 , x 2 , ⋯ , x n ) f(x_1, x_2, \cdots, x_n) f(x1,x2,⋯,xn),其梯度是一个向量,记作 ∇ f \nabla f ∇f或者 grad f f f&…...
【GPT】力量训练的底层原理?
详细解读力量训练的每一个底层原理 力量训练之所以有效,是因为它利用了肌肉、神经系统和生物化学反应的基本机制。以下逐一详细解析,并解释相关概念。 1. 应力-恢复-适应理论 概念解析 应力(Stress):指训练带来的负…...
Django 路由层
1. 路由基础概念 URLconf (URL 配置):Django 的路由系统是基于 urls.py 文件定义的。路径匹配:通过模式匹配 URL,并将请求传递给对应的视图处理函数。命名路由:每个路由可以定义一个名称,用于反向解析。 2. 基本路由配…...
Unity项目性能优化列表
1、对象池 2、检查内存是否泄露。内存持续上升(闭包、委托造成泄露) 3、检查DrawCall数量,尽量减少SetPassCall 4、尽量多的利用四种合批 动态合批(Dynamic Batching)静态合批(Static Batching)GPUInstancingSRP Batcher 动态合批消耗内存把多个网格组合在一起合并…...
docker启动kafka、zookeeper、kafdrop
1、启动zookeeper docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper2、启动kafka docker run -d --name kafka --publish 9092:9092 --link zookeeper:zookeeper -e KAFKA_BROKER_ID1 -e HOST_IP127.0.0.1 -e KAFKA_ZOOKEEPER_CONNECTzookeeper:2181…...
Pytest使用Jpype调用jar包报错:Windows fatal exception: access violation
问题描述 之前我们有讲过如何使用Jpype调用jar包,在成功调用jar包后,接着在Pytest框架下编写自动测试用例。但是在Pytest下使用Jpype加载jar包,并调用其中的方法会以下提示信息: 虽然提示信息显示有Windows显示致命…...
【AI赋能 Python编程】第十一章 Python技能提升指南:借助AI加速学习
AI赋能 Python编程-系列文章目录 第十一章 Python技能提升指南:借助AI加速学习 文章目录 AI赋能 Python编程-系列文章目录第十一章 Python技能提升指南:借助AI加速学习 前言明确学习目标基础入门指导进阶学习指导学习过程互动综合学习提示模板 前言 在…...
️ 爬虫开发中常见的性能优化策略有哪些?
在爬虫开发中,性能优化是确保爬虫稳定、高效运行的关键。以下是一些常见的性能优化策略,结合了搜索结果中的信息: 异步编程: 使用 asyncio 和 aiohttp 实现高并发,提高爬取效率。异步请求允许在等待一个请求完成的同时…...
Ubuntu安装不同版本的opencv,并任意切换使用
参考: opencv笔记:ubuntu安装opencv以及多版本共存 | 高深远的博客 https://zhuanlan.zhihu.com/p/604658181 安装不同版本opencv及共存、切换并验证。_pkg-config opencv --modversion-CSDN博客 Ubuntu下多版本OpenCV共存和切换_ubuntu20如同时安装o…...
《操作系统 - 清华大学》5 -4:虚拟技术
文章目录 0. 虚拟存储的定义1. 目标2.局部性原理3. 虚拟存储的思路与规则4. 虚拟存储的基本特征5. 虚拟页式存储管理5.1 页表表项5.2 示例 0. 虚拟存储的定义 1. 目标 虚拟内存管理技术,简称虚存技术。那为什么要虚存技术?在于前面覆盖和交换技术&#…...
网安瞭望台第5期 :7zip出现严重漏洞、识别网络钓鱼诈骗的方法分享
国内外要闻 7 - Zip存在高危漏洞,请立刻更新 2024 年 11 月 24 日,do son 报道了 7 - Zip 中存在的一个高严重性漏洞 CVE - 2024 - 11477。7 - Zip 是一款广受欢迎的文件压缩软件,而这个漏洞可能会让攻击者在存在漏洞的系统中执行恶意代码。…...
【JS】面试八股文
类型 JavaScript 有哪些数据类型,它们的区别? 答:JavaScript 共有八种数据类型, 分别是 Undefined、 Null、 Boolean、Number、String、Object、Symbol、BigInt。 其中 Symbol是ES6中新增的,BigInt 是 ES2020 中新增的。 Symbol 代表创建后独一无二且不可变的数据类型,…...
1、正则表达式
grep匹配 grep用来过滤文本内容,以匹配要查询的结果。 grep root /etc/passwd:匹配包含root的行 -m 数字:匹配几次后停止 -v:取反-i:忽略字符的大小写,默认的,可以不加-n:…...
带有悬浮窗功能的Android应用
android api29 gradle 8.9 要求 布局文件 (floating_window_layout.xml): 增加、删除、关闭按钮默认隐藏。使用“开始”按钮来控制这些按钮的显示和隐藏。 服务类 (FloatingWindowService.kt): 实现“开始”按钮的功能,点击时切换增加、删除、关闭按钮的可见性。处…...