Netty 组件学习

news2024/9/23 11:19:49

Netty 组件学习

      • Netty 各个组件通俗理解
      • EventLoop
      • EventLoopGroup
        • 关闭
      • Channel
      • Future & Promise
      • Handler & Pipeline
      • ByteBuf
        • 创建
        • 直接内存和堆内存
        • 池化和非池化
        • 组成
        • 方法
        • 扩容机制
        • 读取
        • retain和release方法

Netty 各个组件通俗理解

Channel即数据通道

Msg是数据,传输时是ByteBuf,通过pipeline加工后可以解码为其他类型对象

Handler是数据的处理工序,Handler合在一起便是pipeline

Handler分为Inbound和Outbound两种

EventLoop是处理数据的工人

绑定:EventLoop负责了某个Channel的工作后,应负责到底

工人既可以执行IO操作,也可以进行业务处理

工人按照pipeline的顺序,依次按照Handler的规划处理数据,可以为每道工序指定不同工人

EventLoop

  • 继承自ScheduledExecutorService,包含线程池的所有方法
  • 继承自OrderedEventExecutor,inEventLoop(thread)方法可以查看该线程是否属于eventLoop,parent 方法可以查看自己属于哪个EventLoopGroup

维护了一个Selector的单线程执行器

一旦建立连接,Channel会和一个EventLoop绑定,后续所有请求都会由一个EventLoop发送

EventLoopGroup

继承自EventExecutorGroup,实现了Iterable 接口提供遍历EventLoop的能力,next 方法获取下一个EventLoop

设置boss和worker两个EventLoopGroup,boss负责ServerSocketChannel上的accept事件,worker负责socketChannel上的读写

关闭

使用shutdownGracefully方法优雅地关闭EventLoopGroup,该方法会使EventLoopGroup先切换到关闭状态,拒绝新任务的加入,然后等待任务队列中的任务全部执行完毕后,再停止线程的运行。

Channel

  • close方法 关闭Channel
  • closeFuture 处理Channel的关闭 带有 Future,Promise 的类型都是和异步方法配套使用,用来处理结果
    • sync 同步等待Channel的关闭
    • addListener 异步等待Channel的关闭
  • pipeline 方法添加处理器
  • write 写入数据
  • writeAndFlush 将数据写入并刷出

Future & Promise

  • JDK Future
    • cancel 取消任务
    • isCanceled 任务是否已被取消
    • isDone 任务是否完成(只知道是否完成,不知道是否执行成功)
    • get 获取任务结果,阻塞等待
  • Netty Future 继承自JDK Future
    • getNow 获取任务结果,非阻塞,未产生结果时返回Null
    • await 等待任务结束
    • sync 等待任务结束,若任务失败抛出异常
    • isSuccess 判断任务是否成功
    • cause 获取失败信息,非阻塞,若任务没失败则返回null
    • addListener 添加回调,异步接收结果
  • Promise 扩展了 Netty Future
    • setSuccess 设置成功结果
    • setFailure 设置失败结果

Handler & Pipeline

Pipeline 的 addLast 方法可以添加处理器

ChannelHandler 分为入站、出站两种

  • 入站处理器一般都是 ChannelInboundHandlerAdapter 的子类,用于读取接收的数据

  • 出站处理器一般都是 ChannelOutboundHandlerAdapter 的子类,用于对发送的数据进行加工

  • ctx.fireChannelRead(msg)方法(即super.channelRead(ctx, name)) 调用下一个入站处理器

  • ctx.channel().write(msg) 方法 从尾部开始触发出站处理器

  • ctx.write(msg, promise) 方法 触发上一个出站处理器

ByteBuf

(对字节数据的封装)

创建

初始容量为10

ByteBuf buffer = ByteBufAllocator.DEFAULT.buffer(10);

直接内存和堆内存

创建池化基于堆的 ByteBuf

ByteBuf buffer = ByteBufAllocator.DEFAULT.heapBuffer(10);

创建池化基于直接内存的 ByteBuf

ByteBuf buffer = ByteBufAllocator.DEFAULT.directBuffer(10);
  • 直接内存创建和销毁代价高,但读写性能好,适合配合池化使用
  • 直接内存对GC压力小,不受JVM垃圾回收的管理,应注意手动释放

池化和非池化

Netty 4.1 以后,非Android平台默认开启池化,也可以通过以下系统变量进行设置

-Dio.netty.allocator.type={unpooled|pooled}

优点:有了池化可以重用ByteBuf实例,可以提升效率,同时在高并发场景中更节约内存,减少内存溢出的可能

组成

image-20230212113410164

方法

writeXXX

默认Big Endian,即 0x250,写入后 00 00 02 50

