Netty网络通信模型
传统IO模型:
传统IO模型就是阻塞IO,即处理业务逻辑的线程去进行IO,当然IO操作很耗时,然后线程就得阻塞,当然CPU会回收该线程的时间片,把该线程挂起,切换到其他线程去执行,在并发量大的场景中,会造成大量的线程切换,而每一次线程切换都会消耗一定的资源,造成性能低下。
Netty是什么:
Netty是一个基于Java NIO(非阻塞IO)的异步事件驱动的网络应用框架,它提供了高性能、可扩展和易于使用的网络编程接口。
Netty做了件什么事情呢,就是把业务逻辑线程从IO操作中解放出来了,它内部搞了线程池,这个线程池里面的线程专门负责去做IO,但是对外表现出来,业务逻辑线程只要过来就立刻可以拿到它想要的内容而不需要去做IO操作了。
Netty的网络模型基于Reactor模式。首先来看看什么是Reactor模式。
Reactor模式:
Reactor模式是一种基于事件驱动的设计模式,用于处理并发I/O操作。它的核心思想是将I/O操作和事件处理解耦,使得程序能够高效地处理多个并发的I/O请求。
Reactor模式由以下几个关键组件组成:
-
Reactor:Reactor是事件分发器,负责接收并分发事件,一般只用一个线程足矣。它会监听各种事件,如连接请求、数据到达等,并将事件分发给对应事件处理器进行处理。
-
Handlers:Handlers是事件处理器,负责实际处理事件,也就是实际去执行IO操作的线程,一般会弄一个线程池。当Reactor将事件分发给Handlers时,Handlers会执行相应的操作,如读取数据、写入数据等。
-
Event:Event是发生的事件,如连接建立、数据到达等。它会被封装成事件对象,传递给Reactor进行分发。
-
Event Loop:Event Loop是一个事件循环器,一般也是一个线程足矣。在Event Loop中,这个事件循环线程会不断地监听事件,并将事件分发给对应的事件处理器进行处理。
Reactor模式的工作流程如下:
-
Reactor监听Event,并等待Event的到达。
-
当Event到达时,Reactor将Event封装成事件对象。
-
Reactor将事件对象分发给对应的Handlers。
-
Handlers执行相应的IO操作,如读取数据、写入数据等。
-
处理完事件后,Handlers将控制权交还给Reactor。
Reactor模式的出现就是为了解决线程处理I/O时的阻塞和频繁线程切换所带来的性能问题。通过避免线程的阻塞和频繁的线程切换,Reactor模式能够有效地提高程序的性能。相比于传统的线程模型,它可以处理更多的并发连接,提高了系统的吞吐量和响应性能。
总结起来,Reactor模式是一种基于事件驱动的设计模式,通过解耦I/O操作和事件处理,使程序能够高效地处理多个并发的I/O请求。它由Reactor、Handlers、Event和Event Loop等组件构成,通过事件分发和处理来实现并发处理。
Netty网络通信模型:
下面是Netty的网络通讯模型概述:
-
Boss线程池:Boss线程池负责接受客户端的连接请求,并将连接注册到Worker线程池中的某个线程上进行处理。通常情况下,Boss线程池只有一个线程。Boss线程大致对应了Reactor模式中的Reactor。
-
Worker线程池:Worker线程池负责处理实际的网络I/O操作,包括读取、写入和处理请求等。Worker线程池中可以有多个线程,每个线程都会被分配一个或多个连接进行处理。Worker线程池对应了Reactor模式中的Handlers。
-
Channel、EventLoop和ChannelPipeline:Netty中的核心概念是Channel、EventLoop和ChannelPipeline。一个Channel代表一个实际的网络连接,EventLoop是一个处理事件的循环,而ChannelPipeline则是一个处理事件的管道。EventLoop对应了Reactor模式中的EventLoop。
-
事件驱动模型:Netty的网络模型是基于事件驱动的,当有事件发生时(如连接建立、数据到达等),Netty会将事件封装成事件对象并派发给对应的事件处理器进行处理。事件处理器可以是用户自定义的处理器,也可以是Netty提供的预定义处理器。
-
异步和非阻塞:Netty采用异步和非阻塞的方式进行网络操作,这意味着它可以同时处理多个连接,并且不会因为某个连接的慢速操作而阻塞其他连接的处理。
总的来说,Netty的网络模型基于Reactor模式,通过Boss线程池接受连接请求并将连接注册到Worker线程池中的某个线程上进行IO处理。Netty采用异步和非阻塞的方式进行网络操作,通过事件驱动模型和ChannelPipeline来处理网络事件。这种模型使得Netty在高性能、可扩展和易于使用方面具有优势,并广泛应用于构建高性能的网络应用程序。
相关文章:
Netty网络通信模型
传统IO模型: 传统IO模型就是阻塞IO,即处理业务逻辑的线程去进行IO,当然IO操作很耗时,然后线程就得阻塞,当然CPU会回收该线程的时间片,把该线程挂起,切换到其他线程去执行,在并发量大…...

