Netty 必知必会(五)—— 核心组件

news2024/9/23 19:17:49
  • 简单说下 Netty 中的重要组件?NIO中Channel的作用?

一、NIO 中三大核心组件

  • Buffer(缓冲区)。在NIO厍中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的; 在写入数据时,写入到缓冲区中。任何时候访问NIO中的数据,都是通过缓冲区进行操作。
  • Channel(通道)。NIO 通过Channel(通道) 进行读写。通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。
  • Selector(选择器)。NIO的选择器用于使用单个线程管理多个通道。只有在通道里真正有读写事件发生时(事件驱动),才会交给线程读写(Selector会一直询问每个通道有没有读写事件,这个过程是同步的),因此,它只需要较少的线程来处理这些通道。不必为每一个连接都创建一个线程,也不必去维护多个线程。避免了多个线程之间的上下文切换,导致资源的浪费。(只有网络IO才会使用选择器,文件IO是不需要使用的)

二、Netty 中核心组件

1.Channel

可以理解为是socket连接,在客户端与服务端连接的时候就会建⽴⼀个Channel,它负责基本的IO操作,⽐如:bind()、connect(),read(),write() 等。

2.EventLoop、EventLoopGroup

有了 Channel 连接服务,连接之间可以消息流动。如果服务器发出的消息称作“出站”消息,服务器接受的消息称作“⼊站”消息。那么消息的“出站/⼊站”就会产⽣事件(Event)。例如:连接已激活;数据读取;⽤户事件;异常事件;打开链接;关闭链接等等。

有了事件,就需要⼀个机制(EventLoop)监控和协调事件

  • 在 Netty 中每个 Channel 都会被分配到⼀个 EventLoop。
  • ⼀个 EventLoop 可以服务于多个 Channel。
  • 每个 EventLoop 会占⽤⼀个 Thread,同时这个 Thread 会处理 EventLoop 上⾯发⽣的所有 IO 操作和事件。

EventLoop主要是配合 Channel,处理Channel的生命周期中所发生的事件。

EventLoopGroup 是⽤来⽣成和管理 EventLoop 的。

  • ⼀个 EventLoopGroup 包含⼀个或者多个 EventLoop。

进阶:

一个 NioEventLoop 维护了一个 Selector (使用的是 Java 原生的 Selector )。
一个 NioEventLoop 相当于一个线程。

3.ChannelHandler

对于数据的⼊站和出站的业务逻辑的编写都是在ChannelHandler中完成的。

ChannelInboundHandler ⼊站事件处理器
ChannelOutBoundHandler 出站事件处理器

ChannelHandlerAdapter提供了⼀些⽅法的默认实现,可减少⽤户对于ChannelHandler的编写。

ChannelInboundHandlerAdapter 与 SimpleChannelInboundHandler的区别:

  • 在服务端编写ChannelHandler时继承的是ChannelInboundHandlerAdapter
  • 在客户端编写ChannelHandler时继承的是SimpleChannelInboundHandler

两者的区别在于,前者不会释放消息数据的引⽤,⽽后者会释放消息数据的引⽤。

4.ChannelPipeline

⼀个Channel对应着多个ChannelHandler,多个ChannelHandler如何去管理它们,它们的执⾏顺序⼜该是怎么样的,这就需要ChannelPipeline进⾏管理了。

  • ⼀个Channel包含了⼀个ChannelPipeline。
  • ⽽ChannelPipeline中维护了⼀个ChannelHandlerContext 的双向链表。
  • 一个 ChannelHandlerContext 中包含一个 ChannelHandler。

5.Bootstrap

将 Netty 各个组件都串起来,最后绑定端⼝、启动Netty服务。