writeIntLE(int value)方法 Little Endian写入 int 值,即 0x250,写入后 50 02 00 00

扩容机制

  • 如果写入后数据大小未超过512,则扩容后capacity是下一个16的整数倍。
  • 如果写入后数据大小超过512,则扩容后capacity是下一个2n
  • 若扩容超过max capacity,会报错。

读取

ByteBuf读过的部分会被废弃,再读只能读到未读取的部分

若要重复读取,应在read前先做个标记mark

buffer.markReaderIndex();

调用read方法后,使用resetReaderIndex方法可以将读指针重置到标志位置

buffer.resetReaderIndex();

retain和release方法

Netty采用引用计数法来控制回收内存

  • 每个ByteBuf初始计数为1
  • 调用release方法计数减1,调用retain方法计数加1
  • 计数为0时,底层内存被回收

最后使用者负责release

入站处理规则:

  • 将ByteBuf转换为其他类型的Java对象后,ByteBuf没用了的时候必须release
  • 如果不需要调用 ctx.fireChannelRead(msg) 向后传递时,必须release
  • 如果因为异常导致ByteBuf没有传递到下一个Handler,必须release
  • 若消息一直向后传递,会由TailContext负责释放未处理信息

出站处理规则:

  • 由HeadContext flush后release

异常处理规则:

  • 不清楚ByteBuf被引用多少次时,可以循环调用 release 直到返回 true

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

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

相关文章

对KMP简单的理解

声明:下边的例子均表示下标从1开始的数组 ne数组的定义: next[i] 就是使子串 s[1…i] 有最长相等前后缀的前缀的最后一位的下标。ne[i]也可以表示相等子串的长度 准备执行jne[j]时, 表示当前s[i]!p[j1] , 如果ne[j]1 ,那么下…

Dubbo和Zookeeper集成分布式系统快速入门

文件结构 代码部分 1、新建provider-server导入pom依赖 <dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>2.7.3</version></dependency><dependency>&l…

golang的web框架Gin(一)---Gin的安装与初体验

简介 1.1 介绍 Go世界里最流行的Web框架&#xff0c;Github上有32Kstar。 基于httprouter开发的Web框架。 中文文档齐全&#xff0c;简单易用的轻量级框架。 Gin是一个golang的微框架&#xff0c;封装比较优雅&#xff0c;API友好&#xff0c;源码注释比较明确&#xff0c;具有…

C++模板初阶

C模板初阶泛型编程函数模板概念函数模板格式函数模板原理函数模板的实例化模板参数的匹配原则类模板类模板的定义格式类模板的实例化泛型编程 我们前面学习了C的函数重载功能&#xff0c;那么我们如何实现一个通用的交换函数呢&#xff0c;比如:我传入int就是交换int&#xff…

JavaSE XML语法规则和文档约束介绍

文章目录XMLXML基本介绍XML创建和语法规则XML文档约束认识文档约束DTD约束(了解)schema约束(了解)XML XML基本介绍 XML概述: XML是可扩展标记语言&#xff08;eXtensible Markup Language&#xff09;的缩写&#xff0c;它是一种可以自定义数据的表示格式&#xff0c;可以描述…

【mysql数据库】

目录SQL数据库分页聚合函数表跟表之间的关联关系SQL中怎么将行转成列SQL注入将一张表的部分数据更新到另一张表WHERE和HAVING的区别索引索引分类如何创建及保存MySQL的索引&#xff1f;怎么判断要不要加索引&#xff1f;索引设计原理只要创建了索引&#xff0c;就一定会走索引吗…

ESP-01S通过AT指令上报数据到阿里云物模型

ESP-01S使用AT指令上报数据到阿里云物模型 上篇文章介绍了如何用AT指令连接阿里云并进行通信&#xff1a;https://blog.csdn.net/weixin_46251230/article/details/128995530 但最终需要将传感器数据上报到云平台显示&#xff0c;所以需要建立阿里云物模型 阿里云平台建立物…

代码随想录第62天(单调栈):● 739. 每日温度 ● 496.下一个更大元素 I

今天开启单调栈的篇章&#xff0c;一般什么时候采用单调栈&#xff1f;通常是一维数组&#xff0c;要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置。 一、每日温度 题目描述&#xff1a; 思路和想法&#xff1a; 这里单调栈里只放数组下标&#xff0c;再了…

删除Android Studio中重复的JDK配置

问题 可能因为一些不经意的操作&#xff0c;导致如下这种情况&#xff1a;出现多余重复的JDK路径配置&#xff0c;其实指向的是同一个路径。 强迫症犯了之后&#xff0c;就会想怎么干掉这个&#xff08;2&#xff09;。 解决 第一步&#xff1a;先打开你最近打开的项目&…

