Netty的常用组件及线程模型设计(一)

Netty常用组件

Bootstrap

Bootstrap是Netty框架的启动类和主入口类,发呢为客户端类Bootstrap和服务器类ServerBootstrap两种

Channel

  • Channel是JavaNIO的一个基本构造,它代表一个到实体(如一个硬件设备、一个文件、一个网络套接字或者一个能够执行一个或者多个不同的IO操作的程序组件)的开发连接,如读操作和写操作
  • 目前,可以把Channel看作是传入(入站)或者传出(出站)数据的载体。因此,它可以被打开或者被关闭,连接或者断开连接

EventLoop/EventLoopGroup(重点理解)

  • EventLoop可以看成一个线程,EventLoopGroup自然就可以看成线程组
    在NIO中一个while循环select出事件,然后依次处理每种事件,我们可以把它称为事件循环,
    这就是EventLoop,它定义了Netty的核心抽象,用于处理网络连接的声明周期中所发生的事件。
    io.netty.util.concurrent包构建在JDK的java.util.concurrent包上。而io.netty.channel包中的类,
    为了与Channel的事件进行交互,扩展了这些接口/类,一个EventLoop将由一个永远都不会改变的Thread驱动,同时任务(Runnable/Callable)可以直接交给EventLoop实现,以立即执行或者调度执行

  • EventLoop继承关系图
    在这里插入图片描述

  • 线程的分配.
    服务于Channel的I/O和事件的EventLoop包含在EventLoopGroup中,异步传输实现只使用了少量的EventLoop(以及和它们相关联的Thread),而且在当前的线程模型中,它们可能会被多个Channel所共享,这使得可以通过尽可能少的Thread来支撑大量的Channel,而不是每个Channel分配一个Thread.EventLoopGroup负责为每个新创建的Channel分配一个EventLoop.在当前实现中,使用顺序循环(round-robin)的方式进行分配以获取一个均衡的分布,并且相同的EventLoop可能会被分配给多个Channel.一旦一个Channel被分配给一个EventLoop,它将在它的整个声明周期中都使用这个EventLoop(以及相关联的Thread).需要注意:EventLoop的分配方式对ThreadLocal的使用的影响。因为一个EventLoop通常会被用于支撑多个Channel,所以读与所有相关联的Channel来说,ThreadLocal都将是一样的。这使得它对于实现状态追踪等功能来说是个糟糕的选择。然而,在一些无状态的上下文中,它仍然可以被用于在多个Channel之间共享一些重度的或者代价昂贵的对象,甚至是事件
    在这里插入图片描述

  • 线程管理。
    在内部,当提交任务到如果(当前)调用线程正是支撑EventLoop的线程,那么所提交的代码块将会被(直接)执行,否则,EventLoop将调度该任务以便稍后执行,并将它放入到内部队列中。当EventLoop下次处理它的事件时,它会执行队列中的那些任务/事件
    在这里插入图片描述

  • 为什么要设计成一个Channel中的事件处理只能交给一个EventLoop?
    在以前的版本中所使用的线程模型只保证了入站(之前称为上游)事件会在所谓的IO线程(对应Netty4中的EventLoop)中执行。所有的出站(下游)事件都由调用线程处理,其可能是I/O线程也可能是别的线程。开始看起来这似乎是个好主意,但是已经被发现是有问题的,因为需要在ChannelHandler中对出站事件进行仔细的同步。简而言之,不可能保证多个线程在同一时刻尝试访问出站事件。例如你通过在不同的线程中调用Channel.write()方法,针对同一个Channel同时触发出站的事件,就会发生这种情况。当出站事件触发了入站事件时,将会导致另一个负面影响。当Channel.write()方法导致异常时,需要在调用线程中执行代码,然后将事件移交给I/O线程去执行(在出站事件中,因为出站的数据是要发往对端的,所以当异常触发时要把它当作入站,交由发送端来处理)然而这将带来额外的上下文切换。
    Netty4中所采用的线程模型,通过在同一个线程中处理某个给定的EventLoop中所产生的所有事件,解决了这个问题,这提供了一个更加简单的执行体系架构,并且消除了在多个ChannelHandler中进行同步的需要,也解决了线程安全和同步的问题

事件

  • Netty使用不同的事件来通知我们状态的改变或者是操作的状态。这使得我们能够基于已经发生的事件来触发适当的动作
  • Netty事件是按照它们与入站或出站数据流的相关性进行分类的。可能由入站数据或者相关的状态更改而触发的事件包括:连接已被激活或者连接失活;数据读取;用户事件;错误事件;
  • 出站事件是未来将会触发的某个动作的操作结果,这些动作包括:打开或者关闭到远程节点的连接;将数据写到或者冲刷到套接字

ChannelHandler

  • 每个事件都可以被分发给ChannelHandler类中的某个用户实现的方法,既然事件分为入站和出站,用来处理事件的ChannelHandler也被分为,可以处理入站事件的Handler和出站事件的Handler,当然有些Handler,既可以处理入站也可以处理出站
  • Netty提供提供了大量预定义的可以开箱即用的ChannelHandler实现,包括用于各种协议(如HTTP和SSL/TLS)的ChannelHandler
  • ChannelInboundHandler入站处理,它是一个接口,其中使用最多的是SimpleChannelInboundHandler,因为它会帮我们自动释放Bytebuf,如果需要手动释放也可以实现其他入站处理器,如ChannelInboundHandlerAdapter。ChannelOutboundHandler类型的对应ChannelOutboundHandlerAdapter