客户端(Bootstrap) 与 服务器(ServerBootstrap) 的区别:

  • ServerBootstrap 将绑定到⼀个端⼝,因为服务器必须要监听连接,⽽ Bootstrap 则是由想要连接到远程节点的客户端应⽤程序所使⽤的
  • 引导⼀个客户端只需要⼀个EventLoopGroup,但是⼀个ServerBootstrap则需要两个。原因如下:
  1. 因为服务器需要两组不同的 Channel。第⼀组将只包含⼀个 ServerChannel,代表服务器⾃身的已绑定到某个本地端⼝的正在监听的Socket。第⼆组将包含所有已创建的⽤来处理传⼊客户端连接。
  2. 与ServerChannel相关联的EventLoopGroup 将分配⼀个负责为传⼊连接请求创建 Channel 的 EventLoop。⼀旦连接被接受,第⼆个 EventLoopGroup 就会给它的 Channel 分配⼀个 EventLoop。

6.ChannelFuture

这个对象可以看作是⼀个异步操作的结果的占位符,它将在未来的某个时刻完成,并提供对其结果的访问。

每个 Netty 的出站 I/O 操作都将返回⼀个 ChannelFuture,也就是说,它们都不会阻塞。 

Netty 框架中所有的 I/O 操作都为异步的,因此我们需要 ChannelFuture 的 addListener()注册一个 ChannelFutureListener 监听事件,当操作执行成功或者失败时,监听就会自动触发返回结果

三、参考

Netty核心组件详解-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1971851.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AC+AP组网

配置DHCP Switch1 <Huawei>sys [Huawei]undo in en [Huawei]vlan batch 10 20 30 40[Huawei]int vlan 10 [Huawei-Vlanif10]ip add 192.168.10.1 24 [Huawei-Vlanif10]quit[Huawei]int vlan 20 [Huawei-Vlanif20]ip add 192.168.20.1 24 [Huawei-Vlanif20]quit[Huawei]…

【JavaScript】函数的动态传参

Javacript&#xff08;简称“JS”&#xff09;是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编程语言。虽然它是作为开发Web页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c;JavaScript基于原型编程、多范式的动态脚本语言&…

运放学习提纲

目的&#xff1a;给初入硬件的朋友一个系统性学习运放的参考方向&#xff0c;避免像无头苍蝇那般 一&#xff1a;偏置电流 1.1. 为什么是输入偏置电流&#xff1f; 1.2. 什么是输入偏置电流&#xff1f; 1.3. 怎么搜索资料&#xff1f;怎么把 ADI 模型导 入Multisim &#…

C++自定义接口类设计器之可对称赋值三