开篇之作——闲聊几句AUTOSAR(2)

开篇之作——闲聊几句AUTOSAR 我是穿拖鞋的汉子,魔都中坚持长期主义的工科男! 在上一篇文章中主要介绍了啥是AUTOSAR,AUTOSAR要干点啥,以及AUTOSAR的发展历史。接下来在本文中将继续介绍: -> AUTOSAR的合作伙伴关系; -> 组织架构; -> 基础标准规范。 言归正…

微信公众号网页在本地开发模式下如何使用正式环境的域名来调试

微信公众号网页在本地开发模式下如何使用正式环境的域名来调试&#xff1f; 鄙人之前也不知道&#xff0c;网上搜了一下&#xff0c;看到的几篇文章都是要使用代理&#xff0c;有用Nginx的&#xff0c;还有自己写代理的。主要是按照步骤做了并不行。于是自己折腾了一下&#x…

缓存中间件Caffeine超详细源码解读

读源码是一件非常复杂、困难、枯燥的过程&#xff0c;这个复杂过程我给大家踩了&#xff0c;各位看官躺平看就行啦初始化入口&#xff1a;//典型的工厂模式&#xff0c;初始化一个caffeine对象 Caffeine.newBuilder();CheckReturnValue public static Caffeine<Object, Obje…

(考研湖科大教书匠计算机网络)第四章网络层-第三节1:IPv4地址概述

获取pdf&#xff1a;密码7281专栏目录首页&#xff1a;【专栏必读】考研湖科大教书匠计算机网络笔记导航 文章目录一&#xff1a;IPv4地址概述二&#xff1a;IPv4地址表示方法&#xff08;1&#xff09;概述&#xff08;2&#xff09;8位无符号二进制数转十进制正整数&#xff…

大数据工具Maxwell的使用

1.Maxwell简介 Maxwell 是由美国Zendesk公司开源&#xff0c;用Java编写的MySQL变更数据抓取软件。它会实时监控Mysql数据库的数据变更操作&#xff08;包括insert、update、delete&#xff09;&#xff0c;并将变更数据以 JSON 格式发送给 Kafka、Kinesi等流数据处理平台。 官…

Elasticsearch7.8.0版本进阶——路由计算

目录一、路由计算1.1、路由计算的前提理解1.2、路由计算的概述1.3、路由计算的概述一、路由计算 1.1、路由计算的前提理解 当索引一个文档的时候&#xff0c;文档会被存储到一个主分片中。Elasticsearch 如何知道一个文档应该存放到哪个分片中呢&#xff1f;当我们创建文档时…

mycat连接mysql 简单配置

mycat三个配置文件位于conf下 可通过Notepad操作 首先配置service.xml中的user标签&#xff0c;设置用户名&#xff0c;密码&#xff0c;查询权限&#xff0c;是否只读等 只是设置了root用户&#xff0c;有所有权限 配置schema.xml <?xml version"1.0"?&g…

FPGA开发软件(vivado + modelsim)环境搭建(附详细步骤)

本文详细介绍了vivado软件和modelsim软件的安装&#xff0c;以及vivado中配置modelsim仿真设置&#xff0c;每一步都加文字说明和图片。一、软件安装包下载1、vivado vivado版本很多&#xff0c;目前最新的已更新到vivado2022.2&#xff0c;版本越高&#xff0c;安装包越大&…

PTA甲级-1010 Radix c++

文章目录Input Specification:Output Specification:Sample Input 1:Sample Output 1:Sample Input 2:Sample Output 2:一、题干大意![在这里插入图片描述](https://img-blog.csdnimg.cn/68d84d3ea86e4aaab002152ae8472e05.png#pic_center)二、题解要点三、具体实现总结Given a…

【呕心沥血】整理全栈自动化测试技术(三):如何编写技术方案

前面两篇笔记我介绍了自动化测试前期调研注意事项和前置准备阶段切入点&#xff0c;有同学在后台提问&#xff1a; “做完前期的调研和准备工作&#xff0c;领导要求写一个落地方案并评审&#xff0c;自动化测试的落地方案该怎么写”&#xff1f; 首先这个要求我觉得挺正常&a…

2023.02.12 学习周报

文章目录摘要文献阅读1.题目2.摘要3.介绍4.本文贡献5.相关工作5.1 Temporal Recommendation5.2 Sequential Recommendation6.方法6.1 Problem Formulation6.2 Input Embedding6.3 Self-Attention Structure6.4 Model Training7.实验7.1 数据集7.2 实验结果7.3 多时间嵌入的效果…