ChannelPipeline

  • 基于Netty的网路应用程序中根据业务需求会使用Netty已经提供的Channelhandler
    或者自行开发ChannelHandler,这些ChannelHandler都放在ChannelPipeline中统一
    管理,事件就会在ChannelPipeline中流动,并被其中一个或者多个ChannelHandler处理
    在这里插入图片描述

ChannelFuture

  • Netty中所有的IO操作都是异步的,我们知道"异步的意思就是不需要主动等待结果的返回,
    而是通过其他手段比如,状态通知,回调函数等",也就是说至少我们需要一种获得异步执行
    结果的手段
  • JDK预置了java.util.concurrent.Future,Future提供了一种在操作完成时通知应用程序的方式,
    这个对象可以看作是一个异步操作的结果的占位符;它将在未来的某个时刻完成,并提供对其
    结果的访问。但是其所提供的实现,只允许手动检查对应的操作是否已经完成,或者一直阻塞
    直到它完成。这是非常繁琐的,所以Netty提供了它自己的实现ChannelFture,用于在执行异步
    操作的时候使用,一般来说,每个Netty的出站I/O操作都将返回一个ChannelFuture。
    我们还可以添加ChannelFutureListener,针对某个异步操作添加通知回调
    在这里插入图片描述
  • JDK原生Future提供的方法
    在这里插入图片描述

优势

  • 1.API使用简单,开发门槛低
  • 2.功能强大,预置了多种编解码功能,支持多种主流协议
  • 3.定制能力强,可以通过ChannelHandler对通信框架进行灵活地扩展
  • 4.性能高,通过与其他业界主流地NIO框架对比,Netty的综合性能最优
  • 5.成熟、稳定,Netty修复了已经发现的所有JDK NIO BUG,业务人员不需要再为NIO的bug而烦恼
  • 6.社区活跃,版本迭代周期短,发现的bug可以被及时修复,同事,更多的新功能会加入
  • 7.经历了大规模的商业应用考研,直到得到验证

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何恢复已删除的数据?3个方法,轻松恢复文件!

“我在删除了一些数据后,突然意识到这些数据是很重要的,有什么方法可以帮我恢复这些已删除的数据吗?希望大家给我出出主意!” 在日常使用电脑的过程中,用户可能会因为各种原因误删重要的数据,这有时会对我们…

python实现k路归并排序

从归并排序中可以衍生出来一个新的问题,关于k路归并排序,给定k个已经排好序的数组,每个数组含有n各元素,要求将这k个数组合并成一个排好序的大数组。在对两路排好序的数组进行归并时候,会用两个指针指向两个数组首元素…

[超分辨率重建]ESRGAN算法训练自己的数据集过程

一、下载数据集及项目包 1. 数据集 1.1 文件夹框架的介绍,如下图所示:主要有train和val,分别有高清(HR)和低清(LR)的图像。 1.2 原图先通过分割尺寸的脚本先将数据集图片处理成两个相同的图像…

NLP_Seq2Seq编码器-解码器架构

文章目录 Seq2Seq架构构建简单Seq2Seq架构1.构建实验语料库和词汇表2.生成Seq2Seq训练数据3. 定义编码器和解码器类4.定义Seq2Seq架构5. 训练Seq2Seq架构6.测试Seq2Seq架构 归纳Seq2Seq编码器-解码器架构小结 Seq2Seq架构 起初,人们尝试使用一个独立的RNN来解决这种…

数据结构——算法的时间复杂度和空间复杂度

1、算法效率 1.1如何衡量一个算法的好坏&#xff1f; 比如我们最熟悉的斐波那契数列 long long Fib(int N) {if(N < 3)return 1;return Fib(N-1) Fib(N-2); } 上面的斐波那契数列使用递归实现&#xff0c;看起来非常的简洁&#xff0c;那么代码一定是越简洁越好么&…

仰暮计划|“​爷爷说这些话的时候眼睛都红着,他那变形的脊柱和瘸拐的双腿都证明他曾为这个家付出了血汗拼尽了全力”

赴一场拾光之旅&#xff0c;集往年回忆碎片 爷爷生于1952年&#xff0c;今年已有七十一了&#xff0c;是河南焦作沁阳北金村的一位地道农民&#xff0c;劳苦一生&#xff0c;如今终于得以颐养天年。许是早年经历过于难忘&#xff0c;爷爷如今与我讲起仍是记忆犹新&#xff0c;…

kafka客户端生产者消费者kafka可视化工具(可生产和消费消息)

点击下载《kafka客户端生产者消费者kafka可视化工具&#xff08;可生产和消费消息&#xff09;》 1. 前言 因在工作中经常有用到kafka做消息的收发&#xff0c;每次调试过程中&#xff0c;经常需要查看接收的消息内容以及人为发送消息&#xff0c;从网上搜寻了一下&#xff0…