.NET快速对接极光消息推送
什么是消息推送? 很多手机APP会不定时的给用户推送消息,例如一些新闻APP会给用户推送用户可能感兴趣的新闻,或者APP有更新了,会给用户推送是否选择更新的消息等等,这就是所谓的“消息推送”。 常见的一些APP消息推送…...

Doris:多源数据目录(Multi-Catalog)
目录 1.基本概念 2.基本操作 2.1 查看 Catalog 2.2 新增 Catalog 2.3 切换 Catalog 2.4 删除 Catalog 3.元数据更新 3.1手动刷新 3.2定时刷新 3.3自动刷新 4.JDBC Catalog 4.1 上传mysql驱动包 4.2 创建mysql catalog 4.3. 读取mysql数据 1.基本概念 …...

建行驻江门市分行纪检组以政治谈话压责任促发展
开展政治谈话,是加强“一把手”和领导班子监督、严肃党内政治生活、加强对党员领导干部日常教育管理的有效手段。 为督促“一把手”和领导班子成员依法依规履行职责、行使权力,推动党中央重大决策部署以及建设银行总行、广东省分行党委的决策部署在本单…...

如何从存档服务器上完全删除PDM用户
当创建新用户时使用“PDM 登录”类型(如下图),PDM用户名和密码会存储于存档服务器的注册表中。 存档服务器的注册表位置如下: HKEY_LOCAL_MACHINE\SOFTWARE\SolidWorks\Applications\PDMWorks Enterprise\ArchiveServer\ConisioU…...
导师对学生学术论文的指导包括哪些方面,请详细展开说明
导师在指导学生学术论文时涉及多个方面,这些方面旨在帮助学生培养独立研究和学术写作的能力。以下是一些导师可能涉及的主要方面: 1.选题和课题确定: 导师会与学生讨论潜在的研究兴趣和方向,帮助学生选择一个既有研究价值又符合其…...

嵌入式软件开发是个啥职业?
在硬件行业中,有一类工作岗位是更偏向软件的,或者说是软硬结合非常紧密的工作,那就是嵌入式开发工程师。 说起嵌入式,可能很多没有接触过电子类的人没有听说这些东西。 其实简单来说,嵌入式开发就是写程序去控制硬件电…...

03【远程协作开发、TortoiseGit、IDEA绑定Git插件的使用】
上一篇:02【Git分支的使用、Git回退、还原】 下一篇:【已完结】 目录:【Git系列教程-目录大纲】 文章目录 一、远程协作开发1.1 远程仓库简介1.1.1 Github1.1.2 Gitee1.1.3 其他托管平台 1.2 发布远程仓库1.2.1 创建项目1) 新…...
Linux:centos7通过yum安装mysql的方法
1. 检查mysql是否安装 yum list installed | grep mysql如果有的话,就全部卸载 yum -y remove 数据库名称2. MySQL依赖libaio,所以先要安装libaio yum search libaio # 检索相关信息 yum install libaio # 安装依赖包3. 下载MySQL Yum Repository 如…...