关键代码 QStringList newLines;for (const auto& line : lines) {auto equalIndex line.indexOf("");if(-1 ! equalIndex) {// a b; 赋值auto var line.mid(0, equalIndex).trimmed();auto value line.mid(equalIndex 1).trimmed();if(value.endsWith(&quo…

django小型超市库存与销售管理系统-计算机毕业设计源码46608

摘 要 随着信息技术的快速发展&#xff0c;超市库存与销售管理面临着前所未有的挑战与机遇。为了提升超市的运营效率&#xff0c;优化库存管理&#xff0c;并增强销售数据的分析能力&#xff0c;我们基于Django框架设计并开发了一套小型超市库存与销售管理系统。该系统充分利用…

使用开源RustDesk部署远程控制服务

使用开源RustDesk部署远程控制服务 文档编写时间&#xff1a;2024/8/1 一、部署环境 操作系统&#xff1a;Ubuntu 2204 LTS IP地址&#xff1a;192.168.108.115 开源软件项目地址&#xff1a;rustdesk/rustdesk-server: RustDesk Server Program (github.com) 参考文档&a…

DB管理客户端navicat和dbever数据库连接信息迁移

DB管理客户端navicat和dbever数据库连接信息迁移 第三方数据库连接工具为了确保数据库信息安全通常对保存的数据库连接密码进行加密&#xff0c;填入后想再拿到原文就不可能了&#xff0c;有时交接给别人或者换电脑时可以通过连接数据导出的方式来解决。 navicat连接信息导出…

Visual Studio 2022社区版、专业版、企业版功能对比表

https://visualstudio.microsoft.com/zh-hans/vs/compare/

C++(区别于C的)基础内容总结

参考&#xff1a; C 教程 | 菜鸟教程 (runoob.com) 简介 C 被认为是一种中级语言&#xff0c;它综合了高级语言和低级语言的特点。 C 是由 Bjarne Stroustrup 于 1979 年在新泽西州美利山贝尔实验室开始设计开发的。C 进一步扩充和完善了 C 语言&#xff0c;最初命名为带类的C&…

MySQL:主从复制、读写分离万字详解

目录 案例概述 案例前置知识点 MySQL主从复制原理 MySQL复制类型 MySQL主从复制的过程 I/O线程怎么知道有新数据增加的&#xff1f; 主从复制的缺点 解决的方法 案例步骤 主从复制 初步设置 MySQL数据库 防火墙 时间设置 ntp服务 虚拟机设置时间同步 开启二进…

【一对一模型讲解】SABO-Transformer-LSTM多变量回归预测(减法平均算法)

【一对一模型讲解】SABO-Transformer-LSTM多变量回归预测&#xff08;减法平均算法&#xff09; 目录 【一对一模型讲解】SABO-Transformer-LSTM多变量回归预测&#xff08;减法平均算法&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现SABO-Tra…

ECMAScript 2024 新特性,示例参考

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

【云服务器】什么是ECS?云服务器科普

&#x1f44f;大家好&#xff01;我是和风coding&#xff0c;希望我的文章能给你带来帮助&#xff01; &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;点击 我的主页 还可以看到和风的其他内容噢&#x…

R 语言学习教程,从入门到精通,R的安装与环境的配置(2)

1、R的安装与环境的配置 R语言是一款完全免费且开源的软件&#xff0c;它的开源许可证是GNU通用公共许可证&#xff08;GPL&#xff09;&#xff0c;这意味着任何人都可以自由地使用、复制、修改和发布R语言的源代码&#xff0c;甚至可以将其用于商业用途。 和python等其他语言…

【C语言】程序环境,预处理,编译,汇编,链接详细介绍,其中预处理阶段重点讲解

目录 程序环境 翻译环境 1. 翻译环境的两个过程 2. 编译过程的三个阶段 执行环境 预处理(预编译) 1. 预定义符号 2. #define 2.1 用 #define 定义标识符(符号) 2.2 用 #define 定义宏 2.3 #define 的替换规则 2.4 # 和 ## 的用法 2.5 宏和函数 2.6 #undef …

【学习笔记】决策单调性优化DP

背景 GDCPC还在发力&#xff0c;清华出题组出的牛客还是 4 题。 这次没有min25筛&#xff0c;不然我能5题&#xff08;bushi 除了一道用 prufer 序列的恶心 DP 外&#xff0c;还有一道DP题是一个状态难想&#xff0c;并且还需要决策单调性优化的DP&#xff0c;被认为是偏简单…

CTFHub XSS DOM 跳转

查看网页源代码 <script>var target location.search.split("")if (target[0].slice(1) "jumpto") {location.href target[1];} </script>注意&#xff01;当你将类似于 location.href "javascript:alert(xss)" 这样的代码赋值…

利用Qt实现调用文字大模型的API,文心一言、通义千问、豆包、GPT、Gemini、Claude。

利用Qt实现调用文字大模型的API&#xff0c;文心一言、通义千问、豆包、GPT、Gemini、Claude。 下载地址: AI.xyz 1 Qt实现语言大模型API调用 视频——Qt实现语言大模型API调用 嘿&#xff0c;大家好&#xff01;分享一个最近做的小项目 “AI.xyz” 基于Qt实现调用各家大模型…

Type-C PD芯片:边充电与数据传输同时进行LDR

在日新月异的科技浪潮中&#xff0c;电子产品不仅成为了我们日常生活不可或缺的一部分&#xff0c;更是推动着社会进步与变革的重要力量。随着智能设备的普及与多样化&#xff0c;一个能够高效融合充电与数据传输功能&#xff0c;同时保持广泛兼容性和安全性的接口标准显得尤为…

实战Transformers模型量化Facebook OPT

基于上篇文章的理论知识&#xff0c;本文主要讲述了实战Transformers模型量化&#xff1a;介绍Facebook OPT模型的量化过程和相关技术。 Transformers 模型量化技术&#xff1a;GPTQ Frantar等人发表了论文 GPTQ&#xff1a;Accurate Post-Training Quantization for Generat…