航道大数据应用专项研究报告(附下载)

总体目标 充分认识航道大数据对行业治理的重要性和必要性&#xff0c;航道大数据的开发和利用是建设智慧航道的基础。基于大数据的航道管理体系&#xff0c;实现了现有数据的梳理和汇聚&#xff0c;跨部门数据的交换和整合&#xff0c;建立了数据关联和深度学习的模型机制&…

【win】vscode无法使用ctrl+shift+p快捷键的解决方案

本文首发于 ❄️慕雪的寒舍 今天使用vscode的时候遇到的这个问题&#xff0c;明明快捷键设置的是ctrlshiftp&#xff0c;但是在电脑上怎么敲都敲不出来&#xff0c;因为用这个快捷键打开命令面板都习惯了&#xff0c;也不想换&#xff0c;就在找原因。 同时百度的时候还遇到了…

C++ 搜索二叉树的删除

首先查找元素是否在二叉搜索树中&#xff0c;如果不存在&#xff0c;则返回 要删除的结点可能分下面四种情况&#xff1a; a. 要删除的结点无孩子结点 b. 要删除的结点只有左孩子结点 c. 要删除的结点只有右孩子结点 d. 要删除的结点有左、右孩子结点 看起来有待删除节点有4中…

宠物空气净化器哪个牌子好?养猫家庭如何挑选宠物空气净化器?

养猫的朋友都知道&#xff0c;猫咪掉毛是一个令人头痛的问题。猫毛和皮屑会漂浮在空气中&#xff0c;不仅遍布全屋的各个角落&#xff0c;而且清理起来也非常麻烦&#xff0c;特别是那些难以清除的猫毛。更糟糕的是&#xff0c;这些猫毛还可能引发人们的过敏反应&#xff0c;如…

Excel——分类汇总

1.一级分类汇总 Q&#xff1a;请根据各销售地区统计销售额总数。 第一步&#xff1a;排序&#xff0c;我们需要根据销售地区汇总数据&#xff0c;我们就要对【销售地区】的内容进行排序。点击【销售地区】列中任意一个单元格&#xff0c;选择【数据】——【排序】&#xff0c…

parse库,一个优雅的python库

前言 在Python中&#xff0c;format方法和f-strings是两种常用的字符串插值方法。 name "Haige" age "18" print(f"{name} is {age} years old.")# Haige is 18 years old.而如果是要从字符串中提取期望的值呢&#xff1f;相信很多人的第一或…

代码随想录 Leetcode46. 全排列

题目&#xff1a; 代码&#xff08;首刷自解 2024年2月6日&#xff09;&#xff1a; class Solution { private:vector<vector<int>> res;vector<int> path; public:void backtracking(vector<int>& nums, int depth, vector<bool>& us…

CTF-PWN-堆-【chunk extend/overlapping-2】(hack.lu ctf 2015 bookstore)

文章目录 hack.lu ctf 2015 bookstore检查IDA源码main函数edit_notedelete_notesubmit .fini_array段劫持(回到main函数的方法) 思路格式化字符串是啥呢0x开头或者没有0x开头的十六进制的字符串或字节的转换为整数构造格式化字符串的其他方法 exp 佛系getshell 常规getshell ha…

【maven相关问题】Could not transfer artifact ...与Transfer failed for ...报错及解决办法

一、问题描述 拉取一个新项目后&#xff0c;maven解析下载文件时出现如下报错信息&#xff1a; 二、错误原因分析 提示信息是传输失败&#xff0c;无法传输的原因应该是出现错误的包文件夹已经缓存在本地存储库中&#xff0c;然后maven在经过发布的更新间隔或强制进行更新之前…

深入了解Spring Expression Language(SpEL)

深入了解Spring Expression Language&#xff08;SpEL&#xff09; Spring Expression Language&#xff08;SpEL&#xff09;是Spring框架中强大的表达式语言&#xff0c;它在运行时提供了一种灵活的方式来评估字符串表达式。SpEL的设计目标是在各种Spring配置和编程场景中提供…

Go语言每日一练链表篇(二)

传送门 牛客面试笔试必刷101题 ---------------- 链表内指定区间反转 题目以及解析 题目 解题代码及解析 package main import _"fmt" import . "nc_tools" /** type ListNode struct{* Val int* Next *ListNode* }*//*** 代码中的类名、方法名、参…

PyTorch 2.2 中文官方教程(七)

使用 torchtext 库进行文本分类 原文&#xff1a;pytorch.org/tutorials/beginner/text_sentiment_ngrams_tutorial.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 注意 点击这里下载完整示例代码 在本教程中&#xff0c;我们将展示如何使用 torchtext 库构建文…

识别CMS指纹与WAF识别

目录 识别CMS指纹 1 什么是CMS指纹&#xff1f; 2 常见的CMS指纹 3 识别CMS指纹的方法有哪些&#xff1f; &#xff08;1&#xff09;分析HTTP响应头&#xff0c;识别CMS的特定标头。 &#xff08;2&#xff09;通过配置文件/特殊文件 &#xff08;3&#xff09;分析网站…