Netty的基本架构详解
EventLoopGroup基本认识
我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱:
我们上一节课使用的案例,使用的是NioEventLoopGroup
,他是NIO的实现,可以看出来他是MultithreadEventLoopGroup
的子类,从名字上可以看出来,NioEventLoopGroup是一个多线程事件循环组,这里你可以把它看作是一个线程池,内部存在多个线程(NioEventLoop),每一个客户端连接的SocketChannel
都对应一个线程(NioEventLoop)!
我们上面一直再说NioEventLoop, 我们基于上图可以看出来,他是SingleThreadEventLoop
的子类,从名字上也能看出来,他是一个单线程的执行器!我们可以看到,他的父接口事实上也是继承与EventLoopGroup
, 也就是说,虽然NIoEventLoop是一个单线程事件循环,但是我们基于接口,也可以把他看作为一个线程池,只不过这个线程池内部只有一个线程!
\## Netty的通讯通道
我们需要了解的Netty中的管道种类,这里我们重点分析NIO的实现方式:
我们可以看到,Netty的Socket通讯管道的主要实现方式有两种,NioServerSocketChannel
, NioSocketChannel
, 这两种实现是Netty对于服务端通道,与客户端通道的不同实现,我们在开发Netty的服务端与客户端的时候,会指定使用管道的类型! 这里面有一个比较重要的点,即NioServerSocketChannel的父类实现是 AbstractNioMessageChannel, NioSocketChannel的父类实现是AbstractNioByteChannel ,这两个实现是后续NIO事件循环的时候判断是处理连接还是处理数据的重要手段,这里留个印象,我们后续会详细说!
Netty的管道流
我们需要了解的Netty的业务执行链,又叫管道流 ChannelPipeline
:
我们的Netty代码中都会由类似这种逻辑的代码:
他是Netty能够让我们专注于业务的主要实现方式,他的主要实现是一个双向链表,这里是在链表末尾追加一个Handler业务处理器,Handler的种类大致分为两种:
如上图所示,他有两种实现方式,一个是ChannelInboundHandlerAdapter
一个是ChannelOutboundHandlerAdapter
, 他们的调用在一个业务流中的执行顺序如下,我们借用一个图示来说明:
当我们调用Socket的读数据的API时,即从Socket管道读取数据时,Pipeline会按照你的添加顺序依次执行 Inbound Handler,当我们读取事件完毕,调用write方法向通道内写入数据的时候,管道流开始调用 Outbound Handler方法,倒序调用!这个倒序调用可能不好理解,我们还是用图来说明:
当调用read方法的时候,顺序调用Inbound节点! 当调用write方法的时候,倒序调用outbount方法!
Netty的Handler事件回调种类
1. ChannelInboundHandler
方法名称 | 方法作用 |
---|---|
handlerAdded | 通道被添加 1 |
channelRegistered | JDK注册成功后回调所有Handler的方法 2 |
channelActive | jdkChannel被激活后回调 3 |
channelRead | 通道内有数据可读 4 |
channelReadComplete | 数据读取完毕 5 |
channelInactive | 通道被关闭后回调该方法 6 |
channelUnregistered | 通道被取消注册回调用该方法 7 |
handlerRemoved | 通道被删除 8 |
userEventTriggered | 如果触发了用户事件,则调用该方法。 |
channelWritabilityChanged | 可写的状态改变 |
exceptionCaught | 发生了异常 |
2. ChannelOutboundHandler
方法名称 | 方法作用 |
---|---|
bind | 进行绑定操作后调用。 |
connect | 进行连接操作后调用。 |
disconnect | 进行断开连接操作后调用。 |
close | 进行关闭操作后调用。 |
deregister | 从当前已注册的EventLoop进行注销操作后调用。 |
read | 读数据 |
write | 写数据 |
flush | 刷新到管道 |
总结
通过本篇文章,我们可以了解到Netty中比较重要的几个概念,EventLoopGroup的基本概念、Netty中的通道概念、Netty中的管道流的概念!
相关文章:
Netty的基本架构详解
EventLoopGroup基本认识 我们需要了解的 EventLoopGroup, Netty对EventLoopGroup做了很多的扩展实现,下图是他的家族图谱: 我们上一节课使用的案例,使用的是NioEventLoopGroup,他是NIO的实现,可以看出来他是Multithre…...
2025前端面试题超全面解析(附答案与深度扩展)
文章目录 一、HTML篇(扩展版)1. **HTML5语义化标签的实际应用场景**2. **Web Components实战:如何封装一个自定义按钮组件?**3. **Web Worker的用途与限制** 二、CSS篇(扩展版)1. **CSS盒模型详解ÿ…...
自己搭建可以和deepseek对话的WEB应用
第一步 下载安装anaconda,地址:https://repo.anaconda.com/ 第二步 打开anaconda客户端,打开conda命令行窗口 第三步 创建一个open-webui专属的python专属的虚拟环境,并且指定python具体的版本 conda create --name open…...
Linux系统运行模式和链接
一、系统运行模式 centos6 0 关机模式 1 单用户模式 2 字符模式,无网络连接 3 字符模式 4 预留 5 图形模式 6 重启模式 查看系统当前处于的运行模式 切换为图形模式 init 5 centos7 字符模式 multi-user…...
.NET 9.0 的 Blazor Web App 项目,进度条 <progress> 组件使用注意事项
一、执行过程中,要刷新 进度条 的显示,需要 延时、释放,否则进度条不 实时 更新,最后一下到 100% // 延时,释放给前端:【必须】,否则进度条不 实时 更新,最后一下到 100await Task.D…...
头歌实验--面向对象程序设计
目录 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 第2关:公司支出计算 任务描述 答案代码 第3关:棱柱体问题 任务描述 答案代码 实验五 类的继承与派生 第1关:简易商品系统 任务描述 答案代码 #incl…...
IoTDB 断电后无法启动 DataNode,日志提示 Meet error while starting up
问题 IoTDB 1.3.2 版本,断电后 IoTDB 的 DataNode 无法启动,日志如下: 2024-12-16 14:45:41,350 [main] ERROR o.a.i.db.service.DataNode:562 - Meet error while starting up. org.apache.iotdb.commons.exception.StartupException: Fo…...
2024华为OD机试真题-最大报酬(C++)-E卷B卷-100分
2024华为OD机试最新题库-(C卷+D卷+E卷)-(JAVA、Python、C++) 目录 题目描述 输入描述 输出描述 示例一 解题思路 考点 代码 c++ 题目描述 小明每周上班都会拿到自己的工作清单,工作清单内包含n项工作, 每项工作都有对应的耗时时间(单位h)和报酬, 工作的总报酬为…...
jenkins war Windows安装
Windows安装Jenkins 需求1.下载jenkins.war2.编写快速运行脚本3.启动Jenkins4.Jenkins使用 需求 1.支持在Windows下便捷运行Jenkins; 2.支持自定义启动参数; 3.有快速运行的脚步样板。 1.下载jenkins.war Jenkins下载地址:https://get.j…...
HCIA项目实践--RIP相关原理知识面试问题总结回答
9.4 RIP 9.4.1 补充概念 什么是邻居? 邻居指的是在网络拓扑结构中与某一节点(如路由器)直接相连的其他节点。它们之间可以直接进行通信和数据交互,能互相交换路由信息等,以实现网络中的数据转发和路径选择等功能。&am…...
用大模型学大模型04-模型与网络
目前已经学完深度学习的数学基础,开始学习各种 模型和网络阶段,给出一个从简单到入门的,层层递进的学习路线。并给出学习每种模型需要的前置知识。增加注意力机制,bert, 大模型,gpt, transformer, MOE等流行…...
浏览器扩展实现网址自动替换
作为一个开发爱好者,不能顺畅访问github是很痛苦的,这种状况不知道何时能彻底解决。 目前也有很多方案可以对应这种囧况,我此前知道有一个网站kkgithub,基本上把github的静态内容都搬了过来,我们如果需要访问某个githu…...
适配器模式详解(Java)
一、引言 1.1 定义与类型 适配器模式是一种结构型设计模式,主要目的是将一个类的接口转换为客户期望的另一个接口。这种模式使得原本因为接口不匹配而不能一起工作的类可以一起工作,从而提高了类的复用性。适配器模式分为类适配器和对象适配器两种类型。类适配器使用继承关…...
C语言表驱动法
最近了解到一种C语言的写法,故记录下来,内容来自deepseek。 表驱动法 表驱动法(Table-Driven Approach)是一种编程技术,通过使用表格(数组、结构体数组、哈希表等)来存储数据或逻辑࿰…...
【鸿蒙Next】优秀鸿蒙博客集锦
鸿蒙基础开发:多文件压缩上传及断点续传_鸿蒙 断点续传-CSDN博客...
Django REST Framework:如何获取序列化后的ID
Django REST Framework:如何获取序列化后的ID 😄 嗨,小伙伴们!今天我们来聊一聊Django REST Framework(简称DRF)中一个非常常见的操作:如何获取序列化后的ID。对于那些刚入门的朋友们ÿ…...
deep seek
1.介绍:DeepSeek是一款由国内人工智能公司研发的大型语言模型,拥有强大的自然语言处理能力,能够理解并回答问题,还能辅助写代码、整理资料和解决复杂的数学问题。免费开源,媲美ChatGPT 最近最火爆的AI对话程序。 www.deepseek.com…...
前端设计模式介绍及案例(单例模式、代理模式、工厂模式、装饰者模式、观察者模式)
概要 本文主要介绍了前端设计模式的定义、分类以及常用设计模式的具体案例。 前言 使用设计模式的目的:为了代码可重用性、让代码更容易被他人理解、保证代码可靠性。 设计模式使代码编写真正工程化;设计模式是软件工程的基石脉络,如同大厦…...
开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1
文章目录 开源堡垒机 JumpServer 社区版实战教程:基于 Ubuntu 22.04 离线安装 JumpServer 社区版 v4.4.1一、环境要求1.1 操作系统1.1.1 Ubuntu1.1.2 CentOS 1.2 数据库1.2.1 JumpServer 需要使用的数据库1.2.2 创建数据库 SQL 参考1.2.2.1 PostgreSQL1.2.2.2 MySQL…...
电源测试和测量系统的创新遥感方法可以消除哪些潜在问题
传统的遥感方法 远程感测是一种行之有效的方法,通过消除连接电缆中压降的影响来调节负载点的直流功率。这在测试和测量应用中尤其重要,在这些应用中,电源电压在一系列负载条件下的准确性和一致性通常对于获得准确且可重复的测试结果至关重要…...
10、《Thymeleaf模板引擎:动态页面开发全攻略》
Thymeleaf模板引擎:动态页面开发全攻略 一、Thymeleaf核心价值解析 天然HTML亲和力:Thymeleaf允许直接使用.html文件作为模板,支持浏览器直接预览静态原型,同时通过属性标签(如th:text)实现动态渲染&…...
Day1 25/2/14 FRI
【一周刷爆LeetCode,算法大神左神(左程云)耗时100天打造算法与数据结构基础到高级全家桶教程,直击BTAJ等一线大厂必问算法面试题真题详解(马士兵)】https://www.bilibili.com/video/BV13g41157hK?p3&v…...
untiy3D 让角色动起来,角色动画的使用
1.untiy 商店下载动画模型 2.导入项目 模型拖入到场景中 3.创建动画器控制器 4.动画控制器挂载到plarer上 5.把动画idle和pickup拖入到动画器 6.右键动画创建过渡效果(Make Transition) 6.设置参数用条件控制 7.当选中参数时启动过渡 运行效果 119 (二)用脚本控制动画…...
Word 里面嵌入DeepSeek
目录 一、问题描述 二、解决方法 三、代码 四、注意事项 五、总结 一、问题描述 如何在Word里面嵌入DeepSeek? 二、解决方法 1、新建文档,按 AltF11,进入VB界面。 2、选中文档,右键->插入->模块。 3、进入模块,粘入…...
深入浅出Java反射:掌握动态编程的艺术
小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中,学习…...
exr 格式下 全景图(经纬图、panorama)转 cubemap
先上效果 (X, -X, Y, -Y, Z, -Z) 下载 exr 经纬图 笔者用的这张:https://polyhaven.com/a/kloofendal_48d_partly_cloudy_puresky 使用 Openexr 的 exrenvmap 工具 下载 我 build 了一份 3.3.2 版本的,免积分下载。 https:/…...
解锁建造者模式:Java 编程中的对象构建秘籍
系列文章目录 后续补充~~~~ 文章目录 一、引言二、建造者模式原理剖析2.1 定义与概念2.2 模式结构与角色2.2.1 产品(Product)2.2.2 建造者(Builder)2.2.3 具体建造者(ConcreteBuilder)2.2.4 指挥者(Director)2.3 工作流程与交互机制三、建造者模式在 Java 中的优势3.1 …...
ArcGIS Pro显示缓存空间不足导致编辑或加载数据显示不完全
ArcGIS Pro对于显示缓存有32GB的限制,所以当缓存设置中,缓存将达到32GB时,会出现编辑、加载slpk显示不全的情况。 清除计算机上的显示缓存方法 1.启动 ArcGlS Pro。单击左下角的设置,然后单击选项; 2.在选项窗口中&…...
大数据、云计算、人工智能等技术深度融合的智慧快消开源了。
智慧快消视频监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒,省去繁琐重复的适配流程,实现芯片、算法、应用的全流程组合,从而大大减少企业级应用约95%的开发成本。 基于多年的深度…...
C++17 中的 std::reduce:详细教程
文章目录 1. 简介2. 函数签名3. 使用场景3.1 简单的累加操作3.2 自定义归并操作3.3 并行计算的性能优势 4. 注意事项4.1 归并操作的结合律和交换律4.2 默认值的使用 5. 总结 1. 简介 std::reduce 是 C17 标准库中引入的一个算法,用于对范围内的元素进行归并操作。它…...
Python爬虫实战:获取笔趣阁图书信息,并做数据分析
注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 环境准备与反爬策略 python import requests from bs4 import BeautifulSoup import pandas as pd import re import time import random from fake_useragent …...
win11系统 Docker Desktop提示Docker Engine stopped解决全过程记录
DockerDesktop安装指南以及Windows下WSL2和 Hyper-V相关问题追查 【已解决】win10系统 Docker 提示Docker Engine stopped解决全过程记录 本篇文章主要记录Docker Desktop安装和使用时出现的问题及解决方法,以及后续使用夜神模拟器,关闭了Hyper-V时&am…...
c# sqlite 批量生成insert语句的函数
函数开始 using System; using System.Collections.Generic; using System.Text;public class SqliteHelper {public static List<string> GenerateInsertStatements(string tableName, List<string> columns, List<List<object>> data){List<stri…...
ASP.NET Core SixLabors.ImageSharp v3.x 的图像实用程序类
使用用 C# 编写的 asp.net core web 应用程序示例在 Windows 和 Linux web 服务器上处理图像,包括创建散点图和直方图,以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包(版本 3.1.x)添…...
湖仓分析|浙江霖梓基于 Doris + Paimon 打造实时/离线一体化湖仓架构
导读:浙江霖梓早期使用 CDH 产品套件搭建了大数据系统,面临业务逻辑冗余、查询效率低下等问题,基于 Apache Doris 进行整体架构与表结构的重构,并基于湖仓一体和查询加速展开深度探索与实践,打造了 Doris Paimon 的实…...
【AI-34】机器学习常用七大算法
以下是对这七大常用算法的浅显易懂解释: 1. k 邻近算法(k - Nearest Neighbors,KNN) 想象你在一个满是水果的大广场上,现在有个不认识的水果,想知道它是什么。k 邻近算法就是去看离这个水果最近的 k 个已…...
2025年金三银四经典自动化测试面试题
概述 觉得自动化测试很难? 是的,它确实不简单。但是学会它,工资高啊! 担心面试的时候被问到自动化测试? 嗯,你担心的没错!确实会被经常问到! 现在应聘软件测试工程师的岗位&…...
遵循规则:利用大语言模型进行视频异常检测的推理
文章目录 速览摘要01 引言02 相关工作视频异常检测大语言模型 03 归纳3.1 视觉感知3.2 规则生成Normal and Anomaly (正常与异常)Abstract and Concrete (抽象与具体)Human and Environment (人类与环境) 3…...
RFM模型-数据清洗
在进行数据清洗时,主要的目标是确保数据质量良好,以便后续的分析和建模工作能够顺利进行。针对你使用粒子群优化算法改进RFM模型来对电商数据进行用户群像划分的实验,数据清洗环节尤其重要,因为不干净的数据会影响模型的精度和效果…...
文件系统惹(细)
目录 块概念 分区 inode ext2文件系统 Boot Sector Super Block GDP(group descriptor table) Block Bitmap(块位图) Inode Bitmap (inode位图) Data Block inode和Datablock映射 目录和文件名 …...
中望CAD c#二次开发 ——VS环境配置
新建类库项目:下一步 下一步 下一步: 或直接: 改为: <Project Sdk"Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>NET48</TargetFramework> <LangVersion>pr…...
Centos7安装Clickhouse单节点部署
部署流程 1、关闭防火墙&沙盒 关闭防火墙并关闭开机自启动 systemctl stop firewalld && systemctl disable firewalld查看selinux状态是否为disabled,否则修改 [rootlocalhost ~]# getenforce Enforcing修改为disabled vim /etc/selinux/config…...
4.SpringSecurity在分布式环境下的使用
参考 来源于黑马程序员: 手把手教你精通新版SpringSecurity 分布式认证概念说明 分布式认证,即我们常说的单点登录,简称SSO,指的是在多应用系统的项目中,用户只需要登录一次,就可以访 问所有互相信任的应…...
使用 Notepad++ 编辑显示 MarkDown
Notepad 是一款免费的开源文本编辑器,专为 Windows 用户设计。它是替代记事本(Notepad)的最佳选择之一,因为它功能强大且轻量级。Notepad 支持多种编程语言和文件格式,并可以通过插件扩展其功能。 Notepad 是一款功能…...
Spring 框架数据库操作常见问题深度剖析与解决方案
Spring 框架数据库操作常见问题深度剖析与解决方案 在 Java 开发的广阔天地中,Spring 框架无疑是开发者们的得力助手,尤其在数据库操作方面,它提供了丰富且强大的功能。然而,就像任何技术一样,在实际项目开发过程中&a…...
第一天:爬虫介绍
每天上午9点左右更新一到两篇文章到专栏《Python爬虫训练营》中,对于爬虫有兴趣的伙伴可以订阅专栏一起学习,完全免费。 键盘为桨,代码作帆。这趟为期30天左右的Python爬虫特训即将启航,每日解锁新海域:从Requests库的…...
ECP在Successfactors中paylisp越南语乱码问题
导读 pyalisp:ECP中显示工资单有两种方式,一种是PE51,一种是hrform,PE51就是划线的那种, 海外使用的比较多,国内基本没人使用,hrform就是pdf,可以编辑pdf,这个国内相对使用的人 比…...
Express 中间件分类
一、 按功能用途分类 1. 应用级中间件 这类中间件应用于整个 Express 应用程序,会对每个进入应用的请求进行处理。通过 app.use() 方法挂载,可用于执行一些全局性的任务,像日志记录、请求预处理、设置响应头这类操作。 const express req…...
基于Multi-Runtime的云原生多态微服务:解耦基础设施与业务逻辑的革命性实践
引言:当微服务遭遇复杂性爆炸 在分布式系统复杂度指数级增长的今天,一线开发者平均需要处理27种不同的基础设施组件配置。CNCF最新研究报告指出,采用Multi-Runtime架构可减少83%的非功能性代码编写量,同时使分布式原语࿰…...
flutter isolate到底是啥
在 Flutter 中,Isolate 是一种实现多线程编程的机制,下面从概念、工作原理、使用场景、使用示例几个方面详细介绍: 概念 在 Dart 语言(Flutter 开发使用的编程语言)里,每个 Dart 程序至少运行在一个 Isol…...