【算法与数据结构】93、LeetCode复原 IP 地址
文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:参照【算法与数据结构】131、LeetCode分割回文串的思路,需要将IP字符串进行分割࿰…...

uniapp点击图片放大预览
阐述 有些时候我们在用uniapp显示图片时,有的不宜全部显示到屏幕上,uniapp提供了一个非常好用的api。 实现方式如下: <template><view class"content"><image class"logo" src"/static/images/a.…...

Java TreeMap
TreeMap 是一个基于 key 有序的 key value 散列表。 map 根据其键的自然顺序排序,或者根据 map 创建时提供的 Comparator 排序不是线程安全的key 不可以存入null底层是基于红黑树实现的 TreeMap 的类结构图: 实现了 NavigableMap 接口,Na…...
ubuntu 内网源如何搭建 —— 筑梦之路
为什么要搭建内网源? 原因:内网开发环境由于其特定原因不能上外网,所以需要本地环境下的内网源来方便开发人员下载安装软件 搭建建议 单独使用一块磁盘来存放源文件或者单独一个目录下,避免混淆。 环境说明 ubuntu 系统 两张…...

测试用例的设计方法(黑盒)
1.基于需求的设计方法 比如针对网易邮箱进行测试:分为功能相关和非功能相关两大类 但是这么设计的话,有无数多个测试用例,我们现在看到的只是一些大概的测试用例,要想设计具体的测试用例,需要用到下面测试用例的方法…...

Shell编程入门--概念、特性、bash配置文件
目录 一、Shell概念1.定义2.分类和使用场景2.1.分类和切换2.2.使用场景 3.特性3.1.文件描述符与输出重定向3.2.历史命令---history3.3.别名 --alias3.4.命令排序执行3.5.部分快捷键3.6.通配符置换 4.脚本规范5.脚本运行方式5.1.bash脚本执行5.2.bash脚本测试 二、bash配置文件1…...
读书笔记:彼得·德鲁克《认识管理》第14章 工作、做工与员工
一、章节内容概述 虽然工作的历史与人类一样久远,但对工作展开系统研究不过是近百年之内的事,并且“做工”,也就是人从事工作,迄今为止仍很少受到 系统关注。然而我们知道,工作和做工不同,工作是客观的“事…...
diffusers库中stable Diffusion模块的解析
diffusers库中stable Diffusion模块的解析 diffusers中,stable Diffusion v1.5主要由以下几个部分组成 Out[3]: dict_keys([vae, text_encoder, tokenizer, unet, scheduler, safety_checker, feature_extractor])下面给出具体的结构说明。 “text_encoder block…...

智慧城市照明为城市节能降耗提供支持继电器开关钡铼S270
智慧城市照明:为城市节能降耗提供支持——以钡铼技术S270继电器开关为例 随着城市化进程的加速,城市照明系统的需求也日益增长。与此同时,能源消耗和环境污染问题日益严重,使得城市照明的节能减排成为重要议题。智慧城市照明系统…...
固高GTS800控制卡开发数控系统宏程序心得
在对固高GTS800控制卡做数控系统开发时,经过多年的总结与积累,总算是实现了一个数控系统的基本功能。 基本实现宏程序的译码与执行同时执行,虽然不是实时执行,但在充分利用插补缓存区的基础上,实现了相对的实时性。 …...

linux入门---线程池的模拟实现
目录标题 什么是线程池线程的封装准备工作构造函数和析构函数start函数join函数threadname函数完整代码 线程池的实现准备工作构造函数和析构函数push函数pop函数run函数完整的代码 测试代码 什么是线程池 在实现线程池之前我们先了解一下什么是线程池,所谓的池大家…...

iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会
在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...