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

news2024/9/25 1:24:25

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.经历了大规模的商业应用考研,直到得到验证

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

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

相关文章

电缆线的阻抗50Ω,真正含义是什么?

当我们提到电缆线的阻抗时,它到底是什么意思?RG58电缆通常指的是50Ω的电缆线。它的真正含义是什么?假如取一段3英尺(0.9144米)长的RG58电缆线,并且在前端测量信号路径与返回路径之间的阻抗。那么测得的阻抗是多少?当然…

探索C语言中的联合体与枚举:数据多面手的完美组合!

​ ✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:C语言学习 贝蒂的主页:Betty‘s blog 1. 联合体的定义 联合体又叫共用体,它是一种特殊的数据类型&…

Flomesh 发布 Pipy 0.99.1

值此新春佳节来临之际 ,我们很高兴地宣布 Pipy 0.99.1 版本 的发布,此次更新带来了多项重要特性和改进,进一步增强了 Pipy 的功能性和灵活性。 新特性与改进: 增加了对 BPF (Berkeley Packet Filter) 的支持,包括加载…

Webstorm安装了vue脚手架后终端输入vue报错解决方法

当我们初学Vue的时候,刚安装完Vue脚手架之后,输入vue报错,是因为webstorm终端受限制了。 vue: 无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\vue.ps1,因为在此系统上禁止运行脚本。 解决方案如下: 通过…

51单片机之数码管显示表白数字篇

朝菌不知晦朔 蟪蛄不知春秋 眼界决定境界 CSDN 请求进入专栏 是否进入《51单片机专栏》? 确定 目录 数码管的简介 数码管引脚定义 数码管的原理图 74HC245 代码实现 静态数码管的显示 动态数码管的显示 数码管实现表白画面 数码管的简介 L…

【Unity】重力场中的路径预测方法

前言 笔者前些天参加完了一场72小时的GameJam游戏开发比赛。这次比赛的主题是“探索”,笔者做了一个名为《探索者号》的探索宇宙的游戏(游戏名一开始叫做《星际拾荒者》,但这不重要)。 在开发过程中,笔者遇到了一些问…

2 月 7 日算法练习- 数据结构-并查集

并查集 并查集是一种图形数据结构,用于存储图中结点的连通关系。 每个结点有一个父亲,可以理解为“一只伸出去的手”,会指向另外一个点,初始时指向自己。 一个点的根节点是该点的父亲的父亲的的父亲,直到某个点的父亲…

探索NLP中的N-grams:理解,应用与优化

简介 n-gram[1] 是文本文档中 n 个连续项目的集合,其中可能包括单词、数字、符号和标点符号。 N-gram 模型在许多与单词序列相关的文本分析应用中非常有用,例如情感分析、文本分类和文本生成。 N-gram 建模是用于将文本从非结构化格式转换为结构化格式的…

Elasticsearch(四)

是这样的前面的几篇笔记,感觉对我没有形成知识体系,感觉乱糟糟的,只是大概的了解了一些基础知识,仅此而已,而且对于这技术栈的学习也是为了在后面的java开发使用,但是这里的API学的感觉有点乱!然…

[VulnHub靶机渗透] dpwwn: 1

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…

接口测试--参数实现MD5加密签名规则

最近有个测试接口需求,接口有签名检查,签名规范为将所有请求参数按照key字典排序并连接起来进行md5加密,格式是:md5(bar2&baz3&foo1),得到签名,将签名追加到参数末尾。由于需要对参数进行动态加密并且做压力测…

有道ai写作,突破免费限制,无限制使用

预览效果 文末提供源码包及apk下载地址有道ai写作python版 import hashlib import time import json import ssl import base64 import uuidfrom urllib.parse import quote import requests from requests_toolbelt.multipart.encoder import MultipartEncoder from Crypto.C…

11 串口发送应用之使用状态机实现多字节数据发送

1. 使用串口发送5个字节数据到电脑 uart协议规定,发送的数据位只能是6,7,8位,如果数据位不符合,接收者接收不到数据。所以我们需要将40位数据data分为5个字节数据分别发送,那么接收者就能通过uart协议接收…

Mobile ALOHA 2: An Enhanced Low-Cost Hardware for Bimanual Teleoperation

文章目录 1. Mobile ALOHA 11.1 项目地址 2. Mobile ALOHA 22.1 相关链接2.2 Whats upgraded in II ? Reference Stanford 最新家务机器人 1. Mobile ALOHA 1 Mobile ALOHA: Learning Bimanual Mobile Manipulation with Low-Cost Whole-Body Teleoperation 1.1 项目地址 htt…

CoreSight学习笔记

文章目录 1 Components1.1 ROM Table 2 使用场景2.1 Debug Monitor中断2.1.1 参考资料 2.2 Programming the cross halt2.2.1 编程实现2.2.2 参考资料 2.3 CTI中断2.3.1 编程实现2.3.1.1 准备工作2.3.1.2 触发中断2.3.1.3 中断响应 2.3.2 参考资料 1 Components 1.1 ROM Table…

力扣热门100题 - 4.寻找两个正序数组的中位数

力扣热门100题 - 4.寻找两个正序数组的中位数 题目描述:示例:提示:解题思路:代码: 题目链接:4.寻找两个正序数组的中位数 题目描述: 给定两个大小分别为 m 和 n 的正序(从小到大&a…

【golang】23、gorilla websocket 源码:examples、数据结构、流程

文章目录 一、examples1.1 echo1.1.1 server.go1.1.2 client.go 1.2 command1.2.1 功能和启动方式1.2.2 home.html1.2.3 main.go 1.3 filewatch1.3.1 html1.3.2 serveHome 渲染模板1.3.3 serveWs1.3.4 writer() 1.4 buffer pool1.4.1 server1.4.2 client 1.5 chat1.5.1 server1…

掌握虚拟化与网络配置之道:深入浅出VMware及远程管理技巧

目录 虚拟机介绍 虚拟机的关键字 服务器架构的发展 为什么用虚拟机VMware 虚拟机和阿里云的区别 功能角度 价格因素 应用场景 优势方面 找到windows的服务管理 配置VMware 关于VMware安装的几个服务 vmware如何修改各种网络配置 关于NAT的详细信息(了解) NAT(网…

【芯片设计- RTL 数字逻辑设计入门 11 -- 移位运算与乘法】

请阅读【嵌入式开发学习必备专栏 】 文章目录 移位运算与乘法Verilog Codeverilog 拼接运算符({})Testbench CodeVCS 波形仿真 问题小结 移位运算与乘法 已知d为一个8位数,请在每个时钟周期分别输出该数乘1/3/7/8,并输出一个信号通知此时刻输…

LLaMA 入门指南

LLaMA 入门指南 LLaMA 入门指南LLaMA的简介LLaMA模型的主要结构Transformer架构多层自注意力层前馈神经网络Layer Normalization和残差连接 LLaMA模型的变体Base版本Large版本Extra-Large版本 LLaMA模型的特点大规模数据训练 LLaMA模型常用数据集介绍公共数据来源已知的数据集案…